blob: c10fa2f19dcdacd49d151ce7fe7a8fc20d728278 [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 Gebben082a9832021-10-28 13:40:11 -0600175 Add(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) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600179 Destroy<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -0600180}
181
182void ValidationStateTracker::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
183 VkImageLayout imageLayout, const VkClearColorValue *pColor,
184 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600185 if (disabled[command_buffer_state]) return;
186
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600187 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600188 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600189 cb_node->RecordTransferCmd(CMD_CLEARCOLORIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600190 }
191}
192
193void ValidationStateTracker::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
194 VkImageLayout imageLayout,
195 const VkClearDepthStencilValue *pDepthStencil,
196 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600197 if (disabled[command_buffer_state]) return;
198
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600199 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600200 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600201 cb_node->RecordTransferCmd(CMD_CLEARDEPTHSTENCILIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600202 }
203}
204
205void ValidationStateTracker::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
206 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
207 uint32_t regionCount, const VkImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600208 if (disabled[command_buffer_state]) return;
209
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600210 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600211 cb_node->RecordTransferCmd(CMD_COPYIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600212}
213
Jeff Leger178b1e52020-10-05 12:22:23 -0400214void ValidationStateTracker::PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
215 const VkCopyImageInfo2KHR *pCopyImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600216 if (disabled[command_buffer_state]) return;
217
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600218 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600219 cb_node->RecordTransferCmd(CMD_COPYIMAGE2KHR, Get<IMAGE_STATE>(pCopyImageInfo->srcImage),
220 Get<IMAGE_STATE>(pCopyImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400221}
222
locke-lunargd556cc32019-09-17 01:21:23 -0600223void ValidationStateTracker::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
224 VkImageLayout srcImageLayout, VkImage dstImage,
225 VkImageLayout dstImageLayout, uint32_t regionCount,
226 const VkImageResolve *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600227 if (disabled[command_buffer_state]) return;
228
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600229 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600230 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600231}
232
Jeff Leger178b1e52020-10-05 12:22:23 -0400233void ValidationStateTracker::PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
234 const VkResolveImageInfo2KHR *pResolveImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600235 if (disabled[command_buffer_state]) return;
236
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600237 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600238 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2KHR, Get<IMAGE_STATE>(pResolveImageInfo->srcImage),
239 Get<IMAGE_STATE>(pResolveImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400240}
241
locke-lunargd556cc32019-09-17 01:21:23 -0600242void ValidationStateTracker::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
243 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
244 uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600245 if (disabled[command_buffer_state]) return;
246
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600247 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600248 cb_node->RecordTransferCmd(CMD_BLITIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600249}
250
Jeff Leger178b1e52020-10-05 12:22:23 -0400251void ValidationStateTracker::PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
252 const VkBlitImageInfo2KHR *pBlitImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600253 if (disabled[command_buffer_state]) return;
254
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600255 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600256 cb_node->RecordTransferCmd(CMD_BLITIMAGE2KHR, Get<IMAGE_STATE>(pBlitImageInfo->srcImage),
257 Get<IMAGE_STATE>(pBlitImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400258}
259
locke-lunargd556cc32019-09-17 01:21:23 -0600260void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
261 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
262 VkResult result) {
263 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600264
Jeremy Gebbenc8937b62021-09-24 15:50:56 -0600265 auto buffer_state = std::make_shared<BUFFER_STATE>(this, *pBuffer, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600266
James Rumble2f6e7bb2021-07-13 15:21:20 +0100267 if (pCreateInfo) {
268 const auto *opaque_capture_address = LvlFindInChain<VkBufferOpaqueCaptureAddressCreateInfo>(pCreateInfo->pNext);
269 if (opaque_capture_address) {
270 // address is used for GPU-AV and ray tracing buffer validation
271 buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
272 buffer_address_map_.emplace(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
273 }
274 }
Jeremy Gebben082a9832021-10-28 13:40:11 -0600275 Add(std::move(buffer_state));
locke-lunargd556cc32019-09-17 01:21:23 -0600276}
277
278void ValidationStateTracker::PostCallRecordCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
279 const VkAllocationCallbacks *pAllocator, VkBufferView *pView,
280 VkResult result) {
281 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600282
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600283 auto buffer_state = GetShared<BUFFER_STATE>(pCreateInfo->buffer);
locke-lunarg25b6c352020-08-06 17:44:18 -0600284
285 VkFormatProperties format_properties;
286 DispatchGetPhysicalDeviceFormatProperties(physical_device, pCreateInfo->format, &format_properties);
locke-lunarg25b6c352020-08-06 17:44:18 -0600287
Jeremy Gebben082a9832021-10-28 13:40:11 -0600288 Add(std::make_shared<BUFFER_VIEW_STATE>(buffer_state, *pView, pCreateInfo, format_properties.bufferFeatures));
locke-lunargd556cc32019-09-17 01:21:23 -0600289}
290
291void ValidationStateTracker::PostCallRecordCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
292 const VkAllocationCallbacks *pAllocator, VkImageView *pView,
293 VkResult result) {
294 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600295 auto image_state = GetShared<IMAGE_STATE>(pCreateInfo->image);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700296
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600297 VkFormatFeatureFlags format_features = 0;
298 if (image_state->HasAHBFormat() == true) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700299 // The ImageView uses same Image's format feature since they share same AHB
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600300 format_features = image_state->format_features;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700301 } else {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600302 format_features = GetImageFormatFeatures(physical_device, device, image_state->image(), pCreateInfo->format,
303 image_state->createInfo.tiling);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700304 }
305
locke-lunarg9939d4b2020-10-26 20:11:08 -0600306 // 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 -0600307 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600308 if (IsExtEnabled(device_extensions.vk_ext_filter_cubic)) {
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700309 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600310 imageview_format_info.imageViewType = pCreateInfo->viewType;
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700311 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600312 image_format_info.type = image_state->createInfo.imageType;
313 image_format_info.format = image_state->createInfo.format;
314 image_format_info.tiling = image_state->createInfo.tiling;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600315 auto usage_create_info = LvlFindInChain<VkImageViewUsageCreateInfo>(pCreateInfo->pNext);
316 image_format_info.usage = usage_create_info ? usage_create_info->usage : image_state->createInfo.usage;
locke-lunarg9939d4b2020-10-26 20:11:08 -0600317 image_format_info.flags = image_state->createInfo.flags;
318
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600319 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600320
321 DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
322 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600323
Jeremy Gebben082a9832021-10-28 13:40:11 -0600324 Add(std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo, format_features, filter_cubic_props));
locke-lunargd556cc32019-09-17 01:21:23 -0600325}
326
327void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
328 uint32_t regionCount, const VkBufferCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600329 if (disabled[command_buffer_state]) return;
330
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600331 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600332 cb_node->RecordTransferCmd(CMD_COPYBUFFER, Get<BUFFER_STATE>(srcBuffer), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600333}
334
Jeff Leger178b1e52020-10-05 12:22:23 -0400335void ValidationStateTracker::PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600336 const VkCopyBufferInfo2KHR *pCopyBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600337 if (disabled[command_buffer_state]) return;
338
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600339 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600340 cb_node->RecordTransferCmd(CMD_COPYBUFFER2KHR, Get<BUFFER_STATE>(pCopyBufferInfo->srcBuffer),
341 Get<BUFFER_STATE>(pCopyBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400342}
343
locke-lunargd556cc32019-09-17 01:21:23 -0600344void ValidationStateTracker::PreCallRecordDestroyImageView(VkDevice device, VkImageView imageView,
345 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600346 Destroy<IMAGE_VIEW_STATE>(imageView);
locke-lunargd556cc32019-09-17 01:21:23 -0600347}
348
349void ValidationStateTracker::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600350 Destroy<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600351}
352
353void ValidationStateTracker::PreCallRecordDestroyBufferView(VkDevice device, VkBufferView bufferView,
354 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600355 Destroy<BUFFER_VIEW_STATE>(bufferView);
locke-lunargd556cc32019-09-17 01:21:23 -0600356}
357
358void ValidationStateTracker::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
359 VkDeviceSize size, uint32_t data) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600360 if (disabled[command_buffer_state]) return;
361
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600362 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600363 cb_node->RecordTransferCmd(CMD_FILLBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600364}
365
366void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
367 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
368 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600369 if (disabled[command_buffer_state]) return;
370
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600371 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600372
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600373 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER, Get<IMAGE_STATE>(srcImage), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600374}
375
Jeff Leger178b1e52020-10-05 12:22:23 -0400376void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
377 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600378 if (disabled[command_buffer_state]) return;
379
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600380 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600381 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2KHR, Get<IMAGE_STATE>(pCopyImageToBufferInfo->srcImage),
382 Get<BUFFER_STATE>(pCopyImageToBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400383}
384
locke-lunargd556cc32019-09-17 01:21:23 -0600385void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
386 VkImageLayout dstImageLayout, uint32_t regionCount,
387 const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600388 if (disabled[command_buffer_state]) return;
389
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600390 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600391 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE, Get<BUFFER_STATE>(srcBuffer), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600392}
393
Jeff Leger178b1e52020-10-05 12:22:23 -0400394void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
395 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600396 if (disabled[command_buffer_state]) return;
397
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600398 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600399 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2KHR, Get<BUFFER_STATE>(pCopyBufferToImageInfo->srcBuffer),
400 Get<IMAGE_STATE>(pCopyBufferToImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400401}
402
sfricke-samsungbf1a2ed2020-06-14 23:31:00 -0700403// Gets union of all features defined by Potential Format Features
404// 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 -0700405VkFormatFeatureFlags ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
406 VkFormatFeatureFlags format_features = 0;
407
408 if (format != VK_FORMAT_UNDEFINED) {
409 VkFormatProperties format_properties;
410 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
411 format_features |= format_properties.linearTilingFeatures;
412 format_features |= format_properties.optimalTilingFeatures;
sfricke-samsung45996a42021-09-16 13:45:27 -0700413 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700414 // VK_KHR_get_physical_device_properties2 is required in this case
415 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2};
416 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
417 nullptr};
418 format_properties_2.pNext = (void *)&drm_properties_list;
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100419
420 // First call is to get the number of modifiers compatible with the queried format
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700421 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100422
423 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
424 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
425 drm_properties_list.pDrmFormatModifierProperties = drm_properties.data();
426
427 // Second call, now with an allocated array in pDrmFormatModifierProperties, is to get the modifiers
428 // compatible with the queried format
429 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
430
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700431 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
432 format_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
433 }
434 }
435 }
436
437 return format_features;
438}
439
locke-lunargd556cc32019-09-17 01:21:23 -0600440void ValidationStateTracker::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
441 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
442 VkResult result) {
443 if (VK_SUCCESS != result) return;
444
Locke Linf3873542021-04-26 11:25:10 -0600445 ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
446 ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, this->container_type);
447 ValidationStateTracker *state_tracker = static_cast<ValidationStateTracker *>(validation_data);
448
locke-lunargd556cc32019-09-17 01:21:23 -0600449 const VkPhysicalDeviceFeatures *enabled_features_found = pCreateInfo->pEnabledFeatures;
450 if (nullptr == enabled_features_found) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700451 const auto *features2 = LvlFindInChain<VkPhysicalDeviceFeatures2>(pCreateInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600452 if (features2) {
453 enabled_features_found = &(features2->features);
454 }
455 }
456
locke-lunargd556cc32019-09-17 01:21:23 -0600457 if (nullptr == enabled_features_found) {
458 state_tracker->enabled_features.core = {};
459 } else {
460 state_tracker->enabled_features.core = *enabled_features_found;
461 }
462
locke-lunargd556cc32019-09-17 01:21:23 -0600463 // Save local link to this device's physical device state
Jeremy Gebben383b9a32021-09-08 16:31:33 -0600464 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu);
locke-lunargd556cc32019-09-17 01:21:23 -0600465
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700466 const auto *vulkan_12_features = LvlFindInChain<VkPhysicalDeviceVulkan12Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700467 if (vulkan_12_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700468 state_tracker->enabled_features.core12 = *vulkan_12_features;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700469 } else {
sfricke-samsung27c70722020-05-02 08:42:39 -0700470 // Set Extension Feature Aliases to false as there is no struct to check
471 state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
472 state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
473 state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
474 state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
475 state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
476 state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800477 state_tracker->enabled_features.core12.subgroupBroadcastDynamicId = VK_FALSE;
sfricke-samsung27c70722020-05-02 08:42:39 -0700478
479 // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700480
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700481 const auto *eight_bit_storage_features = LvlFindInChain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700482 if (eight_bit_storage_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700483 state_tracker->enabled_features.core12.storageBuffer8BitAccess = eight_bit_storage_features->storageBuffer8BitAccess;
484 state_tracker->enabled_features.core12.uniformAndStorageBuffer8BitAccess =
485 eight_bit_storage_features->uniformAndStorageBuffer8BitAccess;
486 state_tracker->enabled_features.core12.storagePushConstant8 = eight_bit_storage_features->storagePushConstant8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700487 }
488
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700489 const auto *float16_int8_features = LvlFindInChain<VkPhysicalDeviceShaderFloat16Int8Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700490 if (float16_int8_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700491 state_tracker->enabled_features.core12.shaderFloat16 = float16_int8_features->shaderFloat16;
492 state_tracker->enabled_features.core12.shaderInt8 = float16_int8_features->shaderInt8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700493 }
494
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700495 const auto *descriptor_indexing_features = LvlFindInChain<VkPhysicalDeviceDescriptorIndexingFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700496 if (descriptor_indexing_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700497 state_tracker->enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing =
498 descriptor_indexing_features->shaderInputAttachmentArrayDynamicIndexing;
499 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing =
500 descriptor_indexing_features->shaderUniformTexelBufferArrayDynamicIndexing;
501 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing =
502 descriptor_indexing_features->shaderStorageTexelBufferArrayDynamicIndexing;
503 state_tracker->enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing =
504 descriptor_indexing_features->shaderUniformBufferArrayNonUniformIndexing;
505 state_tracker->enabled_features.core12.shaderSampledImageArrayNonUniformIndexing =
506 descriptor_indexing_features->shaderSampledImageArrayNonUniformIndexing;
507 state_tracker->enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing =
508 descriptor_indexing_features->shaderStorageBufferArrayNonUniformIndexing;
509 state_tracker->enabled_features.core12.shaderStorageImageArrayNonUniformIndexing =
510 descriptor_indexing_features->shaderStorageImageArrayNonUniformIndexing;
511 state_tracker->enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing =
512 descriptor_indexing_features->shaderInputAttachmentArrayNonUniformIndexing;
513 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing =
514 descriptor_indexing_features->shaderUniformTexelBufferArrayNonUniformIndexing;
515 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing =
516 descriptor_indexing_features->shaderStorageTexelBufferArrayNonUniformIndexing;
517 state_tracker->enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind =
518 descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind;
519 state_tracker->enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind =
520 descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind;
521 state_tracker->enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind =
522 descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind;
523 state_tracker->enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind =
524 descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind;
525 state_tracker->enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind =
526 descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind;
527 state_tracker->enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind =
528 descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind;
529 state_tracker->enabled_features.core12.descriptorBindingUpdateUnusedWhilePending =
530 descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending;
531 state_tracker->enabled_features.core12.descriptorBindingPartiallyBound =
532 descriptor_indexing_features->descriptorBindingPartiallyBound;
533 state_tracker->enabled_features.core12.descriptorBindingVariableDescriptorCount =
534 descriptor_indexing_features->descriptorBindingVariableDescriptorCount;
535 state_tracker->enabled_features.core12.runtimeDescriptorArray = descriptor_indexing_features->runtimeDescriptorArray;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700536 }
537
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700538 const auto *scalar_block_layout_features = LvlFindInChain<VkPhysicalDeviceScalarBlockLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700539 if (scalar_block_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700540 state_tracker->enabled_features.core12.scalarBlockLayout = scalar_block_layout_features->scalarBlockLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700541 }
542
543 const auto *imageless_framebuffer_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700544 LvlFindInChain<VkPhysicalDeviceImagelessFramebufferFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700545 if (imageless_framebuffer_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700546 state_tracker->enabled_features.core12.imagelessFramebuffer = imageless_framebuffer_features->imagelessFramebuffer;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700547 }
548
549 const auto *uniform_buffer_standard_layout_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700550 LvlFindInChain<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700551 if (uniform_buffer_standard_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700552 state_tracker->enabled_features.core12.uniformBufferStandardLayout =
553 uniform_buffer_standard_layout_features->uniformBufferStandardLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700554 }
555
556 const auto *subgroup_extended_types_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700557 LvlFindInChain<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700558 if (subgroup_extended_types_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700559 state_tracker->enabled_features.core12.shaderSubgroupExtendedTypes =
560 subgroup_extended_types_features->shaderSubgroupExtendedTypes;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700561 }
562
563 const auto *separate_depth_stencil_layouts_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700564 LvlFindInChain<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700565 if (separate_depth_stencil_layouts_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700566 state_tracker->enabled_features.core12.separateDepthStencilLayouts =
567 separate_depth_stencil_layouts_features->separateDepthStencilLayouts;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700568 }
569
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700570 const auto *host_query_reset_features = LvlFindInChain<VkPhysicalDeviceHostQueryResetFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700571 if (host_query_reset_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700572 state_tracker->enabled_features.core12.hostQueryReset = host_query_reset_features->hostQueryReset;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700573 }
574
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700575 const auto *timeline_semaphore_features = LvlFindInChain<VkPhysicalDeviceTimelineSemaphoreFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700576 if (timeline_semaphore_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700577 state_tracker->enabled_features.core12.timelineSemaphore = timeline_semaphore_features->timelineSemaphore;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700578 }
579
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700580 const auto *buffer_device_address = LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700581 if (buffer_device_address) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700582 state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address->bufferDeviceAddress;
583 state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
584 buffer_device_address->bufferDeviceAddressCaptureReplay;
585 state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
586 buffer_device_address->bufferDeviceAddressMultiDevice;
587 }
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800588
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700589 const auto *atomic_int64_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicInt64Features>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800590 if (atomic_int64_features) {
591 state_tracker->enabled_features.core12.shaderBufferInt64Atomics = atomic_int64_features->shaderBufferInt64Atomics;
592 state_tracker->enabled_features.core12.shaderSharedInt64Atomics = atomic_int64_features->shaderSharedInt64Atomics;
593 }
594
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700595 const auto *memory_model_features = LvlFindInChain<VkPhysicalDeviceVulkanMemoryModelFeatures>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800596 if (memory_model_features) {
597 state_tracker->enabled_features.core12.vulkanMemoryModel = memory_model_features->vulkanMemoryModel;
598 state_tracker->enabled_features.core12.vulkanMemoryModelDeviceScope =
599 memory_model_features->vulkanMemoryModelDeviceScope;
600 state_tracker->enabled_features.core12.vulkanMemoryModelAvailabilityVisibilityChains =
601 memory_model_features->vulkanMemoryModelAvailabilityVisibilityChains;
602 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700603 }
604
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700605 const auto *vulkan_11_features = LvlFindInChain<VkPhysicalDeviceVulkan11Features>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700606 if (vulkan_11_features) {
607 state_tracker->enabled_features.core11 = *vulkan_11_features;
608 } else {
sfricke-samsung828e59d2021-08-22 23:20:49 -0700609 // These structs are only allowed in pNext chain if there is no vkPhysicalDeviceVulkan11Features
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700610
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700611 const auto *sixteen_bit_storage_features = LvlFindInChain<VkPhysicalDevice16BitStorageFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700612 if (sixteen_bit_storage_features) {
613 state_tracker->enabled_features.core11.storageBuffer16BitAccess =
614 sixteen_bit_storage_features->storageBuffer16BitAccess;
615 state_tracker->enabled_features.core11.uniformAndStorageBuffer16BitAccess =
616 sixteen_bit_storage_features->uniformAndStorageBuffer16BitAccess;
617 state_tracker->enabled_features.core11.storagePushConstant16 = sixteen_bit_storage_features->storagePushConstant16;
618 state_tracker->enabled_features.core11.storageInputOutput16 = sixteen_bit_storage_features->storageInputOutput16;
619 }
620
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700621 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700622 if (multiview_features) {
623 state_tracker->enabled_features.core11.multiview = multiview_features->multiview;
624 state_tracker->enabled_features.core11.multiviewGeometryShader = multiview_features->multiviewGeometryShader;
625 state_tracker->enabled_features.core11.multiviewTessellationShader = multiview_features->multiviewTessellationShader;
626 }
627
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700628 const auto *variable_pointers_features = LvlFindInChain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700629 if (variable_pointers_features) {
630 state_tracker->enabled_features.core11.variablePointersStorageBuffer =
631 variable_pointers_features->variablePointersStorageBuffer;
632 state_tracker->enabled_features.core11.variablePointers = variable_pointers_features->variablePointers;
633 }
634
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700635 const auto *protected_memory_features = LvlFindInChain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700636 if (protected_memory_features) {
637 state_tracker->enabled_features.core11.protectedMemory = protected_memory_features->protectedMemory;
638 }
639
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700640 const auto *ycbcr_conversion_features = LvlFindInChain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700641 if (ycbcr_conversion_features) {
642 state_tracker->enabled_features.core11.samplerYcbcrConversion = ycbcr_conversion_features->samplerYcbcrConversion;
643 }
644
645 const auto *shader_draw_parameters_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700646 LvlFindInChain<VkPhysicalDeviceShaderDrawParametersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700647 if (shader_draw_parameters_features) {
648 state_tracker->enabled_features.core11.shaderDrawParameters = shader_draw_parameters_features->shaderDrawParameters;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700649 }
650 }
651
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700652 const auto *device_group_ci = LvlFindInChain<VkDeviceGroupDeviceCreateInfo>(pCreateInfo->pNext);
Tony-LunarGca4891a2020-08-10 15:46:46 -0600653 if (device_group_ci) {
654 state_tracker->physical_device_count = device_group_ci->physicalDeviceCount;
655 state_tracker->device_group_create_info = *device_group_ci;
656 } else {
657 state_tracker->physical_device_count = 1;
658 }
locke-lunargd556cc32019-09-17 01:21:23 -0600659
sfricke-samsung828e59d2021-08-22 23:20:49 -0700660 // Features from other extensions passesd in create info
661 {
662 const auto *exclusive_scissor_features = LvlFindInChain<VkPhysicalDeviceExclusiveScissorFeaturesNV>(pCreateInfo->pNext);
663 if (exclusive_scissor_features) {
664 state_tracker->enabled_features.exclusive_scissor_features = *exclusive_scissor_features;
665 }
locke-lunargd556cc32019-09-17 01:21:23 -0600666
sfricke-samsung828e59d2021-08-22 23:20:49 -0700667 const auto *shading_rate_image_features = LvlFindInChain<VkPhysicalDeviceShadingRateImageFeaturesNV>(pCreateInfo->pNext);
668 if (shading_rate_image_features) {
669 state_tracker->enabled_features.shading_rate_image_features = *shading_rate_image_features;
670 }
locke-lunargd556cc32019-09-17 01:21:23 -0600671
sfricke-samsung828e59d2021-08-22 23:20:49 -0700672 const auto *mesh_shader_features = LvlFindInChain<VkPhysicalDeviceMeshShaderFeaturesNV>(pCreateInfo->pNext);
673 if (mesh_shader_features) {
674 state_tracker->enabled_features.mesh_shader_features = *mesh_shader_features;
675 }
locke-lunargd556cc32019-09-17 01:21:23 -0600676
sfricke-samsung828e59d2021-08-22 23:20:49 -0700677 const auto *inline_uniform_block_features =
678 LvlFindInChain<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(pCreateInfo->pNext);
679 if (inline_uniform_block_features) {
680 state_tracker->enabled_features.inline_uniform_block_features = *inline_uniform_block_features;
681 }
locke-lunargd556cc32019-09-17 01:21:23 -0600682
sfricke-samsung828e59d2021-08-22 23:20:49 -0700683 const auto *transform_feedback_features = LvlFindInChain<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(pCreateInfo->pNext);
684 if (transform_feedback_features) {
685 state_tracker->enabled_features.transform_feedback_features = *transform_feedback_features;
686 }
locke-lunargd556cc32019-09-17 01:21:23 -0600687
sfricke-samsung828e59d2021-08-22 23:20:49 -0700688 const auto *vtx_attrib_div_features = LvlFindInChain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
689 if (vtx_attrib_div_features) {
690 state_tracker->enabled_features.vtx_attrib_divisor_features = *vtx_attrib_div_features;
691 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700692
sfricke-samsung828e59d2021-08-22 23:20:49 -0700693 const auto *buffer_device_address_ext_features =
694 LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
695 if (buffer_device_address_ext_features) {
696 state_tracker->enabled_features.buffer_device_address_ext_features = *buffer_device_address_ext_features;
697 }
locke-lunargd556cc32019-09-17 01:21:23 -0600698
sfricke-samsung828e59d2021-08-22 23:20:49 -0700699 const auto *cooperative_matrix_features = LvlFindInChain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
700 if (cooperative_matrix_features) {
701 state_tracker->enabled_features.cooperative_matrix_features = *cooperative_matrix_features;
702 }
locke-lunargd556cc32019-09-17 01:21:23 -0600703
sfricke-samsung828e59d2021-08-22 23:20:49 -0700704 const auto *compute_shader_derivatives_features =
705 LvlFindInChain<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(pCreateInfo->pNext);
706 if (compute_shader_derivatives_features) {
707 state_tracker->enabled_features.compute_shader_derivatives_features = *compute_shader_derivatives_features;
708 }
locke-lunargd556cc32019-09-17 01:21:23 -0600709
sfricke-samsung828e59d2021-08-22 23:20:49 -0700710 const auto *fragment_shader_barycentric_features =
711 LvlFindInChain<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(pCreateInfo->pNext);
712 if (fragment_shader_barycentric_features) {
713 state_tracker->enabled_features.fragment_shader_barycentric_features = *fragment_shader_barycentric_features;
714 }
locke-lunargd556cc32019-09-17 01:21:23 -0600715
sfricke-samsung828e59d2021-08-22 23:20:49 -0700716 const auto *shader_image_footprint_features =
717 LvlFindInChain<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(pCreateInfo->pNext);
718 if (shader_image_footprint_features) {
719 state_tracker->enabled_features.shader_image_footprint_features = *shader_image_footprint_features;
720 }
locke-lunargd556cc32019-09-17 01:21:23 -0600721
sfricke-samsung828e59d2021-08-22 23:20:49 -0700722 const auto *fragment_shader_interlock_features =
723 LvlFindInChain<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(pCreateInfo->pNext);
724 if (fragment_shader_interlock_features) {
725 state_tracker->enabled_features.fragment_shader_interlock_features = *fragment_shader_interlock_features;
726 }
locke-lunargd556cc32019-09-17 01:21:23 -0600727
sfricke-samsung828e59d2021-08-22 23:20:49 -0700728 const auto *demote_to_helper_invocation_features =
729 LvlFindInChain<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(pCreateInfo->pNext);
730 if (demote_to_helper_invocation_features) {
731 state_tracker->enabled_features.demote_to_helper_invocation_features = *demote_to_helper_invocation_features;
732 }
locke-lunargd556cc32019-09-17 01:21:23 -0600733
sfricke-samsung828e59d2021-08-22 23:20:49 -0700734 const auto *texel_buffer_alignment_features =
735 LvlFindInChain<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(pCreateInfo->pNext);
736 if (texel_buffer_alignment_features) {
737 state_tracker->enabled_features.texel_buffer_alignment_features = *texel_buffer_alignment_features;
738 }
locke-lunargd556cc32019-09-17 01:21:23 -0600739
sfricke-samsung828e59d2021-08-22 23:20:49 -0700740 const auto *pipeline_exe_props_features =
741 LvlFindInChain<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(pCreateInfo->pNext);
742 if (pipeline_exe_props_features) {
743 state_tracker->enabled_features.pipeline_exe_props_features = *pipeline_exe_props_features;
744 }
locke-lunargd556cc32019-09-17 01:21:23 -0600745
sfricke-samsung828e59d2021-08-22 23:20:49 -0700746 const auto *dedicated_allocation_image_aliasing_features =
747 LvlFindInChain<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(pCreateInfo->pNext);
748 if (dedicated_allocation_image_aliasing_features) {
749 state_tracker->enabled_features.dedicated_allocation_image_aliasing_features =
750 *dedicated_allocation_image_aliasing_features;
751 }
Jeff Bolz82f854d2019-09-17 14:56:47 -0500752
sfricke-samsung828e59d2021-08-22 23:20:49 -0700753 const auto *performance_query_features = LvlFindInChain<VkPhysicalDevicePerformanceQueryFeaturesKHR>(pCreateInfo->pNext);
754 if (performance_query_features) {
755 state_tracker->enabled_features.performance_query_features = *performance_query_features;
756 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +0100757
sfricke-samsung828e59d2021-08-22 23:20:49 -0700758 const auto *device_coherent_memory_features = LvlFindInChain<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(pCreateInfo->pNext);
759 if (device_coherent_memory_features) {
760 state_tracker->enabled_features.device_coherent_memory_features = *device_coherent_memory_features;
761 }
Tobias Hector782bcde2019-11-28 16:19:42 +0000762
sfricke-samsung828e59d2021-08-22 23:20:49 -0700763 const auto *ycbcr_image_array_features = LvlFindInChain<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(pCreateInfo->pNext);
764 if (ycbcr_image_array_features) {
765 state_tracker->enabled_features.ycbcr_image_array_features = *ycbcr_image_array_features;
766 }
sfricke-samsungcead0802020-01-30 22:20:10 -0800767
sfricke-samsung828e59d2021-08-22 23:20:49 -0700768 const auto *ray_query_features = LvlFindInChain<VkPhysicalDeviceRayQueryFeaturesKHR>(pCreateInfo->pNext);
769 if (ray_query_features) {
770 state_tracker->enabled_features.ray_query_features = *ray_query_features;
771 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700772
sfricke-samsung828e59d2021-08-22 23:20:49 -0700773 const auto *ray_tracing_pipeline_features =
774 LvlFindInChain<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(pCreateInfo->pNext);
775 if (ray_tracing_pipeline_features) {
776 state_tracker->enabled_features.ray_tracing_pipeline_features = *ray_tracing_pipeline_features;
777 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700778
sfricke-samsung828e59d2021-08-22 23:20:49 -0700779 const auto *ray_tracing_acceleration_structure_features =
780 LvlFindInChain<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(pCreateInfo->pNext);
781 if (ray_tracing_acceleration_structure_features) {
782 state_tracker->enabled_features.ray_tracing_acceleration_structure_features =
783 *ray_tracing_acceleration_structure_features;
784 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500785
sfricke-samsung828e59d2021-08-22 23:20:49 -0700786 const auto *robustness2_features = LvlFindInChain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
787 if (robustness2_features) {
788 state_tracker->enabled_features.robustness2_features = *robustness2_features;
789 }
Jeff Bolz165818a2020-05-08 11:19:03 -0500790
sfricke-samsung828e59d2021-08-22 23:20:49 -0700791 const auto *fragment_density_map_features =
792 LvlFindInChain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
793 if (fragment_density_map_features) {
794 state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
795 }
janharaldfredriksen-arm3b793772020-05-12 18:55:53 +0200796
sfricke-samsung828e59d2021-08-22 23:20:49 -0700797 const auto *fragment_density_map_features2 =
798 LvlFindInChain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
799 if (fragment_density_map_features2) {
800 state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
801 }
janharaldfredriksen-arm36e17572020-07-07 13:59:28 +0200802
sfricke-samsung828e59d2021-08-22 23:20:49 -0700803 const auto *astc_decode_features = LvlFindInChain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
804 if (astc_decode_features) {
805 state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
806 }
sfricke-samsung0c4a06f2020-06-27 01:24:32 -0700807
sfricke-samsung828e59d2021-08-22 23:20:49 -0700808 const auto *custom_border_color_features = LvlFindInChain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
809 if (custom_border_color_features) {
810 state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
811 }
Tony-LunarG7337b312020-04-15 16:40:25 -0600812
sfricke-samsung828e59d2021-08-22 23:20:49 -0700813 const auto *pipeline_creation_cache_control_features =
814 LvlFindInChain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(pCreateInfo->pNext);
815 if (pipeline_creation_cache_control_features) {
816 state_tracker->enabled_features.pipeline_creation_cache_control_features = *pipeline_creation_cache_control_features;
817 }
sfricke-samsungfd661d62020-05-16 00:57:27 -0700818
sfricke-samsung828e59d2021-08-22 23:20:49 -0700819 const auto *fragment_shading_rate_features =
820 LvlFindInChain<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(pCreateInfo->pNext);
821 if (fragment_shading_rate_features) {
822 state_tracker->enabled_features.fragment_shading_rate_features = *fragment_shading_rate_features;
823 }
Tobias Hector6663c9b2020-11-05 10:18:02 +0000824
sfricke-samsung828e59d2021-08-22 23:20:49 -0700825 const auto *extended_dynamic_state_features =
826 LvlFindInChain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
827 if (extended_dynamic_state_features) {
828 state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
829 }
Piers Daniell39842ee2020-07-10 16:42:33 -0600830
sfricke-samsung828e59d2021-08-22 23:20:49 -0700831 const auto *extended_dynamic_state2_features =
832 LvlFindInChain<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(pCreateInfo->pNext);
833 if (extended_dynamic_state2_features) {
834 state_tracker->enabled_features.extended_dynamic_state2_features = *extended_dynamic_state2_features;
835 }
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -0700836
sfricke-samsung828e59d2021-08-22 23:20:49 -0700837 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
838 if (multiview_features) {
839 state_tracker->enabled_features.multiview_features = *multiview_features;
840 }
locke-lunarg3fa463a2020-10-23 16:39:04 -0600841
sfricke-samsung828e59d2021-08-22 23:20:49 -0700842 const auto *portability_features = LvlFindInChain<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(pCreateInfo->pNext);
843 if (portability_features) {
844 state_tracker->enabled_features.portability_subset_features = *portability_features;
845 }
Nathaniel Cesariob3f2d702020-11-09 09:20:49 -0700846
sfricke-samsung828e59d2021-08-22 23:20:49 -0700847 const auto *shader_integer_functions2_features =
848 LvlFindInChain<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(pCreateInfo->pNext);
849 if (shader_integer_functions2_features) {
850 state_tracker->enabled_features.shader_integer_functions2_features = *shader_integer_functions2_features;
851 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800852
sfricke-samsung828e59d2021-08-22 23:20:49 -0700853 const auto *shader_sm_builtins_features = LvlFindInChain<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(pCreateInfo->pNext);
854 if (shader_sm_builtins_features) {
855 state_tracker->enabled_features.shader_sm_builtins_features = *shader_sm_builtins_features;
856 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800857
sfricke-samsung828e59d2021-08-22 23:20:49 -0700858 const auto *shader_atomic_float_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(pCreateInfo->pNext);
859 if (shader_atomic_float_features) {
860 state_tracker->enabled_features.shader_atomic_float_features = *shader_atomic_float_features;
861 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800862
sfricke-samsung828e59d2021-08-22 23:20:49 -0700863 const auto *shader_image_atomic_int64_features =
864 LvlFindInChain<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(pCreateInfo->pNext);
865 if (shader_image_atomic_int64_features) {
866 state_tracker->enabled_features.shader_image_atomic_int64_features = *shader_image_atomic_int64_features;
867 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800868
sfricke-samsung828e59d2021-08-22 23:20:49 -0700869 const auto *shader_clock_features = LvlFindInChain<VkPhysicalDeviceShaderClockFeaturesKHR>(pCreateInfo->pNext);
870 if (shader_clock_features) {
871 state_tracker->enabled_features.shader_clock_features = *shader_clock_features;
872 }
sfricke-samsung486a51e2021-01-02 00:10:15 -0800873
sfricke-samsung828e59d2021-08-22 23:20:49 -0700874 const auto *conditional_rendering_features =
875 LvlFindInChain<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(pCreateInfo->pNext);
876 if (conditional_rendering_features) {
877 state_tracker->enabled_features.conditional_rendering_features = *conditional_rendering_features;
878 }
Jeremy Gebben5f585ae2021-02-02 09:03:06 -0700879
sfricke-samsung828e59d2021-08-22 23:20:49 -0700880 const auto *workgroup_memory_explicit_layout_features =
881 LvlFindInChain<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(pCreateInfo->pNext);
882 if (workgroup_memory_explicit_layout_features) {
883 state_tracker->enabled_features.workgroup_memory_explicit_layout_features = *workgroup_memory_explicit_layout_features;
884 }
Shannon McPhersondb287d42021-02-02 15:27:32 -0700885
sfricke-samsung828e59d2021-08-22 23:20:49 -0700886 const auto *synchronization2_features = LvlFindInChain<VkPhysicalDeviceSynchronization2FeaturesKHR>(pCreateInfo->pNext);
887 if (synchronization2_features) {
888 state_tracker->enabled_features.synchronization2_features = *synchronization2_features;
889 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -0700890
sfricke-samsung828e59d2021-08-22 23:20:49 -0700891 const auto *provoking_vertex_features = lvl_find_in_chain<VkPhysicalDeviceProvokingVertexFeaturesEXT>(pCreateInfo->pNext);
892 if (provoking_vertex_features) {
893 state_tracker->enabled_features.provoking_vertex_features = *provoking_vertex_features;
894 }
Locke Linf3873542021-04-26 11:25:10 -0600895
sfricke-samsung828e59d2021-08-22 23:20:49 -0700896 const auto *vertex_input_dynamic_state_features =
897 LvlFindInChain<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(pCreateInfo->pNext);
898 if (vertex_input_dynamic_state_features) {
899 state_tracker->enabled_features.vertex_input_dynamic_state_features = *vertex_input_dynamic_state_features;
900 }
Piers Daniellcb6d8032021-04-19 18:51:26 -0600901
sfricke-samsung828e59d2021-08-22 23:20:49 -0700902 const auto *inherited_viewport_scissor_features =
903 LvlFindInChain<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(pCreateInfo->pNext);
904 if (inherited_viewport_scissor_features) {
905 state_tracker->enabled_features.inherited_viewport_scissor_features = *inherited_viewport_scissor_features;
906 }
David Zhao Akeley44139b12021-04-26 16:16:13 -0700907
sfricke-samsung828e59d2021-08-22 23:20:49 -0700908 const auto *multi_draw_features = LvlFindInChain<VkPhysicalDeviceMultiDrawFeaturesEXT>(pCreateInfo->pNext);
909 if (multi_draw_features) {
910 state_tracker->enabled_features.multi_draw_features = *multi_draw_features;
911 }
Tony-LunarG4490de42021-06-21 15:49:19 -0600912
sfricke-samsung828e59d2021-08-22 23:20:49 -0700913 const auto *color_write_features = LvlFindInChain<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(pCreateInfo->pNext);
914 if (color_write_features) {
915 state_tracker->enabled_features.color_write_features = *color_write_features;
916 }
ziga-lunarg29ba2b92021-07-20 21:51:45 +0200917
sfricke-samsung828e59d2021-08-22 23:20:49 -0700918 const auto *shader_atomic_float2_features =
919 LvlFindInChain<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(pCreateInfo->pNext);
920 if (shader_atomic_float2_features) {
921 state_tracker->enabled_features.shader_atomic_float2_features = *shader_atomic_float2_features;
922 }
Mike Schuchardtb3870ea2021-07-20 18:56:51 -0700923
sfricke-samsung828e59d2021-08-22 23:20:49 -0700924 const auto *present_id_features = LvlFindInChain<VkPhysicalDevicePresentIdFeaturesKHR>(pCreateInfo->pNext);
925 if (present_id_features) {
926 state_tracker->enabled_features.present_id_features = *present_id_features;
927 }
Tony-LunarG6f887e52021-07-27 11:23:14 -0600928
sfricke-samsung828e59d2021-08-22 23:20:49 -0700929 const auto *present_wait_features = LvlFindInChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pCreateInfo->pNext);
930 if (present_wait_features) {
931 state_tracker->enabled_features.present_wait_features = *present_wait_features;
932 }
Mike Schuchardt9f65d3f2021-08-25 15:11:39 -0700933
934 const auto *ray_tracing_motion_blur_features =
935 LvlFindInChain<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(pCreateInfo->pNext);
936 if (ray_tracing_motion_blur_features) {
937 state_tracker->enabled_features.ray_tracing_motion_blur_features = *ray_tracing_motion_blur_features;
938 }
Mike Schuchardtb4d90452021-08-30 09:24:51 -0700939
940 const auto *shader_integer_dot_product_features =
941 LvlFindInChain<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR>(pCreateInfo->pNext);
942 if (shader_integer_dot_product_features) {
943 state_tracker->enabled_features.shader_integer_dot_product_features = *shader_integer_dot_product_features;
944 }
Tony-LunarG0b0d8be2021-08-30 13:50:38 -0600945
946 const auto *primitive_topology_list_restart_features =
947 LvlFindInChain<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(pCreateInfo->pNext);
948 if (primitive_topology_list_restart_features) {
949 state_tracker->enabled_features.primitive_topology_list_restart_features = *primitive_topology_list_restart_features;
950 }
sfricke-samsung10b35ce2021-09-29 08:50:20 -0700951
952 const auto *rgba10x6_formats_features = LvlFindInChain<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(pCreateInfo->pNext);
953 if (rgba10x6_formats_features) {
954 state_tracker->enabled_features.rgba10x6_formats_features = *rgba10x6_formats_features;
955 }
sfricke-samsungd3c917b2021-10-19 08:24:57 -0700956
957 const auto *maintenance4_features = LvlFindInChain<VkPhysicalDeviceMaintenance4FeaturesKHR>(pCreateInfo->pNext);
958 if (maintenance4_features) {
959 state_tracker->enabled_features.maintenance4_features = *maintenance4_features;
960 }
Jeremy Gebbence23dac2021-11-10 10:19:42 -0700961
962 const auto *dynamic_rendering_features = LvlFindInChain<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(pCreateInfo->pNext);
963 if (dynamic_rendering_features) {
964 state_tracker->enabled_features.dynamic_rendering_features = *dynamic_rendering_features;
965 }
Tony-LunarG69604c42021-11-22 16:00:12 -0700966
967 const auto *image_view_min_lod_features = LvlFindInChain<VkPhysicalDeviceImageViewMinLodFeaturesEXT>(pCreateInfo->pNext);
968 if (image_view_min_lod_features) {
969 state_tracker->enabled_features.image_view_min_lod_features = *image_view_min_lod_features;
970 }
Tony-LunarG6f887e52021-07-27 11:23:14 -0600971 }
972
ziga-lunarg73163742021-08-25 13:15:29 +0200973 const auto *subgroup_size_control_features = LvlFindInChain<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(pCreateInfo->pNext);
974 if (subgroup_size_control_features) {
975 state_tracker->enabled_features.subgroup_size_control_features = *subgroup_size_control_features;
976 }
977
locke-lunargd556cc32019-09-17 01:21:23 -0600978 // Store physical device properties and physical device mem limits into CoreChecks structs
979 DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
980 DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
981
982 const auto &dev_ext = state_tracker->device_extensions;
983 auto *phys_dev_props = &state_tracker->phys_dev_ext_props;
984
sfricke-samsung828e59d2021-08-22 23:20:49 -0700985 // Vulkan 1.2 can get properties from single struct, otherwise need to add to it per extension
sfricke-samsung45996a42021-09-16 13:45:27 -0700986 if (dev_ext.vk_feature_version_1_2) {
987 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core11);
988 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core12);
sfricke-samsung828e59d2021-08-22 23:20:49 -0700989 } else {
990 // VkPhysicalDeviceVulkan11Properties
991 //
992 // Can ingnore VkPhysicalDeviceIDProperties as it has no validation purpose
993
994 if (dev_ext.vk_khr_multiview) {
995 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
996 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &multiview_props);
997 state_tracker->phys_dev_props_core11.maxMultiviewViewCount = multiview_props.maxMultiviewViewCount;
998 state_tracker->phys_dev_props_core11.maxMultiviewInstanceIndex = multiview_props.maxMultiviewInstanceIndex;
999 }
1000
1001 if (dev_ext.vk_khr_maintenance3) {
1002 auto maintenance3_props = LvlInitStruct<VkPhysicalDeviceMaintenance3Properties>();
1003 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_maintenance3, &maintenance3_props);
1004 state_tracker->phys_dev_props_core11.maxPerSetDescriptors = maintenance3_props.maxPerSetDescriptors;
1005 state_tracker->phys_dev_props_core11.maxMemoryAllocationSize = maintenance3_props.maxMemoryAllocationSize;
1006 }
1007
1008 // Some 1.1 properties were added to core without previous extensions
1009 if (state_tracker->api_version >= VK_API_VERSION_1_1) {
1010 auto subgroup_prop = LvlInitStruct<VkPhysicalDeviceSubgroupProperties>();
1011 auto protected_memory_prop = LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>(&subgroup_prop);
1012 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&protected_memory_prop);
1013 instance_dispatch_table.GetPhysicalDeviceProperties2(gpu, &prop2);
1014
1015 state_tracker->phys_dev_props_core11.subgroupSize = subgroup_prop.subgroupSize;
1016 state_tracker->phys_dev_props_core11.subgroupSupportedStages = subgroup_prop.supportedStages;
1017 state_tracker->phys_dev_props_core11.subgroupSupportedOperations = subgroup_prop.supportedOperations;
1018 state_tracker->phys_dev_props_core11.subgroupQuadOperationsInAllStages = subgroup_prop.quadOperationsInAllStages;
1019
1020 state_tracker->phys_dev_props_core11.protectedNoFault = protected_memory_prop.protectedNoFault;
1021 }
1022
1023 // VkPhysicalDeviceVulkan12Properties
1024 //
1025 // Can ingnore VkPhysicalDeviceDriverProperties as it has no validation purpose
1026
1027 if (dev_ext.vk_ext_descriptor_indexing) {
1028 auto descriptor_indexing_prop = LvlInitStruct<VkPhysicalDeviceDescriptorIndexingProperties>();
1029 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_descriptor_indexing, &descriptor_indexing_prop);
1030 state_tracker->phys_dev_props_core12.maxUpdateAfterBindDescriptorsInAllPools =
1031 descriptor_indexing_prop.maxUpdateAfterBindDescriptorsInAllPools;
1032 state_tracker->phys_dev_props_core12.shaderUniformBufferArrayNonUniformIndexingNative =
1033 descriptor_indexing_prop.shaderUniformBufferArrayNonUniformIndexingNative;
1034 state_tracker->phys_dev_props_core12.shaderSampledImageArrayNonUniformIndexingNative =
1035 descriptor_indexing_prop.shaderSampledImageArrayNonUniformIndexingNative;
1036 state_tracker->phys_dev_props_core12.shaderStorageBufferArrayNonUniformIndexingNative =
1037 descriptor_indexing_prop.shaderStorageBufferArrayNonUniformIndexingNative;
1038 state_tracker->phys_dev_props_core12.shaderStorageImageArrayNonUniformIndexingNative =
1039 descriptor_indexing_prop.shaderStorageImageArrayNonUniformIndexingNative;
1040 state_tracker->phys_dev_props_core12.shaderInputAttachmentArrayNonUniformIndexingNative =
1041 descriptor_indexing_prop.shaderInputAttachmentArrayNonUniformIndexingNative;
1042 state_tracker->phys_dev_props_core12.robustBufferAccessUpdateAfterBind =
1043 descriptor_indexing_prop.robustBufferAccessUpdateAfterBind;
1044 state_tracker->phys_dev_props_core12.quadDivergentImplicitLod = descriptor_indexing_prop.quadDivergentImplicitLod;
1045 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSamplers =
1046 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSamplers;
1047 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindUniformBuffers =
1048 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindUniformBuffers;
1049 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageBuffers =
1050 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageBuffers;
1051 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSampledImages =
1052 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSampledImages;
1053 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageImages =
1054 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageImages;
1055 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindInputAttachments =
1056 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindInputAttachments;
1057 state_tracker->phys_dev_props_core12.maxPerStageUpdateAfterBindResources =
1058 descriptor_indexing_prop.maxPerStageUpdateAfterBindResources;
1059 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSamplers =
1060 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSamplers;
1061 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffers =
1062 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffers;
1063 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic =
1064 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
1065 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffers =
1066 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffers;
1067 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic =
1068 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
1069 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSampledImages =
1070 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSampledImages;
1071 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageImages =
1072 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageImages;
1073 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindInputAttachments =
1074 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindInputAttachments;
1075 }
1076
1077 if (dev_ext.vk_khr_depth_stencil_resolve) {
1078 auto depth_stencil_resolve_props = LvlInitStruct<VkPhysicalDeviceDepthStencilResolveProperties>();
1079 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_depth_stencil_resolve, &depth_stencil_resolve_props);
1080 state_tracker->phys_dev_props_core12.supportedDepthResolveModes =
1081 depth_stencil_resolve_props.supportedDepthResolveModes;
1082 state_tracker->phys_dev_props_core12.supportedStencilResolveModes =
1083 depth_stencil_resolve_props.supportedStencilResolveModes;
1084 state_tracker->phys_dev_props_core12.independentResolveNone = depth_stencil_resolve_props.independentResolveNone;
1085 state_tracker->phys_dev_props_core12.independentResolve = depth_stencil_resolve_props.independentResolve;
1086 }
1087
1088 if (dev_ext.vk_khr_timeline_semaphore) {
1089 auto timeline_semaphore_props = LvlInitStruct<VkPhysicalDeviceTimelineSemaphoreProperties>();
1090 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_timeline_semaphore, &timeline_semaphore_props);
1091 state_tracker->phys_dev_props_core12.maxTimelineSemaphoreValueDifference =
1092 timeline_semaphore_props.maxTimelineSemaphoreValueDifference;
1093 }
1094
1095 if (dev_ext.vk_ext_sampler_filter_minmax) {
1096 auto sampler_filter_minmax_props = LvlInitStruct<VkPhysicalDeviceSamplerFilterMinmaxProperties>();
1097 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sampler_filter_minmax, &sampler_filter_minmax_props);
1098 state_tracker->phys_dev_props_core12.filterMinmaxSingleComponentFormats =
1099 sampler_filter_minmax_props.filterMinmaxSingleComponentFormats;
1100 state_tracker->phys_dev_props_core12.filterMinmaxImageComponentMapping =
1101 sampler_filter_minmax_props.filterMinmaxImageComponentMapping;
1102 }
1103
1104 if (dev_ext.vk_khr_shader_float_controls) {
1105 auto float_controls_props = LvlInitStruct<VkPhysicalDeviceFloatControlsProperties>();
1106 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_shader_float_controls, &float_controls_props);
1107 state_tracker->phys_dev_props_core12.denormBehaviorIndependence = float_controls_props.denormBehaviorIndependence;
1108 state_tracker->phys_dev_props_core12.roundingModeIndependence = float_controls_props.roundingModeIndependence;
1109 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat16 =
1110 float_controls_props.shaderSignedZeroInfNanPreserveFloat16;
1111 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat32 =
1112 float_controls_props.shaderSignedZeroInfNanPreserveFloat32;
1113 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat64 =
1114 float_controls_props.shaderSignedZeroInfNanPreserveFloat64;
1115 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat16 = float_controls_props.shaderDenormPreserveFloat16;
1116 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat32 = float_controls_props.shaderDenormPreserveFloat32;
1117 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat64 = float_controls_props.shaderDenormPreserveFloat64;
1118 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat16 =
1119 float_controls_props.shaderDenormFlushToZeroFloat16;
1120 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat32 =
1121 float_controls_props.shaderDenormFlushToZeroFloat32;
1122 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat64 =
1123 float_controls_props.shaderDenormFlushToZeroFloat64;
1124 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat16 = float_controls_props.shaderRoundingModeRTEFloat16;
1125 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat32 = float_controls_props.shaderRoundingModeRTEFloat32;
1126 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat64 = float_controls_props.shaderRoundingModeRTEFloat64;
1127 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat16 = float_controls_props.shaderRoundingModeRTZFloat16;
1128 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat32 = float_controls_props.shaderRoundingModeRTZFloat32;
1129 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat64 = float_controls_props.shaderRoundingModeRTZFloat64;
1130 }
locke-lunargd556cc32019-09-17 01:21:23 -06001131 }
1132
sfricke-samsung828e59d2021-08-22 23:20:49 -07001133 // Extensions with properties to extract to DeviceExtensionProperties
1134 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_push_descriptor, &phys_dev_props->push_descriptor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001135 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_shading_rate_image, &phys_dev_props->shading_rate_image_props);
1136 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_mesh_shader, &phys_dev_props->mesh_shader_props);
1137 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_inline_uniform_block, &phys_dev_props->inline_uniform_block_props);
1138 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_vertex_attribute_divisor, &phys_dev_props->vtx_attrib_divisor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001139 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_transform_feedback, &phys_dev_props->transform_feedback_props);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001140 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_ray_tracing, &phys_dev_props->ray_tracing_propsNV);
sourav parmarcd5fb182020-07-17 12:58:44 -07001141 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing_pipeline, &phys_dev_props->ray_tracing_propsKHR);
1142 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_acceleration_structure, &phys_dev_props->acc_structure_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001143 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
1144 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
Mike Schuchardtc57de4a2021-07-20 17:26:32 -07001145 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map2, &phys_dev_props->fragment_density_map2_props);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001146 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
sfricke-samsung8f658d42020-05-03 20:12:24 -07001147 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
Tony-LunarG7337b312020-04-15 16:40:25 -06001148 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
locke-lunarg3fa463a2020-10-23 16:39:04 -06001149 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &phys_dev_props->multiview_props);
Nathaniel Cesario3291c912020-11-17 16:54:41 -07001150 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_portability_subset, &phys_dev_props->portability_props);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001151 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_fragment_shading_rate, &phys_dev_props->fragment_shading_rate_props);
Locke Lin016d8482021-05-27 12:11:31 -06001152 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_provoking_vertex, &phys_dev_props->provoking_vertex_props);
Tony-LunarG4490de42021-06-21 15:49:19 -06001153 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_multi_draw, &phys_dev_props->multi_draw_props);
ziga-lunarg128904a2021-07-30 13:49:01 +02001154 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_discard_rectangles, &phys_dev_props->discard_rectangle_props);
ziga-lunarg86492812021-08-05 23:58:16 +02001155 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_blend_operation_advanced, &phys_dev_props->blend_operation_advanced_props);
ziga-lunargbd8ded62021-09-20 18:24:39 +02001156 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_conservative_rasterization, &phys_dev_props->conservative_rasterization_props);
ziga-lunarg11fecb92021-09-20 16:48:06 +02001157 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_subgroup_size_control, &phys_dev_props->subgroup_size_control_props);
Piers Daniell41b8c5d2020-01-10 15:42:00 -07001158
sfricke-samsung45996a42021-09-16 13:45:27 -07001159 if (IsExtEnabled(dev_ext.vk_nv_cooperative_matrix)) {
locke-lunargd556cc32019-09-17 01:21:23 -06001160 // Get the needed cooperative_matrix properties
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001161 auto cooperative_matrix_props = LvlInitStruct<VkPhysicalDeviceCooperativeMatrixPropertiesNV>();
1162 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&cooperative_matrix_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001163 instance_dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2);
1164 state_tracker->phys_dev_ext_props.cooperative_matrix_props = cooperative_matrix_props;
1165
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001166 uint32_t num_cooperative_matrix_properties = 0;
1167 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties, NULL);
1168 state_tracker->cooperative_matrix_properties.resize(num_cooperative_matrix_properties,
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001169 LvlInitStruct<VkCooperativeMatrixPropertiesNV>());
locke-lunargd556cc32019-09-17 01:21:23 -06001170
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001171 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties,
locke-lunargd556cc32019-09-17 01:21:23 -06001172 state_tracker->cooperative_matrix_properties.data());
1173 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001174
locke-lunargd556cc32019-09-17 01:21:23 -06001175 // Store queue family data
1176 if (pCreateInfo->pQueueCreateInfos != nullptr) {
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001177 uint32_t total_count = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001178 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001179 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001180 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1181 state_tracker->device_queue_info_list.push_back(
1182 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001183 total_count += queue_create_info.queueCount;
1184 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001185 queue_map_.reserve(total_count);
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001186 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1187 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1188 VkQueue queue = VK_NULL_HANDLE;
1189 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1190 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1191 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1192 get_info.flags = queue_info.flags;
1193 get_info.queueFamilyIndex = queue_info.queue_family_index;
1194 get_info.queueIndex = i;
1195 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1196 } else {
1197 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1198 }
1199 assert(queue != VK_NULL_HANDLE);
Mike Schuchardta9101d32021-11-12 12:24:08 -08001200 state_tracker->Add(std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index, queue_info.flags));
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001201 }
locke-lunargd556cc32019-09-17 01:21:23 -06001202 }
1203 }
1204}
1205
1206void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1207 if (!device) return;
1208
Jeremy Gebbend177d922021-10-28 13:42:10 -06001209 command_pool_map_.clear();
1210 assert(command_buffer_map_.empty());
1211 pipeline_map_.clear();
1212 render_pass_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001213
1214 // This will also delete all sets in the pool & remove them from setMap
Jeremy Gebbend177d922021-10-28 13:42:10 -06001215 descriptor_pool_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001216 // All sets should be removed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001217 assert(descriptor_set_map_.empty());
1218 desc_template_map_.clear();
1219 descriptor_set_layout_map_.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001220 // Because swapchains are associated with Surfaces, which are at instance level,
1221 // they need to be explicitly destroyed here to avoid continued references to
1222 // the device we're destroying.
Jeremy Gebbend177d922021-10-28 13:42:10 -06001223 for (auto &entry : swapchain_map_) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001224 entry.second->Destroy();
1225 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001226 swapchain_map_.clear();
1227 image_view_map_.clear();
1228 image_map_.clear();
1229 buffer_view_map_.clear();
1230 buffer_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001231 // Queues persist until device is destroyed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001232 queue_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001233}
1234
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001235void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1236 VkFence fence, VkResult result) {
1237 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001238 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001239
Jeremy Gebben57642982021-09-14 14:14:55 -06001240 uint64_t early_retire_seq = 0;
1241
1242 if (submitCount == 0) {
1243 CB_SUBMISSION submission;
1244 submission.AddFence(GetShared<FENCE_STATE>(fence));
1245 early_retire_seq = queue_state->Submit(std::move(submission));
1246 }
locke-lunargd556cc32019-09-17 01:21:23 -06001247
1248 // Now process each individual submit
1249 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001250 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001251 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001252 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001253 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001254 uint64_t value = 0;
1255 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1256 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1257 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1258 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001259 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001260 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001261
locke-lunargd556cc32019-09-17 01:21:23 -06001262 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001263 uint64_t value = 0;
1264 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1265 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1266 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1267 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001268 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001269 }
1270
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001271 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001272 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001273
locke-lunargd556cc32019-09-17 01:21:23 -06001274 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001275 submission.AddCommandBuffer(GetShared<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001276 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001277 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
1278 submission.AddFence(GetShared<FENCE_STATE>(fence));
1279 }
1280 auto submit_seq = queue_state->Submit(std::move(submission));
1281 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001282 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001283
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001284 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001285 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001286 }
1287}
1288
1289void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1290 VkFence fence, VkResult result) {
1291 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001292 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001293 uint64_t early_retire_seq = 0;
1294 if (submitCount == 0) {
1295 CB_SUBMISSION submission;
1296 submission.AddFence(GetShared<FENCE_STATE>(fence));
1297 early_retire_seq = queue_state->Submit(std::move(submission));
1298 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001299
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001300 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1301 CB_SUBMISSION submission;
1302 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001303 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1304 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben57642982021-09-14 14:14:55 -06001305 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001306 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001307 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1308 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben57642982021-09-14 14:14:55 -06001309 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001310 }
1311 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1312 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1313
1314 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001315 submission.AddCommandBuffer(GetShared<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001316 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001317 if (submit_idx == (submitCount - 1)) {
1318 submission.AddFence(GetShared<FENCE_STATE>(fence));
1319 }
1320 auto submit_seq = queue_state->Submit(std::move(submission));
1321 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001322 }
locke-lunargd556cc32019-09-17 01:21:23 -06001323 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001324 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001325 }
1326}
1327
1328void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1329 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1330 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001331 if (VK_SUCCESS != result) {
1332 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001333 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001334 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1335 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1336 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1337
1338 layer_data::optional<DedicatedBinding> dedicated_binding;
1339
1340 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1341 if (dedicated) {
1342 if (dedicated->buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001343 const auto buffer_state = Get<BUFFER_STATE>(dedicated->buffer);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001344 assert(buffer_state);
1345 if (!buffer_state) {
1346 return;
1347 }
1348 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1349 } else if (dedicated->image) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001350 const auto image_state = Get<IMAGE_STATE>(dedicated->image);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001351 assert(image_state);
1352 if (!image_state) {
1353 return;
1354 }
1355 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1356 }
1357 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001358 Add(std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
1359 std::move(dedicated_binding), physical_device_count));
locke-lunargd556cc32019-09-17 01:21:23 -06001360 return;
1361}
1362
1363void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001364 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001365 if (mem_info) {
1366 fake_memory.Free(mem_info->fake_base_address);
1367 }
1368 Destroy<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001369}
1370
1371void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1372 VkFence fence, VkResult result) {
1373 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001374 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001375
Jeremy Gebben57642982021-09-14 14:14:55 -06001376 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001377
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001378 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1379 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001380 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001381 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1382 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1383 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001384 auto buffer_state = Get<BUFFER_STATE>(bind_info.pBufferBinds[j].buffer);
1385 auto mem_state = GetShared<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001386 if (buffer_state && mem_state) {
1387 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1388 }
locke-lunargd556cc32019-09-17 01:21:23 -06001389 }
1390 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001391 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1392 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1393 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001394 auto image_state = Get<IMAGE_STATE>(bind_info.pImageOpaqueBinds[j].image);
1395 auto mem_state = GetShared<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001396 if (image_state && mem_state) {
1397 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1398 }
locke-lunargd556cc32019-09-17 01:21:23 -06001399 }
1400 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001401 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1402 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1403 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001404 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1405 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001406 auto image_state = Get<IMAGE_STATE>(bind_info.pImageBinds[j].image);
1407 auto mem_state = GetShared<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001408 if (image_state && mem_state) {
1409 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1410 }
locke-lunargd556cc32019-09-17 01:21:23 -06001411 }
1412 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001413 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001414 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001415 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001416 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001417 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001418 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001419 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001420 if (bind_idx == (bindInfoCount - 1)) {
1421 submission.AddFence(GetShared<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001422 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001423 auto submit_seq = queue_state->Submit(std::move(submission));
1424 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001425 }
1426
1427 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001428 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001429 }
1430}
1431
1432void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1433 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1434 VkResult result) {
1435 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001436 Add(std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext)));
locke-lunargd556cc32019-09-17 01:21:23 -06001437}
1438
Mike Schuchardt2df08912020-12-15 16:28:09 -08001439void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1440 VkSemaphoreImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001441 auto sema_node = Get<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001442 if (sema_node && sema_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08001443 if ((handle_type == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06001444 sema_node->scope == kSyncScopeInternal) {
1445 sema_node->scope = kSyncScopeExternalTemporary;
1446 } else {
1447 sema_node->scope = kSyncScopeExternalPermanent;
1448 }
1449 }
1450}
1451
Mike Schuchardt2df08912020-12-15 16:28:09 -08001452void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001453 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001454 auto semaphore_state = Get<SEMAPHORE_STATE>(pSignalInfo->semaphore);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001455 semaphore_state->payload = pSignalInfo->value;
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001456}
1457
locke-lunargd556cc32019-09-17 01:21:23 -06001458void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001459 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001460 if (mem_info) {
1461 mem_info->mapped_range.offset = offset;
1462 mem_info->mapped_range.size = size;
1463 mem_info->p_driver_data = *ppData;
1464 }
1465}
1466
locke-lunargd556cc32019-09-17 01:21:23 -06001467void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1468 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1469 if (VK_SUCCESS != result) return;
1470
1471 // When we know that all fences are complete we can clean/remove their CBs
1472 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1473 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001474 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001475 if (fence_state) {
1476 fence_state->Retire();
1477 }
locke-lunargd556cc32019-09-17 01:21:23 -06001478 }
1479 }
1480 // NOTE : Alternate case not handled here is when some fences have completed. In
1481 // this case for app to guarantee which fences completed it will have to call
1482 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1483}
1484
John Zulauff89de662020-04-13 18:57:34 -06001485void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1486 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001487 if (VK_SUCCESS != result) return;
1488
1489 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001490 auto semaphore_state = Get<SEMAPHORE_STATE>(pWaitInfo->pSemaphores[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001491 if (semaphore_state) {
1492 semaphore_state->Retire(pWaitInfo->pValues[i]);
1493 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001494 }
1495}
1496
John Zulauff89de662020-04-13 18:57:34 -06001497void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1498 VkResult result) {
1499 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1500}
1501
1502void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1503 uint64_t timeout, VkResult result) {
1504 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1505}
1506
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001507void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1508 VkResult result) {
1509 if (VK_SUCCESS != result) return;
1510
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001511 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben57642982021-09-14 14:14:55 -06001512 if (semaphore_state) {
1513 semaphore_state->Retire(*pValue);
1514 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001515}
1516
1517void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1518 VkResult result) {
1519 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1520}
1521void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1522 VkResult result) {
1523 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1524}
1525
locke-lunargd556cc32019-09-17 01:21:23 -06001526void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1527 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001528 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben57642982021-09-14 14:14:55 -06001529 if (fence_state) {
1530 fence_state->Retire();
1531 }
locke-lunargd556cc32019-09-17 01:21:23 -06001532}
1533
locke-lunargd556cc32019-09-17 01:21:23 -06001534void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1535 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001536 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001537 if (queue_state) {
1538 queue_state->Retire();
1539 }
locke-lunargd556cc32019-09-17 01:21:23 -06001540}
1541
1542void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1543 if (VK_SUCCESS != result) return;
Jeremy Gebbend177d922021-10-28 13:42:10 -06001544 for (auto &queue : queue_map_) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001545 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001546 }
1547}
1548
1549void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001550 Destroy<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06001551}
1552
1553void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1554 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001555 Destroy<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001556}
1557
1558void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001559 Destroy<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06001560}
1561
1562void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1563 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001564 Destroy<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001565}
1566
locke-lunargd556cc32019-09-17 01:21:23 -06001567void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001568 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001569 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001570 // Track objects tied to memory
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001571 auto mem_state = GetShared<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001572 if (mem_state) {
1573 buffer_state->SetMemBinding(mem_state, memoryOffset);
1574 }
locke-lunargd556cc32019-09-17 01:21:23 -06001575 }
1576}
1577
1578void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1579 VkDeviceSize memoryOffset, VkResult result) {
1580 if (VK_SUCCESS != result) return;
1581 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1582}
1583
1584void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001585 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001586 for (uint32_t i = 0; i < bindInfoCount; i++) {
1587 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1588 }
1589}
1590
1591void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001592 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001593 for (uint32_t i = 0; i < bindInfoCount; i++) {
1594 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1595 }
1596}
1597
Spencer Fricke6c127102020-04-16 06:25:20 -07001598void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001599 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001600 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001601 buffer_state->memory_requirements_checked = true;
1602 }
1603}
1604
1605void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1606 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001607 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001608}
1609
1610void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001611 const VkBufferMemoryRequirementsInfo2 *pInfo,
1612 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001613 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001614}
1615
1616void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001617 const VkBufferMemoryRequirementsInfo2 *pInfo,
1618 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001619 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001620}
1621
Spencer Fricke6c127102020-04-16 06:25:20 -07001622void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001623 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001624 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001625 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001626 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001627 if (plane_info != nullptr) {
1628 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001629 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001630 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001631 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001632 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001633 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001634 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001635 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001636 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001637 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001638 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001639 }
locke-lunargd556cc32019-09-17 01:21:23 -06001640 }
1641}
1642
1643void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1644 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001645 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001646}
1647
1648void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1649 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001650 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001651}
1652
1653void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1654 const VkImageMemoryRequirementsInfo2 *pInfo,
1655 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001656 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001657}
1658
locke-lunargd556cc32019-09-17 01:21:23 -06001659void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1660 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1661 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001662 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001663 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001664}
1665
1666void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001667 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1668 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001669 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001670 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001671}
1672
1673void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001674 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1675 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001676 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001677 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001678}
1679
1680void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1681 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001682 Destroy<SHADER_MODULE_STATE>(shaderModule);
locke-lunargd556cc32019-09-17 01:21:23 -06001683}
1684
1685void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1686 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001687 Destroy<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001688}
1689
1690void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1691 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001692 Destroy<PIPELINE_LAYOUT_STATE>(pipelineLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001693}
1694
1695void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1696 const VkAllocationCallbacks *pAllocator) {
1697 if (!sampler) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001698 auto sampler_state = Get<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001699 // Any bound cmd buffers are now invalid
1700 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001701 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1702 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1703 custom_border_color_sampler_count--;
1704 }
locke-lunargd556cc32019-09-17 01:21:23 -06001705 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001706 Destroy<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001707}
1708
1709void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1710 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001711 Destroy<cvdescriptorset::DescriptorSetLayout>(descriptorSetLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001712}
1713
1714void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1715 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001716 Destroy<DESCRIPTOR_POOL_STATE>(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001717}
1718
locke-lunargd556cc32019-09-17 01:21:23 -06001719void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1720 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001721 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1722 if (pool) {
1723 pool->Free(commandBufferCount, pCommandBuffers);
1724 }
locke-lunargd556cc32019-09-17 01:21:23 -06001725}
1726
1727void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1728 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1729 VkResult result) {
1730 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001731 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001732 Add(std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags));
locke-lunargd556cc32019-09-17 01:21:23 -06001733}
1734
1735void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1736 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1737 VkResult result) {
1738 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001739
1740 uint32_t index_count = 0, n_perf_pass = 0;
1741 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001742 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001743 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001744 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001745
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001746 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001747 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1748 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1749 switch (counter.scope) {
1750 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001751 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001752 break;
1753 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001754 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001755 break;
1756 default:
1757 break;
1758 }
1759 }
1760
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001761 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001762 }
1763
Jeremy Gebben082a9832021-10-28 13:40:11 -06001764 Add(std::make_shared<QUERY_POOL_STATE>(*pQueryPool, pCreateInfo, index_count, n_perf_pass, has_cb, has_rb));
locke-lunargd556cc32019-09-17 01:21:23 -06001765
locke-lunargd556cc32019-09-17 01:21:23 -06001766}
1767
1768void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1769 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001770 Destroy<COMMAND_POOL_STATE>(commandPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001771}
1772
1773void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1774 VkCommandPoolResetFlags flags, VkResult result) {
1775 if (VK_SUCCESS != result) return;
1776 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001777 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1778 if (pool) {
1779 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001780 }
1781}
1782
1783void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1784 VkResult result) {
1785 for (uint32_t i = 0; i < fenceCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001786 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001787 if (fence_state) {
1788 if (fence_state->scope == kSyncScopeInternal) {
1789 fence_state->state = FENCE_UNSIGNALED;
1790 } else if (fence_state->scope == kSyncScopeExternalTemporary) {
1791 fence_state->scope = kSyncScopeInternal;
locke-lunargd556cc32019-09-17 01:21:23 -06001792 }
1793 }
1794 }
1795}
1796
locke-lunargd556cc32019-09-17 01:21:23 -06001797void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1798 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001799 Destroy<FRAMEBUFFER_STATE>(framebuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001800}
1801
1802void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
1803 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001804 Destroy<RENDER_PASS_STATE>(renderPass);
locke-lunargd556cc32019-09-17 01:21:23 -06001805}
1806
1807void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
1808 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
1809 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001810 Add(std::make_shared<FENCE_STATE>(*pFence, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001811}
1812
1813bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1814 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1815 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001816 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001817 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
1818 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1819 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1820 cgpl_state->pipe_state.reserve(count);
1821 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001822 if (pCreateInfos[i].renderPass != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001823 cgpl_state->pipe_state.push_back(
1824 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetShared<RENDER_PASS_STATE>(pCreateInfos[i].renderPass),
1825 GetShared<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
amhagana448ea52021-11-02 14:09:14 -04001826 } else if (enabled_features.dynamic_rendering_features.dynamicRendering) {
1827 auto dynamic_rendering = LvlFindInChain<VkPipelineRenderingCreateInfoKHR>(pCreateInfos[i].pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001828 cgpl_state->pipe_state.push_back(
1829 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], std::make_shared<RENDER_PASS_STATE>(dynamic_rendering),
1830 GetShared<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001831 }
locke-lunargd556cc32019-09-17 01:21:23 -06001832 }
1833 return false;
1834}
1835
1836void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1837 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1838 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1839 VkResult result, void *cgpl_state_data) {
1840 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1841 // This API may create pipelines regardless of the return value
1842 for (uint32_t i = 0; i < count; i++) {
1843 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001844 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001845 Add(std::move((cgpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001846 }
1847 }
1848 cgpl_state->pipe_state.clear();
1849}
1850
1851bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1852 const VkComputePipelineCreateInfo *pCreateInfos,
1853 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001854 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001855 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1856 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1857 ccpl_state->pipe_state.reserve(count);
1858 for (uint32_t i = 0; i < count; i++) {
1859 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001860 ccpl_state->pipe_state.push_back(
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001861 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetShared<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001862 }
1863 return false;
1864}
1865
1866void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1867 const VkComputePipelineCreateInfo *pCreateInfos,
1868 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1869 VkResult result, void *ccpl_state_data) {
1870 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1871
1872 // This API may create pipelines regardless of the return value
1873 for (uint32_t i = 0; i < count; i++) {
1874 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001875 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001876 Add(std::move((ccpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001877 }
1878 }
1879 ccpl_state->pipe_state.clear();
1880}
1881
1882bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
1883 uint32_t count,
1884 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1885 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001886 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001887 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1888 crtpl_state->pipe_state.reserve(count);
1889 for (uint32_t i = 0; i < count; i++) {
1890 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001891 crtpl_state->pipe_state.push_back(
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001892 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetShared<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001893 }
1894 return false;
1895}
1896
1897void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
1898 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1899 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
1900 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1901 // This API may create pipelines regardless of the return value
1902 for (uint32_t i = 0; i < count; i++) {
1903 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001904 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001905 Add(std::move((crtpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001906 }
1907 }
1908 crtpl_state->pipe_state.clear();
1909}
1910
sourav parmarcd5fb182020-07-17 12:58:44 -07001911bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
1912 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001913 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
1914 const VkAllocationCallbacks *pAllocator,
1915 VkPipeline *pPipelines, void *crtpl_state_data) const {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001916 auto crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001917 crtpl_state->pipe_state.reserve(count);
1918 for (uint32_t i = 0; i < count; i++) {
1919 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001920 crtpl_state->pipe_state.push_back(
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001921 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetShared<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001922 }
1923 return false;
1924}
1925
sourav parmarcd5fb182020-07-17 12:58:44 -07001926void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
1927 VkPipelineCache pipelineCache, uint32_t count,
1928 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
1929 const VkAllocationCallbacks *pAllocator,
1930 VkPipeline *pPipelines, VkResult result,
1931 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001932 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
1933 // This API may create pipelines regardless of the return value
1934 for (uint32_t i = 0; i < count; i++) {
1935 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001936 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001937 Add(std::move((crtpl_state->pipe_state)[i]));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001938 }
1939 }
1940 crtpl_state->pipe_state.clear();
1941}
1942
locke-lunargd556cc32019-09-17 01:21:23 -06001943void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1944 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
1945 VkResult result) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001946 Add(std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo));
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001947 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1948 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06001949 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001950 }
locke-lunargd556cc32019-09-17 01:21:23 -06001951}
1952
1953void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
1954 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1955 const VkAllocationCallbacks *pAllocator,
1956 VkDescriptorSetLayout *pSetLayout, VkResult result) {
1957 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001958 Add(std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout));
locke-lunargd556cc32019-09-17 01:21:23 -06001959}
1960
locke-lunargd556cc32019-09-17 01:21:23 -06001961void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1962 const VkAllocationCallbacks *pAllocator,
1963 VkPipelineLayout *pPipelineLayout, VkResult result) {
1964 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001965 Add(std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001966}
1967
1968void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1969 const VkAllocationCallbacks *pAllocator,
1970 VkDescriptorPool *pDescriptorPool, VkResult result) {
1971 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001972 Add(std::make_shared<DESCRIPTOR_POOL_STATE>(this, *pDescriptorPool, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001973}
1974
1975void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1976 VkDescriptorPoolResetFlags flags, VkResult result) {
1977 if (VK_SUCCESS != result) return;
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06001978 auto pool = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
1979 if (pool) {
1980 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001981 }
locke-lunargd556cc32019-09-17 01:21:23 -06001982}
1983
1984bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
1985 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001986 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001987 // Always update common data
1988 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
1989 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
1990 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
1991
1992 return false;
1993}
1994
1995// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
1996void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
1997 VkDescriptorSet *pDescriptorSets, VkResult result,
1998 void *ads_state_data) {
1999 if (VK_SUCCESS != result) return;
2000 // All the updates are contained in a single cvdescriptorset function
2001 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2002 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002003 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(pAllocateInfo->descriptorPool);
2004 if (pool_state) {
2005 pool_state->Allocate(pAllocateInfo, pDescriptorSets, ads_state);
2006 }
locke-lunargd556cc32019-09-17 01:21:23 -06002007}
2008
2009void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2010 const VkDescriptorSet *pDescriptorSets) {
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002011 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2012 if (pool_state) {
2013 pool_state->Free(count, pDescriptorSets);
locke-lunargd556cc32019-09-17 01:21:23 -06002014 }
2015}
2016
2017void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2018 const VkWriteDescriptorSet *pDescriptorWrites,
2019 uint32_t descriptorCopyCount,
2020 const VkCopyDescriptorSet *pDescriptorCopies) {
2021 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2022 pDescriptorCopies);
2023}
2024
2025void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002026 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002027 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002028 auto pool = GetShared<COMMAND_POOL_STATE>(pCreateInfo->commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002029 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002030 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002031 }
2032}
2033
locke-lunargd556cc32019-09-17 01:21:23 -06002034void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2035 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002036 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002037 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002038
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002039 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002040}
2041
2042void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002043 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002044 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002045
2046 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002047}
2048
2049void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2050 VkResult result) {
2051 if (VK_SUCCESS == result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002052 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002053 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002054 }
2055}
2056
2057CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2058 // initially assume everything is static state
2059 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2060
2061 if (ds) {
2062 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002063 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002064 }
2065 }
locke-lunargd556cc32019-09-17 01:21:23 -06002066 return flags;
2067}
2068
2069// Validation cache:
2070// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002071
2072void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2073 VkPipeline pipeline) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002074 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002075 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002076 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002077
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002078 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002079 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002080 const auto &create_info = pipe_state->create_info.graphics;
2081 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2082 const auto *viewport_state = create_info.pViewportState;
2083 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002084 cb_state->status &= ~cb_state->static_status;
Jeremy Gebben11af9792021-08-20 10:20:09 -06002085 cb_state->static_status = MakeStaticStateMask(dynamic_state->ptr());
locke-lunargd556cc32019-09-17 01:21:23 -06002086 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002087 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002088
2089 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002090 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2091 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002092 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002093 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002094 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002095 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002096 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002097 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002098
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002099 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002100 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2101 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2102 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002103 if (!has_dynamic_viewport_count) {
2104 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002105 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002106 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2107 // should become = ~uint32_t(0) if the other interpretation is correct.
2108 }
2109 }
2110 if (!has_dynamic_scissor_count) {
2111 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002112 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002113 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2114 // should become = ~uint32_t(0) if the other interpretation is correct.
2115 }
2116 }
locke-lunargd556cc32019-09-17 01:21:23 -06002117 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002118 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2119 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002120 if (!disabled[command_buffer_state]) {
2121 cb_state->AddChild(pipe_state);
2122 }
locke-lunargb8be8222020-10-20 00:34:37 -06002123 for (auto &slot : pipe_state->active_slots) {
2124 for (auto &req : slot.second) {
2125 for (auto &sampler : req.second.samplers_used_by_image) {
2126 for (auto &des : sampler) {
2127 des.second = nullptr;
2128 }
2129 }
2130 }
2131 }
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002132 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
locke-lunargd556cc32019-09-17 01:21:23 -06002133}
2134
2135void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2136 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002137 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002138 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002139 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2140 cb_state->viewportMask |= bits;
2141 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002142
2143 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2144 for (size_t i = 0; i < viewportCount; ++i) {
2145 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2146 }
locke-lunargd556cc32019-09-17 01:21:23 -06002147}
2148
2149void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2150 uint32_t exclusiveScissorCount,
2151 const VkRect2D *pExclusiveScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002152 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002153 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002154 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2155 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002156}
2157
2158void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2159 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002160 if (disabled[command_buffer_state]) return;
2161
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002162 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002163 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002164
2165 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002166 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002167 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002168 }
2169}
2170
2171void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2172 uint32_t viewportCount,
2173 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002174 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002175 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002176 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2177 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002178}
2179
2180void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2181 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2182 const VkAllocationCallbacks *pAllocator,
2183 VkAccelerationStructureNV *pAccelerationStructure,
2184 VkResult result) {
2185 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002186 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002187
2188 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002189 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002190 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002191 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002192 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2193
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002194 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002195 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002196 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002197 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2198 &as_state->build_scratch_memory_requirements);
2199
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002200 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002201 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002202 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002203 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2204 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002205 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002206 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002207}
2208
Jeff Bolz95176d02020-04-01 00:36:16 -05002209void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2210 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2211 const VkAllocationCallbacks *pAllocator,
2212 VkAccelerationStructureKHR *pAccelerationStructure,
2213 VkResult result) {
2214 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002215 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002216 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002217 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002218}
2219
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002220void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2221 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2222 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2223 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2224 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002225 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002226 if (dst_as_state != nullptr) {
2227 dst_as_state->Build(&pInfos[i]);
2228 }
2229 }
2230}
2231
sourav parmarcd5fb182020-07-17 12:58:44 -07002232void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2233 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2234 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002235 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002236 if (cb_state == nullptr) {
2237 return;
2238 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002239 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002240 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002241 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002242 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002243 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002244 if (!disabled[command_buffer_state]) {
2245 cb_state->AddChild(dst_as_state);
2246 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002247 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002248 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002249 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002250 if (src_as_state != nullptr) {
2251 cb_state->AddChild(src_as_state);
2252 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002253 }
2254 }
2255 cb_state->hasBuildAccelerationStructureCmd = true;
2256}
2257
2258void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2259 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2260 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2261 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002262 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002263 if (cb_state == nullptr) {
2264 return;
2265 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002266 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002267 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002268 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002269 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002270 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002271 if (!disabled[command_buffer_state]) {
2272 cb_state->AddChild(dst_as_state);
2273 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002274 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002275 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002276 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002277 if (src_as_state != nullptr) {
2278 cb_state->AddChild(src_as_state);
2279 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002280 }
2281 }
2282 cb_state->hasBuildAccelerationStructureCmd = true;
2283}
locke-lunargd556cc32019-09-17 01:21:23 -06002284void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002285 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002286 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002287 if (as_state != nullptr) {
2288 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2289 as_state->memory_requirements = *pMemoryRequirements;
2290 as_state->memory_requirements_checked = true;
2291 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2292 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2293 as_state->build_scratch_memory_requirements_checked = true;
2294 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2295 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2296 as_state->update_scratch_memory_requirements_checked = true;
2297 }
2298 }
2299}
2300
sourav parmarcd5fb182020-07-17 12:58:44 -07002301void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2302 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002303 if (VK_SUCCESS != result) return;
2304 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002305 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002306
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002307 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002308 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002309 // Track objects tied to memory
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002310 auto mem_state = GetShared<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002311 if (mem_state) {
2312 as_state->SetMemBinding(mem_state, info.memoryOffset);
2313 }
locke-lunargd556cc32019-09-17 01:21:23 -06002314
2315 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002316 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002317 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002318 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2319 }
2320 }
2321 }
2322}
2323
2324void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2325 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2326 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002327 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002328 if (cb_state == nullptr) {
2329 return;
2330 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002331 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002332
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002333 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002334 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002335 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002336 if (!disabled[command_buffer_state]) {
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002337 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002338 }
locke-lunargd556cc32019-09-17 01:21:23 -06002339 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002340 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002341 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002342 if (src_as_state != nullptr) {
2343 cb_state->AddChild(src_as_state);
2344 }
locke-lunargd556cc32019-09-17 01:21:23 -06002345 }
2346 cb_state->hasBuildAccelerationStructureCmd = true;
2347}
2348
2349void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2350 VkAccelerationStructureNV dst,
2351 VkAccelerationStructureNV src,
2352 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002353 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002354 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002355 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2356 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002357 if (!disabled[command_buffer_state]) {
2358 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2359 }
locke-lunargd556cc32019-09-17 01:21:23 -06002360 if (dst_as_state != nullptr && src_as_state != nullptr) {
2361 dst_as_state->built = true;
2362 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002363 }
2364 }
2365}
2366
Jeff Bolz95176d02020-04-01 00:36:16 -05002367void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2368 VkAccelerationStructureKHR accelerationStructure,
2369 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002370 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002371}
2372
Jeff Bolz95176d02020-04-01 00:36:16 -05002373void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2374 VkAccelerationStructureNV accelerationStructure,
2375 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002376 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002377}
2378
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002379void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2380 uint32_t viewportCount,
2381 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002382 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002383 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002384}
2385
locke-lunargd556cc32019-09-17 01:21:23 -06002386void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002387 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002388 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002389}
2390
2391void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2392 uint16_t lineStipplePattern) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002393 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002394 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002395}
2396
2397void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2398 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002399 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002400 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002401}
2402
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002403void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2404 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002405 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002406 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002407 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2408 cb_state->scissorMask |= bits;
2409 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002410}
2411
locke-lunargd556cc32019-09-17 01:21:23 -06002412void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002413 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002414 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002415}
2416
2417void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2418 float maxDepthBounds) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002419 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002420 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002421}
2422
2423void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2424 uint32_t compareMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002425 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002426 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002427}
2428
2429void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2430 uint32_t writeMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002431 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002432 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002433}
2434
2435void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2436 uint32_t reference) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002437 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002438 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002439}
2440
locke-lunargd556cc32019-09-17 01:21:23 -06002441// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2442void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2443 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2444 uint32_t firstSet, uint32_t setCount,
2445 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2446 const uint32_t *pDynamicOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002447 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002448 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002449 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
locke-lunargd556cc32019-09-17 01:21:23 -06002450
2451 // Resize binding arrays
2452 uint32_t last_set_index = firstSet + setCount - 1;
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002453 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2454 if (last_set_index >= cb_state->lastBound[lv_bind_point].per_set.size()) {
2455 cb_state->lastBound[lv_bind_point].per_set.resize(last_set_index + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06002456 }
2457
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002458 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout, firstSet, setCount, pDescriptorSets, nullptr,
2459 dynamicOffsetCount, pDynamicOffsets);
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002460 cb_state->lastBound[lv_bind_point].pipeline_layout = layout;
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002461 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002462}
2463
locke-lunargd556cc32019-09-17 01:21:23 -06002464void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2465 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2466 uint32_t set, uint32_t descriptorWriteCount,
2467 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002468 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2469 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002470 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout, set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002471}
2472
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002473void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2474 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2475 const void *pValues) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002476 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002477 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002478 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002479 cb_state->ResetPushConstantDataIfIncompatible(Get<PIPELINE_LAYOUT_STATE>(layout));
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002480
2481 auto &push_constant_data = cb_state->push_constant_data;
2482 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2483 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002484 cb_state->push_constant_pipeline_layout_set = layout;
2485
2486 auto flags = stageFlags;
2487 uint32_t bit_shift = 0;
2488 while (flags) {
2489 if (flags & 1) {
2490 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2491 const auto it = cb_state->push_constant_data_update.find(flag);
2492
2493 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002494 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002495 }
2496 }
2497 flags = flags >> 1;
2498 ++bit_shift;
2499 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002500 }
2501}
2502
locke-lunargd556cc32019-09-17 01:21:23 -06002503void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2504 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002505 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002506
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002507 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002508 cb_state->index_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(buffer);
2509 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002510 cb_state->index_buffer_binding.offset = offset;
2511 cb_state->index_buffer_binding.index_type = indexType;
2512 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002513 if (!disabled[command_buffer_state]) {
2514 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state.get());
2515 }
locke-lunargd556cc32019-09-17 01:21:23 -06002516}
2517
2518void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2519 uint32_t bindingCount, const VkBuffer *pBuffers,
2520 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002521 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002522 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002523
2524 uint32_t end = firstBinding + bindingCount;
2525 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2526 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2527 }
2528
2529 for (uint32_t i = 0; i < bindingCount; ++i) {
2530 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07002531 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002532 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002533 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2534 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002535 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002536 if (pBuffers[i] && !disabled[command_buffer_state]) {
2537 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Jeff Bolz165818a2020-05-08 11:19:03 -05002538 }
locke-lunargd556cc32019-09-17 01:21:23 -06002539 }
2540}
2541
2542void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2543 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002544 if (disabled[command_buffer_state]) return;
2545
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002546 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002547 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002548}
2549
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002550void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2551 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002552 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002553 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002554}
2555
2556void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2557 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002558 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002559 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2560
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002561 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2562 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002563}
2564
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002565void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2566 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002567 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002568 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002569}
2570
2571void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2572 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002573 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002574 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002575}
2576
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002577void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2578 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2579 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2580 uint32_t bufferMemoryBarrierCount,
2581 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2582 uint32_t imageMemoryBarrierCount,
2583 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002584 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002585 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
2586 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2587 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002588}
2589
2590void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2591 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002592 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002593 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06002594 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002595 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06002596 }
2597}
2598
2599void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2600 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2601 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2602 uint32_t bufferMemoryBarrierCount,
2603 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2604 uint32_t imageMemoryBarrierCount,
2605 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002606 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2607 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2608 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2609 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002610}
2611
2612void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2613 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002614 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2615 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2616 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002617}
2618
locke-lunargd556cc32019-09-17 01:21:23 -06002619void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2620 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002621 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002622
locke-lunargd556cc32019-09-17 01:21:23 -06002623 QueryObject query = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002624 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002625 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002626 if (!disabled[query_validation]) {
2627 cb_state->BeginQuery(query);
2628 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002629 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002630 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002631 cb_state->AddChild(pool_state);
2632 }
locke-lunargd556cc32019-09-17 01:21:23 -06002633}
2634
2635void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002636 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002637 QueryObject query_obj = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002638 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002639 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002640 if (!disabled[query_validation]) {
2641 cb_state->EndQuery(query_obj);
2642 }
2643 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002644 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002645 cb_state->AddChild(pool_state);
2646 }
locke-lunargd556cc32019-09-17 01:21:23 -06002647}
2648
2649void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2650 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002651 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002652 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002653
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002654 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002655 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002656
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002657 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002658 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002659 cb_state->AddChild(pool_state);
2660 }
locke-lunargd556cc32019-09-17 01:21:23 -06002661}
2662
2663void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2664 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2665 VkDeviceSize dstOffset, VkDeviceSize stride,
2666 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002667 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2668
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002669 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002670 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002671 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002672 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002673 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002674 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002675}
2676
2677void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2678 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002679 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002680 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002681}
2682
2683void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2684 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2685 uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002686 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002687 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002688}
2689
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002690void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2691 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2692 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2693 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002694 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002695 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002696 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002697 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002698 cb_state->AddChild(pool_state);
2699 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002700 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002701}
2702
locke-lunargd556cc32019-09-17 01:21:23 -06002703void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2704 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2705 VkResult result) {
2706 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002707
Jeremy Gebben88f58142021-06-01 10:07:52 -06002708 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002709 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002710 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002711
locke-lunargd556cc32019-09-17 01:21:23 -06002712 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002713 views[i] = GetShared<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002714 }
2715 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002716
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002717 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, GetShared<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002718 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002719}
2720
locke-lunargd556cc32019-09-17 01:21:23 -06002721void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2722 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2723 VkResult result) {
2724 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002725 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002726}
2727
Mike Schuchardt2df08912020-12-15 16:28:09 -08002728void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002729 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2730 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002731 if (VK_SUCCESS != result) return;
2732
Jeremy Gebben082a9832021-10-28 13:40:11 -06002733 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002734}
2735
Mike Schuchardt2df08912020-12-15 16:28:09 -08002736void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002737 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2738 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002739 if (VK_SUCCESS != result) return;
2740
Jeremy Gebben082a9832021-10-28 13:40:11 -06002741 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002742}
2743
locke-lunargd556cc32019-09-17 01:21:23 -06002744void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2745 const VkRenderPassBeginInfo *pRenderPassBegin,
2746 VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002747 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002748 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002749}
2750
2751void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2752 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002753 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002754 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002755 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002756}
2757
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002758void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2759 uint32_t counterBufferCount,
2760 const VkBuffer *pCounterBuffers,
2761 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002762 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002763
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002764 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002765 cb_state->transform_feedback_active = true;
2766}
2767
2768void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2769 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2770 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002771 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002772
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002773 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002774 cb_state->transform_feedback_active = false;
2775}
2776
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002777void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2778 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002779 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002780
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002781 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002782 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002783 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2784 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002785}
2786
2787void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002788 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002789
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002790 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002791 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002792 cb_state->conditional_rendering_inside_render_pass = false;
2793 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002794}
2795
amhagana448ea52021-11-02 14:09:14 -04002796void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002797 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002798 cb_state->activeRenderPass = nullptr;
2799}
2800
2801void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2802 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002803 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002804 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2805}
2806
2807void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
2808 RecordCmdEndRenderingRenderPassState(commandBuffer);
2809}
2810
Tony-LunarG977448c2019-12-02 14:52:02 -07002811void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2812 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002813 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002814 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002815 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07002816}
2817
locke-lunargd556cc32019-09-17 01:21:23 -06002818void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002819 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002820 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002821}
2822
2823void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002824 const VkSubpassBeginInfo *pSubpassBeginInfo,
2825 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002826 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002827 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002828}
2829
Tony-LunarG977448c2019-12-02 14:52:02 -07002830void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002831 const VkSubpassBeginInfo *pSubpassBeginInfo,
2832 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002833 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002834 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002835}
2836
2837void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002838 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002839 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06002840}
2841
2842void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002843 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002844 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002845 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06002846}
2847
Tony-LunarG977448c2019-12-02 14:52:02 -07002848void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002849 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002850 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002851 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07002852}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002853
locke-lunargd556cc32019-09-17 01:21:23 -06002854void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
2855 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002856 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002857
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002858 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002859}
2860
2861void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
2862 VkFlags flags, void **ppData, VkResult result) {
2863 if (VK_SUCCESS != result) return;
2864 RecordMappedMemory(mem, offset, size, ppData);
2865}
2866
2867void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002868 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06002869 if (mem_info) {
2870 mem_info->mapped_range = MemRange();
2871 mem_info->p_driver_data = nullptr;
2872 }
2873}
2874
2875void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben8ee02af2021-07-16 10:15:55 -06002876 auto image_state = GetShared<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06002877 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06002878 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
2879 // See: VUID-vkGetImageSubresourceLayout-image-01895
2880 image_state->fragment_encoder =
2881 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002882 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002883 if (swapchain_info) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002884 auto swapchain = GetShared<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06002885 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002886 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07002887
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002888 if (!swapchain_image.fake_base_address) {
2889 auto size = image_state->fragment_encoder->TotalSize();
2890 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002891 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002892 // All images bound to this swapchain and index are aliases
2893 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06002894 }
2895 } else {
2896 // Track bound memory range information
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002897 auto mem_info = GetShared<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06002898 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002899 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06002900 }
locke-lunargd556cc32019-09-17 01:21:23 -06002901 }
locke-lunargd556cc32019-09-17 01:21:23 -06002902 }
2903}
2904
2905void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2906 VkDeviceSize memoryOffset, VkResult result) {
2907 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002908 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002909 bind_info.image = image;
2910 bind_info.memory = mem;
2911 bind_info.memoryOffset = memoryOffset;
2912 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06002913}
2914
2915void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002916 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002917 if (VK_SUCCESS != result) return;
2918 for (uint32_t i = 0; i < bindInfoCount; i++) {
2919 UpdateBindImageMemoryState(pBindInfos[i]);
2920 }
2921}
2922
2923void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002924 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002925 if (VK_SUCCESS != result) return;
2926 for (uint32_t i = 0; i < bindInfoCount; i++) {
2927 UpdateBindImageMemoryState(pBindInfos[i]);
2928 }
2929}
2930
2931void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002932 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06002933 if (event_state) {
2934 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
2935 }
locke-lunargd556cc32019-09-17 01:21:23 -06002936}
2937
2938void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
2939 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
2940 VkResult result) {
2941 if (VK_SUCCESS != result) return;
2942 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
2943 pImportSemaphoreFdInfo->flags);
2944}
2945
2946void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002947 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002948 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Mike Schuchardt2df08912020-12-15 16:28:09 -08002949 if (semaphore_state && handle_type != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06002950 // Cannot track semaphore state once it is exported, except for Sync FD handle types which have copy transference
2951 semaphore_state->scope = kSyncScopeExternalPermanent;
2952 }
2953}
2954
2955#ifdef VK_USE_PLATFORM_WIN32_KHR
2956void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
2957 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
2958 if (VK_SUCCESS != result) return;
2959 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
2960 pImportSemaphoreWin32HandleInfo->flags);
2961}
2962
2963void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
2964 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
2965 HANDLE *pHandle, VkResult result) {
2966 if (VK_SUCCESS != result) return;
2967 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
2968}
2969
2970void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
2971 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
2972 if (VK_SUCCESS != result) return;
2973 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
2974 pImportFenceWin32HandleInfo->flags);
2975}
2976
2977void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
2978 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
2979 HANDLE *pHandle, VkResult result) {
2980 if (VK_SUCCESS != result) return;
2981 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
2982}
2983#endif
2984
2985void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
2986 VkResult result) {
2987 if (VK_SUCCESS != result) return;
2988 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
2989}
2990
Mike Schuchardt2df08912020-12-15 16:28:09 -08002991void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
2992 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002993 auto fence_node = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06002994 if (fence_node && fence_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08002995 if ((handle_type == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_FENCE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06002996 fence_node->scope == kSyncScopeInternal) {
2997 fence_node->scope = kSyncScopeExternalTemporary;
2998 } else {
2999 fence_node->scope = kSyncScopeExternalPermanent;
3000 }
3001 }
3002}
3003
3004void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3005 VkResult result) {
3006 if (VK_SUCCESS != result) return;
3007 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3008}
3009
Mike Schuchardt2df08912020-12-15 16:28:09 -08003010void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003011 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003012 if (fence_state) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003013 if (handle_type != VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003014 // Export with reference transference becomes external
3015 fence_state->scope = kSyncScopeExternalPermanent;
3016 } else if (fence_state->scope == kSyncScopeInternal) {
3017 // Export with copy transference has a side effect of resetting the fence
3018 fence_state->state = FENCE_UNSIGNALED;
3019 }
3020 }
3021}
3022
3023void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3024 VkResult result) {
3025 if (VK_SUCCESS != result) return;
3026 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3027}
3028
3029void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3030 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3031 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003032 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003033}
3034
3035void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003036 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003037 SWAPCHAIN_NODE *old_swapchain_state) {
3038 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003039 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003040 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003041 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003042 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3043 surface_state->AddParent(swapchain.get());
3044 surface_state->swapchain = swapchain.get();
3045 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003046 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003047 } else {
3048 surface_state->swapchain = nullptr;
3049 }
3050 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003051 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003052 if (old_swapchain_state) {
3053 old_swapchain_state->retired = true;
3054 }
3055 return;
3056}
3057
3058void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3059 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3060 VkResult result) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003061 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003062 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003063 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003064}
3065
3066void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3067 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003068 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003069}
3070
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003071void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3072 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3073 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3074 VkResult result) {
3075 if (VK_SUCCESS != result) return;
3076 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003077 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003078}
3079
locke-lunargd556cc32019-09-17 01:21:23 -06003080void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
3081 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3082 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003083 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003084 if (semaphore_state) {
Jeremy Gebben57642982021-09-14 14:14:55 -06003085 semaphore_state->signaler.queue = nullptr;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003086 semaphore_state->signaled = false;
locke-lunargd556cc32019-09-17 01:21:23 -06003087 }
3088 }
3089
Tony-LunarG6f887e52021-07-27 11:23:14 -06003090 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003091 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3092 // 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
3093 // confused itself just as much.
3094 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3095 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3096 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003097 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003098 if (swapchain_data) {
3099 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003100 if (present_id_info) {
3101 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3102 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3103 }
3104 }
locke-lunargd556cc32019-09-17 01:21:23 -06003105 }
3106 }
3107 // Note: even though presentation is directed to a queue, there is no direct ordering between QP and subsequent work, so QP (and
3108 // its semaphore waits) /never/ participate in any completion proof.
3109}
3110
3111void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3112 const VkSwapchainCreateInfoKHR *pCreateInfos,
3113 const VkAllocationCallbacks *pAllocator,
3114 VkSwapchainKHR *pSwapchains, VkResult result) {
3115 if (pCreateInfos) {
3116 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003117 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003118 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003119 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003120 }
3121 }
3122}
3123
3124void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3125 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003126 auto fence_state = Get<FENCE_STATE>(fence);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003127 if (fence_state && fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003128 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3129 // import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003130 fence_state->state = FENCE_INFLIGHT;
Jeremy Gebben57642982021-09-14 14:14:55 -06003131 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 -06003132 }
3133
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003134 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003135 if (semaphore_state && semaphore_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003136 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3137 // temporary import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003138 semaphore_state->signaled = true;
Jeremy Gebben57642982021-09-14 14:14:55 -06003139 semaphore_state->signaler.queue = nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003140 }
3141
3142 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003143 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003144 if (swapchain_data) {
3145 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003146 }
3147}
3148
3149void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3150 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3151 VkResult result) {
3152 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3153 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3154}
3155
3156void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3157 uint32_t *pImageIndex, VkResult result) {
3158 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3159 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3160 pAcquireInfo->fence, pImageIndex);
3161}
3162
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003163std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3164 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3165}
3166
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003167void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3168 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3169 VkResult result) {
3170 if (result != VK_SUCCESS) {
3171 return;
3172 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003173 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003174 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003175 // this can fail if the allocator fails
3176 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3177 if (result != VK_SUCCESS) {
3178 return;
3179 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003180 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003181 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3182 if (result != VK_SUCCESS) {
3183 return;
3184 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003185
Jeremy Gebbend177d922021-10-28 13:42:10 -06003186 physical_device_map_.reserve(count);
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003187 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003188 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003189 }
3190}
3191
3192// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003193static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003194 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003195}
3196
3197void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3198 uint32_t *pQueueFamilyPropertyCount,
3199 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003200 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3201 assert(pd_state);
3202 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003203}
3204
3205void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003206 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003207 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3208 assert(pd_state);
3209 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003210}
3211
3212void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003213 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003214 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3215 assert(pd_state);
3216 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003217}
3218void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3219 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003220 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003221}
3222
Jeremy Gebben082a9832021-10-28 13:40:11 -06003223void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003224
3225void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3226 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3227 const VkAllocationCallbacks *pAllocator,
3228 VkSurfaceKHR *pSurface, VkResult result) {
3229 if (VK_SUCCESS != result) return;
3230 RecordVulkanSurface(pSurface);
3231}
3232
3233#ifdef VK_USE_PLATFORM_ANDROID_KHR
3234void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3235 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3236 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3237 VkResult result) {
3238 if (VK_SUCCESS != result) return;
3239 RecordVulkanSurface(pSurface);
3240}
3241#endif // VK_USE_PLATFORM_ANDROID_KHR
3242
3243#ifdef VK_USE_PLATFORM_IOS_MVK
3244void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3245 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3246 VkResult result) {
3247 if (VK_SUCCESS != result) return;
3248 RecordVulkanSurface(pSurface);
3249}
3250#endif // VK_USE_PLATFORM_IOS_MVK
3251
3252#ifdef VK_USE_PLATFORM_MACOS_MVK
3253void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3254 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3255 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3256 VkResult result) {
3257 if (VK_SUCCESS != result) return;
3258 RecordVulkanSurface(pSurface);
3259}
3260#endif // VK_USE_PLATFORM_MACOS_MVK
3261
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003262#ifdef VK_USE_PLATFORM_METAL_EXT
3263void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3264 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3265 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3266 VkResult result) {
3267 if (VK_SUCCESS != result) return;
3268 RecordVulkanSurface(pSurface);
3269}
3270#endif // VK_USE_PLATFORM_METAL_EXT
3271
locke-lunargd556cc32019-09-17 01:21:23 -06003272#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3273void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3274 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3275 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3276 VkResult result) {
3277 if (VK_SUCCESS != result) return;
3278 RecordVulkanSurface(pSurface);
3279}
3280#endif // VK_USE_PLATFORM_WAYLAND_KHR
3281
3282#ifdef VK_USE_PLATFORM_WIN32_KHR
3283void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3284 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3285 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3286 VkResult result) {
3287 if (VK_SUCCESS != result) return;
3288 RecordVulkanSurface(pSurface);
3289}
3290#endif // VK_USE_PLATFORM_WIN32_KHR
3291
3292#ifdef VK_USE_PLATFORM_XCB_KHR
3293void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3294 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3295 VkResult result) {
3296 if (VK_SUCCESS != result) return;
3297 RecordVulkanSurface(pSurface);
3298}
3299#endif // VK_USE_PLATFORM_XCB_KHR
3300
3301#ifdef VK_USE_PLATFORM_XLIB_KHR
3302void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3303 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3304 VkResult result) {
3305 if (VK_SUCCESS != result) return;
3306 RecordVulkanSurface(pSurface);
3307}
3308#endif // VK_USE_PLATFORM_XLIB_KHR
3309
Niklas Haas8b84af12020-04-19 22:20:11 +02003310void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3311 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3312 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3313 VkResult result) {
3314 if (VK_SUCCESS != result) return;
3315 RecordVulkanSurface(pSurface);
3316}
3317
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003318void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3319 VkSurfaceKHR surface,
3320 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3321 VkResult result) {
3322 if (VK_SUCCESS != result) return;
3323 auto surface_state = Get<SURFACE_STATE>(surface);
3324 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3325}
3326
3327void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3328 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3329 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3330 if (VK_SUCCESS != result) return;
3331 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3332 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3333}
3334
3335void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3336 VkSurfaceKHR surface,
3337 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3338 VkResult result) {
3339 auto surface_state = Get<SURFACE_STATE>(surface);
3340 VkSurfaceCapabilitiesKHR caps{
3341 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3342 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3343 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3344 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3345 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3346 };
3347 surface_state->SetCapabilities(physicalDevice, caps);
3348}
3349
locke-lunargd556cc32019-09-17 01:21:23 -06003350void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3351 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3352 VkBool32 *pSupported, VkResult result) {
3353 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003354 auto surface_state = Get<SURFACE_STATE>(surface);
3355 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3356}
3357
3358void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3359 VkSurfaceKHR surface,
3360 uint32_t *pPresentModeCount,
3361 VkPresentModeKHR *pPresentModes,
3362 VkResult result) {
3363 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3364
3365 if (pPresentModes) {
3366 auto surface_state = Get<SURFACE_STATE>(surface);
3367 surface_state->SetPresentModes(physicalDevice,
3368 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3369 }
3370}
3371
3372void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3373 uint32_t *pSurfaceFormatCount,
3374 VkSurfaceFormatKHR *pSurfaceFormats,
3375 VkResult result) {
3376 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3377
3378 if (pSurfaceFormats) {
3379 auto surface_state = Get<SURFACE_STATE>(surface);
3380 surface_state->SetFormats(physicalDevice,
3381 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3382 }
3383}
3384
3385void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3386 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3387 uint32_t *pSurfaceFormatCount,
3388 VkSurfaceFormat2KHR *pSurfaceFormats,
3389 VkResult result) {
3390 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3391
3392 if (pSurfaceFormats) {
3393 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3394 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3395 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3396 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3397 }
3398 surface_state->SetFormats(physicalDevice, std::move(fmts));
3399 }
locke-lunargd556cc32019-09-17 01:21:23 -06003400}
3401
locke-lunargd556cc32019-09-17 01:21:23 -06003402void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3403 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003404 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003405 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003406 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3407}
3408
3409void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003410 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003411 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003412 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3413}
3414
3415void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3416 const VkDebugUtilsLabelEXT *pLabelInfo) {
3417 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3418
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003419 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003420 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3421 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003422 cb_state->debug_label = LoggingLabel(pLabelInfo);
3423}
3424
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003425void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3426 uint32_t queueFamilyIndex,
3427 uint32_t *pCounterCount,
3428 VkPerformanceCounterKHR *pCounters) {
3429 if (NULL == pCounters) return;
3430
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003431 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3432 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003433
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003434 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3435 queue_family_counters->counters.resize(*pCounterCount);
3436 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003437
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003438 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003439}
3440
3441void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3442 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3443 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3444 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3445 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3446}
3447
3448void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3449 VkResult result) {
3450 if (result == VK_SUCCESS) performance_lock_acquired = true;
3451}
3452
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003453void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3454 performance_lock_acquired = false;
Jeremy Gebbend177d922021-10-28 13:42:10 -06003455 for (auto &cmd_buffer : command_buffer_map_) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003456 cmd_buffer.second->performance_lock_released = true;
3457 }
3458}
3459
locke-lunargd556cc32019-09-17 01:21:23 -06003460void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003461 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003462 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003463 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003464}
3465
3466void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003467 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003468 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003469 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003470}
3471
Mike Schuchardt2df08912020-12-15 16:28:09 -08003472void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3473 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003474 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003475}
3476
Mike Schuchardt2df08912020-12-15 16:28:09 -08003477void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3478 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3479 const VkAllocationCallbacks *pAllocator,
3480 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3481 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003482 if (VK_SUCCESS != result) return;
3483 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3484}
3485
3486void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003487 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3488 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003489 if (VK_SUCCESS != result) return;
3490 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3491}
3492
3493void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003494 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003495 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003496 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3497 assert(template_state);
3498 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003499 // TODO: Record template push descriptor updates
3500 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
3501 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state, pData);
3502 }
3503 }
3504}
3505
3506void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3507 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3508 const void *pData) {
3509 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3510}
3511
3512void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003513 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003514 const void *pData) {
3515 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3516}
3517
Mike Schuchardt2df08912020-12-15 16:28:09 -08003518void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3519 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3520 VkPipelineLayout layout, uint32_t set,
3521 const void *pData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003522 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003523
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003524 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003525 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003526 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003527 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003528 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003529 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003530 // Decode the template into a set of write updates
3531 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state, pData,
3532 dsl->GetDescriptorSetLayout());
3533 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data, set,
3534 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3535 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003536 }
3537}
3538
3539void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3540 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003541 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003542 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003543 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003544 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003545 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003546 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003547 }
3548}
3549
3550void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3551 uint32_t *pPropertyCount,
3552 VkDisplayPlanePropertiesKHR *pProperties,
3553 VkResult result) {
3554 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3555 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3556}
3557
3558void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3559 uint32_t *pPropertyCount,
3560 VkDisplayPlaneProperties2KHR *pProperties,
3561 VkResult result) {
3562 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3563 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3564}
3565
3566void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3567 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3568 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003569 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003570 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003571 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003572}
3573
3574void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3575 uint32_t query, uint32_t index) {
3576 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003577 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003578 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003579 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003580}
3581
3582void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3583 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003584 VkFormatFeatureFlags format_features = 0;
3585
3586 if (create_info->format != VK_FORMAT_UNDEFINED) {
3587 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003588 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003589 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3590 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003591 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003592
Jeremy Gebben082a9832021-10-28 13:40:11 -06003593 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003594}
3595
3596void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3597 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3598 const VkAllocationCallbacks *pAllocator,
3599 VkSamplerYcbcrConversion *pYcbcrConversion,
3600 VkResult result) {
3601 if (VK_SUCCESS != result) return;
3602 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3603}
3604
3605void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3606 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3607 const VkAllocationCallbacks *pAllocator,
3608 VkSamplerYcbcrConversion *pYcbcrConversion,
3609 VkResult result) {
3610 if (VK_SUCCESS != result) return;
3611 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3612}
3613
3614void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3615 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003616 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003617}
3618
3619void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3620 VkSamplerYcbcrConversion ycbcrConversion,
3621 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003622 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003623}
3624
Tony-LunarG977448c2019-12-02 14:52:02 -07003625void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3626 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003627 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003628 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003629
3630 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003631 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003632 if (!query_pool_state) return;
3633
3634 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003635 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3636 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003637 auto query_index = firstQuery + i;
3638 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003639 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003640 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003641 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003642 }
3643 }
locke-lunargd556cc32019-09-17 01:21:23 -06003644 }
3645}
3646
Tony-LunarG977448c2019-12-02 14:52:02 -07003647void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3648 uint32_t queryCount) {
3649 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3650}
3651
3652void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3653 uint32_t queryCount) {
3654 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3655}
3656
locke-lunargd556cc32019-09-17 01:21:23 -06003657void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003658 const UPDATE_TEMPLATE_STATE *template_state,
3659 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003660 // Translate the templated update into a normal update for validation...
3661 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3662 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3663 decoded_update.desc_writes.data(), 0, NULL);
3664}
3665
3666// Update the common AllocateDescriptorSetsData
3667void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003668 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003669 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003670 auto layout = GetShared<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003671 if (layout) {
3672 ds_data->layout_nodes[i] = layout;
3673 // Count total descriptors required per type
3674 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3675 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003676 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3677 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003678 }
3679 }
3680 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3681 }
3682}
3683
locke-lunargd556cc32019-09-17 01:21:23 -06003684void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3685 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003686 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003687 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003688}
3689
Tony-LunarG745150c2021-07-02 15:07:31 -06003690void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3691 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3692 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003693 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003694 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003695}
3696
locke-lunargd556cc32019-09-17 01:21:23 -06003697void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3698 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3699 uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003700 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003701 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003702}
3703
Tony-LunarG745150c2021-07-02 15:07:31 -06003704void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3705 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3706 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3707 const int32_t *pVertexOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003708 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003709 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003710}
3711
locke-lunargd556cc32019-09-17 01:21:23 -06003712void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3713 uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003714 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3715 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003716 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003717 if (!disabled[command_buffer_state]) {
3718 cb_state->AddChild(buffer_state);
3719 }
locke-lunargd556cc32019-09-17 01:21:23 -06003720}
3721
3722void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3723 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003724 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3725 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003726 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003727 if (!disabled[command_buffer_state]) {
3728 cb_state->AddChild(buffer_state);
3729 }
locke-lunargd556cc32019-09-17 01:21:23 -06003730}
3731
3732void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003733 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003734 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003735}
3736
3737void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3738 VkDeviceSize offset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003739 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003740 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003741 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003742 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003743 cb_state->AddChild(buffer_state);
3744 }
locke-lunargd556cc32019-09-17 01:21:23 -06003745}
3746
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003747void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3748 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003749 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003750 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3751}
3752
3753void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3754 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003755 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003756 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3757}
3758
Tony-LunarG977448c2019-12-02 14:52:02 -07003759void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3760 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003761 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003762 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003763 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003764 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003765 auto buffer_state = Get<BUFFER_STATE>(buffer);
3766 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003767 cb_state->AddChild(buffer_state);
3768 cb_state->AddChild(count_buffer_state);
3769 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003770}
3771
locke-lunargd556cc32019-09-17 01:21:23 -06003772void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3773 VkDeviceSize offset, VkBuffer countBuffer,
3774 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3775 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003776 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003777 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003778}
3779
3780void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3781 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3782 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003783 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003784 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003785}
3786
3787void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3788 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003789 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003790 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003791 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003792 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003793 auto buffer_state = Get<BUFFER_STATE>(buffer);
3794 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003795 cb_state->AddChild(buffer_state);
3796 cb_state->AddChild(count_buffer_state);
3797 }
locke-lunargd556cc32019-09-17 01:21:23 -06003798}
3799
3800void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3801 VkDeviceSize offset, VkBuffer countBuffer,
3802 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3803 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003804 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003805 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003806}
3807
3808void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3809 VkDeviceSize offset, VkBuffer countBuffer,
3810 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3811 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003812 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003813 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003814}
3815
3816void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3817 uint32_t firstTask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003818 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003819 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003820}
3821
3822void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3823 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003824 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003825 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003826 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003827 if (!disabled[command_buffer_state] && buffer_state) {
3828 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003829 }
3830}
3831
3832void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3833 VkDeviceSize offset, VkBuffer countBuffer,
3834 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3835 uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003836 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003837 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003838 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003839 auto buffer_state = Get<BUFFER_STATE>(buffer);
3840 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003841 if (buffer_state) {
3842 cb_state->AddChild(buffer_state);
3843 }
3844 if (count_buffer_state) {
3845 cb_state->AddChild(count_buffer_state);
3846 }
locke-lunargd556cc32019-09-17 01:21:23 -06003847 }
3848}
3849
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003850void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
3851 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
3852 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
3853 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
3854 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
3855 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
3856 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003857 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003858 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003859 cb_state->hasTraceRaysCmd = true;
3860}
3861
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003862void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
3863 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3864 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3865 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3866 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
3867 uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003868 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003869 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003870 cb_state->hasTraceRaysCmd = true;
3871}
3872
3873void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
3874 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3875 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3876 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3877 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
3878 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003879 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003880 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003881 cb_state->hasTraceRaysCmd = true;
3882}
3883
locke-lunargd556cc32019-09-17 01:21:23 -06003884void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
3885 const VkAllocationCallbacks *pAllocator,
3886 VkShaderModule *pShaderModule, VkResult result,
3887 void *csm_state_data) {
3888 if (VK_SUCCESS != result) return;
3889 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
3890
sfricke-samsung45996a42021-09-16 13:45:27 -07003891 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06003892 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003893 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
3894 csm_state->unique_shader_id)
3895 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003896 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06003897}
3898
John Zulauf22b0fbe2019-10-15 06:26:16 -06003899void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
3900 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
3901 VkResult result) {
3902 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003903 auto swapchain_state = GetShared<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003904
3905 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
3906
3907 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003908 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07003909 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07003910 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06003911
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003912 auto format_features =
3913 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
3914 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003915
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06003916 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003917 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003918 if (!swapchain_image.fake_base_address) {
3919 auto size = image_state->fragment_encoder->TotalSize();
3920 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07003921 }
3922
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003923 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003924 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003925 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06003926 }
3927 }
3928
3929 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003930 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
3931 }
3932}
sourav parmar35e7a002020-06-09 17:58:44 -07003933
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003934void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
3935 const VkCopyAccelerationStructureInfoKHR *pInfo,
3936 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003937 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
3938 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003939 if (dst_as_state != nullptr && src_as_state != nullptr) {
3940 dst_as_state->built = true;
3941 dst_as_state->build_info_khr = src_as_state->build_info_khr;
3942 }
3943}
3944
sourav parmar35e7a002020-06-09 17:58:44 -07003945void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
3946 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003947 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07003948 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003949 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003950 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
3951 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07003952 if (dst_as_state != nullptr && src_as_state != nullptr) {
3953 dst_as_state->built = true;
3954 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003955 if (!disabled[command_buffer_state]) {
3956 cb_state->AddChild(dst_as_state);
3957 cb_state->AddChild(src_as_state);
3958 }
sourav parmar35e7a002020-06-09 17:58:44 -07003959 }
3960 }
3961}
Piers Daniell39842ee2020-07-10 16:42:33 -06003962
3963void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003964 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003965 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003966}
3967
3968void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003969 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003970 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003971}
3972
3973void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
3974 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003975 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003976 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003977 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06003978}
3979
3980void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
3981 const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003982 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003983 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07003984 uint32_t bits = (1u << viewportCount) - 1u;
3985 cb_state->viewportWithCountMask |= bits;
3986 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00003987 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07003988 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07003989
3990 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
3991 for (size_t i = 0; i < viewportCount; ++i) {
3992 cb_state->dynamicViewports[i] = pViewports[i];
3993 }
Piers Daniell39842ee2020-07-10 16:42:33 -06003994}
3995
3996void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
3997 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003998 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003999 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004000 uint32_t bits = (1u << scissorCount) - 1u;
4001 cb_state->scissorWithCountMask |= bits;
4002 cb_state->trashedScissorMask &= ~bits;
4003 cb_state->scissorWithCountCount = scissorCount;
4004 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004005}
4006
4007void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4008 uint32_t bindingCount, const VkBuffer *pBuffers,
4009 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4010 const VkDeviceSize *pStrides) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004011 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004012 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004013
4014 uint32_t end = firstBinding + bindingCount;
4015 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4016 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4017 }
4018
4019 for (uint32_t i = 0; i < bindingCount; ++i) {
4020 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07004021 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004022 vertex_buffer_binding.offset = pOffsets[i];
4023 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4024 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4025 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004026 if (!disabled[command_buffer_state] && pBuffers[i]) {
4027 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Piers Daniell39842ee2020-07-10 16:42:33 -06004028 }
4029 }
4030}
4031
4032void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004033 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004034 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004035}
4036
4037void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004038 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004039 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004040}
4041
4042void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004043 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004044 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004045}
4046
4047void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4048 VkBool32 depthBoundsTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004049 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004050 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004051}
4052void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004053 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004054 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004055}
4056
4057void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4058 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4059 VkCompareOp compareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004060 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004061 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004062}
locke-lunarg4189aa22020-10-21 00:23:48 -06004063
4064void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4065 uint32_t discardRectangleCount,
4066 const VkRect2D *pDiscardRectangles) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004067 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004068 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004069}
4070
4071void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4072 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004073 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004074 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004075}
4076
4077void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4078 VkCoarseSampleOrderTypeNV sampleOrderType,
4079 uint32_t customSampleOrderCount,
4080 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004081 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004082 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004083}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004084
4085void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004086 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004087 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004088}
4089
4090void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004091 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004092 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004093}
4094
4095void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4096 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004097 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004098 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004099}
4100
4101void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004102 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004103 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004104}
4105
4106void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4107 VkBool32 primitiveRestartEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004108 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004109 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004110}
Piers Daniell924cd832021-05-18 13:48:47 -06004111
4112void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4113 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4114 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4115 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004116 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004117 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4118
4119 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4120 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4121 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004122 if (pipeline_state->create_info.graphics.pDynamicState) {
4123 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4124 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004125 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4126 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4127 break;
4128 }
4129 }
4130 }
4131 }
4132 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004133}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004134
4135void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004136 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004137 if (buffer_state) {
4138 // address is used for GPU-AV and ray tracing buffer validation
4139 buffer_state->deviceAddress = address;
4140 buffer_address_map_.emplace(address, buffer_state);
4141 }
4142}
4143
4144void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4145 VkDeviceAddress address) {
4146 RecordGetBufferDeviceAddress(pInfo, address);
4147}
4148
4149void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4150 VkDeviceAddress address) {
4151 RecordGetBufferDeviceAddress(pInfo, address);
4152}
4153
4154void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4155 VkDeviceAddress address) {
4156 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004157}
4158
4159std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4160 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004161 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004162}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004163
4164std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4165 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004166 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004167 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4168}