blob: 5dca8b690369720d91a5279a57c172772f0e6ffe [file] [log] [blame]
Yilong Lid23bc292022-01-02 22:06:12 -08001/* Copyright (c) 2015-2022 The Khronos Group Inc.
2 * Copyright (c) 2015-2022 Valve Corporation
3 * Copyright (c) 2015-2022 LunarG, Inc.
4 * Copyright (C) 2015-2022 Google Inc.
Tobias Hector6663c9b2020-11-05 10:18:02 +00005 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
locke-lunargd556cc32019-09-17 01:21:23 -06006 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Mark Lobodzinski <mark@lunarg.com>
20 * Author: Dave Houlton <daveh@lunarg.com>
21 * Shannon McPherson <shannon@lunarg.com>
Tobias Hector6663c9b2020-11-05 10:18:02 +000022 * Author: Tobias Hector <tobias.hector@amd.com>
locke-lunargd556cc32019-09-17 01:21:23 -060023 */
24
David Zhao Akeley44139b12021-04-26 16:16:13 -070025#include <algorithm>
locke-lunargd556cc32019-09-17 01:21:23 -060026#include <cmath>
locke-lunargd556cc32019-09-17 01:21:23 -060027
28#include "vk_enum_string_helper.h"
29#include "vk_format_utils.h"
30#include "vk_layer_data.h"
31#include "vk_layer_utils.h"
32#include "vk_layer_logging.h"
33#include "vk_typemap_helper.h"
34
35#include "chassis.h"
36#include "state_tracker.h"
37#include "shader_validation.h"
Jeremy Gebben74aa7622020-12-15 11:18:00 -070038#include "sync_utils.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060039#include "cmd_buffer_state.h"
40#include "render_pass_state.h"
locke-lunarg4189aa22020-10-21 00:23:48 -060041
Jeremy Gebben11af9792021-08-20 10:20:09 -060042extern template PIPELINE_STATE::PIPELINE_STATE(const ValidationStateTracker *, const VkRayTracingPipelineCreateInfoKHR *,
43 std::shared_ptr<const PIPELINE_LAYOUT_STATE> &&);
44extern template PIPELINE_STATE::PIPELINE_STATE(const ValidationStateTracker *, const VkRayTracingPipelineCreateInfoNV *,
45 std::shared_ptr<const PIPELINE_LAYOUT_STATE> &&);
46
Mark Lobodzinskib4ab6ac2020-04-02 13:12:06 -060047void ValidationStateTracker::InitDeviceValidationObject(bool add_obj, ValidationObject *inst_obj, ValidationObject *dev_obj) {
48 if (add_obj) {
49 instance_state = reinterpret_cast<ValidationStateTracker *>(GetValidationObject(inst_obj->object_dispatch, container_type));
50 // Call base class
51 ValidationObject::InitDeviceValidationObject(add_obj, inst_obj, dev_obj);
52 }
53}
54
John Zulauf2bc1fde2020-04-24 15:09:51 -060055// NOTE: Beware the lifespan of the rp_begin when holding the return. If the rp_begin isn't a "safe" copy, "IMAGELESS"
56// attachments won't persist past the API entry point exit.
Jeremy Gebben88f58142021-06-01 10:07:52 -060057static std::pair<uint32_t, const VkImageView *> GetFramebufferAttachments(const VkRenderPassBeginInfo &rp_begin,
58 const FRAMEBUFFER_STATE &fb_state) {
John Zulauf2bc1fde2020-04-24 15:09:51 -060059 const VkImageView *attachments = fb_state.createInfo.pAttachments;
60 uint32_t count = fb_state.createInfo.attachmentCount;
61 if (fb_state.createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -070062 const auto *framebuffer_attachments = LvlFindInChain<VkRenderPassAttachmentBeginInfo>(rp_begin.pNext);
John Zulauf2bc1fde2020-04-24 15:09:51 -060063 if (framebuffer_attachments) {
64 attachments = framebuffer_attachments->pAttachments;
65 count = framebuffer_attachments->attachmentCount;
66 }
67 }
68 return std::make_pair(count, attachments);
69}
70
John Zulauf64ffe552021-02-06 10:25:07 -070071template <typename ImageViewPointer, typename Get>
72std::vector<ImageViewPointer> GetAttachmentViewsImpl(const VkRenderPassBeginInfo &rp_begin, const FRAMEBUFFER_STATE &fb_state,
73 const Get &get_fn) {
74 std::vector<ImageViewPointer> views;
John Zulauf2bc1fde2020-04-24 15:09:51 -060075
76 const auto count_attachment = GetFramebufferAttachments(rp_begin, fb_state);
77 const auto attachment_count = count_attachment.first;
78 const auto *attachments = count_attachment.second;
79 views.resize(attachment_count, nullptr);
80 for (uint32_t i = 0; i < attachment_count; i++) {
81 if (attachments[i] != VK_NULL_HANDLE) {
John Zulauf64ffe552021-02-06 10:25:07 -070082 views[i] = get_fn(attachments[i]);
John Zulauf2bc1fde2020-04-24 15:09:51 -060083 }
84 }
85 return views;
86}
87
Jeremy Gebben9f537102021-10-05 16:37:12 -060088std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> ValidationStateTracker::GetAttachmentViews(
John Zulauf64ffe552021-02-06 10:25:07 -070089 const VkRenderPassBeginInfo &rp_begin, const FRAMEBUFFER_STATE &fb_state) const {
Jeremy Gebben9f537102021-10-05 16:37:12 -060090 auto get_fn = [this](VkImageView handle) { return this->Get<IMAGE_VIEW_STATE>(handle); };
John Zulauf64ffe552021-02-06 10:25:07 -070091 return GetAttachmentViewsImpl<std::shared_ptr<const IMAGE_VIEW_STATE>>(rp_begin, fb_state, get_fn);
92}
93
locke-lunargd556cc32019-09-17 01:21:23 -060094#ifdef VK_USE_PLATFORM_ANDROID_KHR
95// Android-specific validation that uses types defined only with VK_USE_PLATFORM_ANDROID_KHR
96// This could also move into a seperate core_validation_android.cpp file... ?
97
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -060098template <typename CreateInfo>
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 Gebben65975ed2021-10-29 11:16:10 -0600117 ahb_ext_formats_map.insert(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;
Jeremy Gebben65975ed2021-10-29 11:16:10 -0600272 buffer_address_map_.insert(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
James Rumble2f6e7bb2021-07-13 15:21:20 +0100273 }
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 Gebben9f537102021-10-05 16:37:12 -0600283 auto buffer_state = Get<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 Gebben9f537102021-10-05 16:37:12 -0600295 auto image_state = Get<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 Gebben9f537102021-10-05 16:37:12 -0600464 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu).get();
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 Gebbena15e2382021-09-30 11:49:32 -06001185 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1186 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1187 VkQueue queue = VK_NULL_HANDLE;
1188 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1189 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1190 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1191 get_info.flags = queue_info.flags;
1192 get_info.queueFamilyIndex = queue_info.queue_family_index;
1193 get_info.queueIndex = i;
1194 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1195 } else {
1196 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1197 }
1198 assert(queue != VK_NULL_HANDLE);
Mike Schuchardta9101d32021-11-12 12:24:08 -08001199 state_tracker->Add(std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index, queue_info.flags));
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001200 }
locke-lunargd556cc32019-09-17 01:21:23 -06001201 }
1202 }
1203}
1204
1205void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1206 if (!device) return;
1207
Jeremy Gebbend177d922021-10-28 13:42:10 -06001208 command_pool_map_.clear();
1209 assert(command_buffer_map_.empty());
1210 pipeline_map_.clear();
1211 render_pass_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001212
1213 // This will also delete all sets in the pool & remove them from setMap
Jeremy Gebbend177d922021-10-28 13:42:10 -06001214 descriptor_pool_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001215 // All sets should be removed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001216 assert(descriptor_set_map_.empty());
1217 desc_template_map_.clear();
1218 descriptor_set_layout_map_.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001219 // Because swapchains are associated with Surfaces, which are at instance level,
1220 // they need to be explicitly destroyed here to avoid continued references to
1221 // the device we're destroying.
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001222 for (auto &entry : swapchain_map_.snapshot()) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001223 entry.second->Destroy();
1224 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001225 swapchain_map_.clear();
1226 image_view_map_.clear();
1227 image_map_.clear();
1228 buffer_view_map_.clear();
1229 buffer_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001230 // Queues persist until device is destroyed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001231 queue_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001232}
1233
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001234void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1235 VkFence fence, VkResult result) {
1236 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001237 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001238
Jeremy Gebben57642982021-09-14 14:14:55 -06001239 uint64_t early_retire_seq = 0;
1240
1241 if (submitCount == 0) {
1242 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001243 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001244 early_retire_seq = queue_state->Submit(std::move(submission));
1245 }
locke-lunargd556cc32019-09-17 01:21:23 -06001246
1247 // Now process each individual submit
1248 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001249 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001250 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001251 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001252 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001253 uint64_t value{0};
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001254 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1255 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1256 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1257 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001258 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001259 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001260
locke-lunargd556cc32019-09-17 01:21:23 -06001261 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001262 uint64_t value{0};
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001263 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1264 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1265 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1266 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001267 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001268 }
1269
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001270 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001271 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001272
locke-lunargd556cc32019-09-17 01:21:23 -06001273 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001274 submission.AddCommandBuffer(Get<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001275 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001276 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001277 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001278 }
1279 auto submit_seq = queue_state->Submit(std::move(submission));
1280 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001281 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001282
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001283 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001284 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001285 }
1286}
1287
1288void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1289 VkFence fence, VkResult result) {
1290 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001291 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001292 uint64_t early_retire_seq = 0;
1293 if (submitCount == 0) {
1294 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001295 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001296 early_retire_seq = queue_state->Submit(std::move(submission));
1297 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001298
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001299 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1300 CB_SUBMISSION submission;
1301 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001302 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1303 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001304 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001305 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001306 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1307 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001308 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001309 }
1310 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1311 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1312
1313 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001314 submission.AddCommandBuffer(Get<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001315 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001316 if (submit_idx == (submitCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001317 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001318 }
1319 auto submit_seq = queue_state->Submit(std::move(submission));
1320 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001321 }
locke-lunargd556cc32019-09-17 01:21:23 -06001322 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001323 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001324 }
1325}
1326
1327void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1328 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1329 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001330 if (VK_SUCCESS != result) {
1331 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001332 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001333 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1334 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1335 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1336
1337 layer_data::optional<DedicatedBinding> dedicated_binding;
1338
1339 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1340 if (dedicated) {
1341 if (dedicated->buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001342 const auto buffer_state = Get<BUFFER_STATE>(dedicated->buffer);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001343 assert(buffer_state);
1344 if (!buffer_state) {
1345 return;
1346 }
1347 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1348 } else if (dedicated->image) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001349 const auto image_state = Get<IMAGE_STATE>(dedicated->image);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001350 assert(image_state);
1351 if (!image_state) {
1352 return;
1353 }
1354 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1355 }
1356 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001357 Add(std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
1358 std::move(dedicated_binding), physical_device_count));
locke-lunargd556cc32019-09-17 01:21:23 -06001359 return;
1360}
1361
1362void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001363 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001364 if (mem_info) {
1365 fake_memory.Free(mem_info->fake_base_address);
1366 }
1367 Destroy<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001368}
1369
1370void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1371 VkFence fence, VkResult result) {
1372 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001373 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001374
Jeremy Gebben57642982021-09-14 14:14:55 -06001375 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001376
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001377 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1378 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001379 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001380 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1381 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1382 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001383 auto buffer_state = Get<BUFFER_STATE>(bind_info.pBufferBinds[j].buffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001384 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001385 if (buffer_state && mem_state) {
1386 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1387 }
locke-lunargd556cc32019-09-17 01:21:23 -06001388 }
1389 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001390 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1391 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1392 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001393 auto image_state = Get<IMAGE_STATE>(bind_info.pImageOpaqueBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001394 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001395 if (image_state && mem_state) {
1396 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1397 }
locke-lunargd556cc32019-09-17 01:21:23 -06001398 }
1399 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001400 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1401 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1402 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001403 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1404 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001405 auto image_state = Get<IMAGE_STATE>(bind_info.pImageBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001406 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001407 if (image_state && mem_state) {
1408 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1409 }
locke-lunargd556cc32019-09-17 01:21:23 -06001410 }
1411 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001412 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001413 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001414 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001415 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001416 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001417 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001418 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001419 if (bind_idx == (bindInfoCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001420 submission.AddFence(Get<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001421 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001422 auto submit_seq = queue_state->Submit(std::move(submission));
1423 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001424 }
1425
1426 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001427 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001428 }
1429}
1430
1431void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1432 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1433 VkResult result) {
1434 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001435 Add(std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext)));
locke-lunargd556cc32019-09-17 01:21:23 -06001436}
1437
Mike Schuchardt2df08912020-12-15 16:28:09 -08001438void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1439 VkSemaphoreImportFlags flags) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001440 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
1441 if (semaphore_state) {
1442 semaphore_state->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06001443 }
1444}
1445
Mike Schuchardt2df08912020-12-15 16:28:09 -08001446void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001447 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001448 auto semaphore_state = Get<SEMAPHORE_STATE>(pSignalInfo->semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07001449 if (semaphore_state) {
1450 semaphore_state->RetireTimeline(pSignalInfo->value);
1451 }
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001452}
1453
locke-lunargd556cc32019-09-17 01:21:23 -06001454void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001455 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001456 if (mem_info) {
1457 mem_info->mapped_range.offset = offset;
1458 mem_info->mapped_range.size = size;
1459 mem_info->p_driver_data = *ppData;
1460 }
1461}
1462
locke-lunargd556cc32019-09-17 01:21:23 -06001463void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1464 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1465 if (VK_SUCCESS != result) return;
1466
1467 // When we know that all fences are complete we can clean/remove their CBs
1468 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1469 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001470 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001471 if (fence_state) {
1472 fence_state->Retire();
1473 }
locke-lunargd556cc32019-09-17 01:21:23 -06001474 }
1475 }
1476 // NOTE : Alternate case not handled here is when some fences have completed. In
1477 // this case for app to guarantee which fences completed it will have to call
1478 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1479}
1480
John Zulauff89de662020-04-13 18:57:34 -06001481void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1482 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001483 if (VK_SUCCESS != result) return;
1484
Jeremy Gebben15332642021-12-15 19:33:15 -07001485 // Same logic as vkWaitForFences(). If some semaphores are not signaled, we will get their status when
1486 // the application calls vkGetSemaphoreCounterValue() on each of them.
1487 if ((pWaitInfo->flags & VK_SEMAPHORE_WAIT_ANY_BIT) == 0 || pWaitInfo->semaphoreCount == 1) {
1488 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
1489 auto semaphore_state = Get<SEMAPHORE_STATE>(pWaitInfo->pSemaphores[i]);
1490 if (semaphore_state) {
1491 semaphore_state->RetireTimeline(pWaitInfo->pValues[i]);
1492 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001493 }
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) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001513 semaphore_state->RetireTimeline(*pValue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001514 }
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
Yilong Lice03a312022-01-02 02:08:35 -08001534void ValidationStateTracker::RecordGetDeviceQueueState(uint32_t queue_family_index, VkDeviceQueueCreateFlags flags, VkQueue queue) {
1535 if (Get<QUEUE_STATE>(queue) == nullptr) {
1536 Add(std::make_shared<QUEUE_STATE>(queue, queue_family_index, flags));
1537 }
1538}
1539
1540void ValidationStateTracker::PostCallRecordGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
1541 VkQueue *pQueue) {
1542 RecordGetDeviceQueueState(queueFamilyIndex, {}, *pQueue);
1543}
1544
1545void ValidationStateTracker::PostCallRecordGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
1546 RecordGetDeviceQueueState(pQueueInfo->queueFamilyIndex, pQueueInfo->flags, *pQueue);
1547}
1548
locke-lunargd556cc32019-09-17 01:21:23 -06001549void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1550 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001551 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001552 if (queue_state) {
1553 queue_state->Retire();
1554 }
locke-lunargd556cc32019-09-17 01:21:23 -06001555}
1556
1557void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1558 if (VK_SUCCESS != result) return;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001559 for (auto &queue : queue_map_.snapshot()) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001560 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001561 }
1562}
1563
1564void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001565 Destroy<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06001566}
1567
1568void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1569 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001570 Destroy<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001571}
1572
1573void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001574 Destroy<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06001575}
1576
1577void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1578 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001579 Destroy<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001580}
1581
locke-lunargd556cc32019-09-17 01:21:23 -06001582void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001583 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001584 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001585 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06001586 auto mem_state = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001587 if (mem_state) {
1588 buffer_state->SetMemBinding(mem_state, memoryOffset);
1589 }
locke-lunargd556cc32019-09-17 01:21:23 -06001590 }
1591}
1592
1593void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1594 VkDeviceSize memoryOffset, VkResult result) {
1595 if (VK_SUCCESS != result) return;
1596 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1597}
1598
1599void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001600 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001601 for (uint32_t i = 0; i < bindInfoCount; i++) {
1602 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1603 }
1604}
1605
1606void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001607 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001608 for (uint32_t i = 0; i < bindInfoCount; i++) {
1609 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1610 }
1611}
1612
Spencer Fricke6c127102020-04-16 06:25:20 -07001613void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001614 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001615 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001616 buffer_state->memory_requirements_checked = true;
1617 }
1618}
1619
1620void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1621 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001622 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001623}
1624
1625void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001626 const VkBufferMemoryRequirementsInfo2 *pInfo,
1627 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001628 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001629}
1630
1631void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001632 const VkBufferMemoryRequirementsInfo2 *pInfo,
1633 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001634 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001635}
1636
Spencer Fricke6c127102020-04-16 06:25:20 -07001637void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001638 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001639 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001640 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001641 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001642 if (plane_info != nullptr) {
1643 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001644 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001645 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001646 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001647 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001648 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001649 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001650 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001651 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001652 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001653 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001654 }
locke-lunargd556cc32019-09-17 01:21:23 -06001655 }
1656}
1657
1658void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1659 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001660 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001661}
1662
1663void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1664 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001665 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001666}
1667
1668void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1669 const VkImageMemoryRequirementsInfo2 *pInfo,
1670 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001671 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001672}
1673
locke-lunargd556cc32019-09-17 01:21:23 -06001674void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1675 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1676 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001677 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001678 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001679}
1680
1681void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001682 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1683 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001684 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001685 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001686}
1687
1688void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001689 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1690 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001691 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001692 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001693}
1694
1695void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1696 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001697 Destroy<SHADER_MODULE_STATE>(shaderModule);
locke-lunargd556cc32019-09-17 01:21:23 -06001698}
1699
1700void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1701 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001702 Destroy<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001703}
1704
1705void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1706 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001707 Destroy<PIPELINE_LAYOUT_STATE>(pipelineLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001708}
1709
1710void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1711 const VkAllocationCallbacks *pAllocator) {
1712 if (!sampler) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001713 auto sampler_state = Get<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001714 // Any bound cmd buffers are now invalid
1715 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001716 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1717 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1718 custom_border_color_sampler_count--;
1719 }
locke-lunargd556cc32019-09-17 01:21:23 -06001720 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001721 Destroy<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001722}
1723
1724void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1725 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001726 Destroy<cvdescriptorset::DescriptorSetLayout>(descriptorSetLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001727}
1728
1729void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1730 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001731 Destroy<DESCRIPTOR_POOL_STATE>(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001732}
1733
locke-lunargd556cc32019-09-17 01:21:23 -06001734void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1735 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001736 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1737 if (pool) {
1738 pool->Free(commandBufferCount, pCommandBuffers);
1739 }
locke-lunargd556cc32019-09-17 01:21:23 -06001740}
1741
1742void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1743 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1744 VkResult result) {
1745 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001746 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001747 Add(std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags));
locke-lunargd556cc32019-09-17 01:21:23 -06001748}
1749
1750void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1751 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1752 VkResult result) {
1753 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001754
1755 uint32_t index_count = 0, n_perf_pass = 0;
1756 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001757 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001758 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001759 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001760
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001761 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001762 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1763 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1764 switch (counter.scope) {
1765 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001766 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001767 break;
1768 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001769 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001770 break;
1771 default:
1772 break;
1773 }
1774 }
1775
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001776 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001777 }
1778
Jeremy Gebben082a9832021-10-28 13:40:11 -06001779 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 -06001780
locke-lunargd556cc32019-09-17 01:21:23 -06001781}
1782
1783void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1784 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001785 Destroy<COMMAND_POOL_STATE>(commandPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001786}
1787
1788void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1789 VkCommandPoolResetFlags flags, VkResult result) {
1790 if (VK_SUCCESS != result) return;
1791 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001792 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1793 if (pool) {
1794 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001795 }
1796}
1797
1798void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1799 VkResult result) {
1800 for (uint32_t i = 0; i < fenceCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001801 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001802 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07001803 fence_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001804 }
1805 }
1806}
1807
locke-lunargd556cc32019-09-17 01:21:23 -06001808void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1809 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001810 Destroy<FRAMEBUFFER_STATE>(framebuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001811}
1812
1813void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
1814 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001815 Destroy<RENDER_PASS_STATE>(renderPass);
locke-lunargd556cc32019-09-17 01:21:23 -06001816}
1817
1818void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
1819 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
1820 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001821 Add(std::make_shared<FENCE_STATE>(*pFence, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001822}
1823
1824bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1825 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1826 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001827 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001828 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
1829 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1830 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1831 cgpl_state->pipe_state.reserve(count);
1832 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001833 if (pCreateInfos[i].renderPass != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001834 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
1835 Get<RENDER_PASS_STATE>(pCreateInfos[i].renderPass),
1836 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
amhagana448ea52021-11-02 14:09:14 -04001837 } else if (enabled_features.dynamic_rendering_features.dynamicRendering) {
1838 auto dynamic_rendering = LvlFindInChain<VkPipelineRenderingCreateInfoKHR>(pCreateInfos[i].pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001839 cgpl_state->pipe_state.push_back(
1840 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], std::make_shared<RENDER_PASS_STATE>(dynamic_rendering),
Jeremy Gebben9f537102021-10-05 16:37:12 -06001841 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001842 }
locke-lunargd556cc32019-09-17 01:21:23 -06001843 }
1844 return false;
1845}
1846
1847void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1848 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1849 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1850 VkResult result, void *cgpl_state_data) {
1851 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1852 // This API may create pipelines regardless of the return value
1853 for (uint32_t i = 0; i < count; i++) {
1854 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001855 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001856 Add(std::move((cgpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001857 }
1858 }
1859 cgpl_state->pipe_state.clear();
1860}
1861
1862bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1863 const VkComputePipelineCreateInfo *pCreateInfos,
1864 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001865 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001866 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1867 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1868 ccpl_state->pipe_state.reserve(count);
1869 for (uint32_t i = 0; i < count; i++) {
1870 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001871 ccpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001872 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001873 }
1874 return false;
1875}
1876
1877void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1878 const VkComputePipelineCreateInfo *pCreateInfos,
1879 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1880 VkResult result, void *ccpl_state_data) {
1881 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1882
1883 // This API may create pipelines regardless of the return value
1884 for (uint32_t i = 0; i < count; i++) {
1885 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001886 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001887 Add(std::move((ccpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001888 }
1889 }
1890 ccpl_state->pipe_state.clear();
1891}
1892
1893bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
1894 uint32_t count,
1895 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1896 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001897 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001898 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1899 crtpl_state->pipe_state.reserve(count);
1900 for (uint32_t i = 0; i < count; i++) {
1901 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001902 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001903 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001904 }
1905 return false;
1906}
1907
1908void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
1909 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1910 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
1911 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1912 // This API may create pipelines regardless of the return value
1913 for (uint32_t i = 0; i < count; i++) {
1914 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001915 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001916 Add(std::move((crtpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001917 }
1918 }
1919 crtpl_state->pipe_state.clear();
1920}
1921
sourav parmarcd5fb182020-07-17 12:58:44 -07001922bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
1923 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001924 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
1925 const VkAllocationCallbacks *pAllocator,
1926 VkPipeline *pPipelines, void *crtpl_state_data) const {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001927 auto crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001928 crtpl_state->pipe_state.reserve(count);
1929 for (uint32_t i = 0; i < count; i++) {
1930 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001931 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001932 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001933 }
1934 return false;
1935}
1936
sourav parmarcd5fb182020-07-17 12:58:44 -07001937void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
1938 VkPipelineCache pipelineCache, uint32_t count,
1939 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
1940 const VkAllocationCallbacks *pAllocator,
1941 VkPipeline *pPipelines, VkResult result,
1942 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001943 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
1944 // This API may create pipelines regardless of the return value
1945 for (uint32_t i = 0; i < count; i++) {
1946 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001947 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001948 Add(std::move((crtpl_state->pipe_state)[i]));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001949 }
1950 }
1951 crtpl_state->pipe_state.clear();
1952}
1953
locke-lunargd556cc32019-09-17 01:21:23 -06001954void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1955 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
1956 VkResult result) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001957 Add(std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo));
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001958 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1959 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06001960 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001961 }
locke-lunargd556cc32019-09-17 01:21:23 -06001962}
1963
1964void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
1965 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1966 const VkAllocationCallbacks *pAllocator,
1967 VkDescriptorSetLayout *pSetLayout, VkResult result) {
1968 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001969 Add(std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout));
locke-lunargd556cc32019-09-17 01:21:23 -06001970}
1971
locke-lunargd556cc32019-09-17 01:21:23 -06001972void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1973 const VkAllocationCallbacks *pAllocator,
1974 VkPipelineLayout *pPipelineLayout, VkResult result) {
1975 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001976 Add(std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001977}
1978
1979void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1980 const VkAllocationCallbacks *pAllocator,
1981 VkDescriptorPool *pDescriptorPool, VkResult result) {
1982 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001983 Add(std::make_shared<DESCRIPTOR_POOL_STATE>(this, *pDescriptorPool, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001984}
1985
1986void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1987 VkDescriptorPoolResetFlags flags, VkResult result) {
1988 if (VK_SUCCESS != result) return;
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06001989 auto pool = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
1990 if (pool) {
1991 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001992 }
locke-lunargd556cc32019-09-17 01:21:23 -06001993}
1994
1995bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
1996 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001997 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001998 // Always update common data
1999 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2000 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2001 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2002
2003 return false;
2004}
2005
2006// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2007void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2008 VkDescriptorSet *pDescriptorSets, VkResult result,
2009 void *ads_state_data) {
2010 if (VK_SUCCESS != result) return;
2011 // All the updates are contained in a single cvdescriptorset function
2012 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2013 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002014 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(pAllocateInfo->descriptorPool);
2015 if (pool_state) {
2016 pool_state->Allocate(pAllocateInfo, pDescriptorSets, ads_state);
2017 }
locke-lunargd556cc32019-09-17 01:21:23 -06002018}
2019
2020void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2021 const VkDescriptorSet *pDescriptorSets) {
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002022 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2023 if (pool_state) {
2024 pool_state->Free(count, pDescriptorSets);
locke-lunargd556cc32019-09-17 01:21:23 -06002025 }
2026}
2027
2028void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2029 const VkWriteDescriptorSet *pDescriptorWrites,
2030 uint32_t descriptorCopyCount,
2031 const VkCopyDescriptorSet *pDescriptorCopies) {
2032 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2033 pDescriptorCopies);
2034}
2035
2036void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002037 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002038 if (VK_SUCCESS != result) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06002039 auto pool = Get<COMMAND_POOL_STATE>(pCreateInfo->commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002040 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002041 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002042 }
2043}
2044
locke-lunargd556cc32019-09-17 01:21:23 -06002045void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2046 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002047 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002048 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002049
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002050 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002051}
2052
2053void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002054 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002055 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002056
2057 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002058}
2059
2060void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2061 VkResult result) {
2062 if (VK_SUCCESS == result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002063 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002064 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002065 }
2066}
2067
2068CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2069 // initially assume everything is static state
2070 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2071
2072 if (ds) {
2073 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002074 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002075 }
2076 }
locke-lunargd556cc32019-09-17 01:21:23 -06002077 return flags;
2078}
2079
2080// Validation cache:
2081// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002082
2083void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2084 VkPipeline pipeline) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002085 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002086 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002087 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002088
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002089 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002090 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002091 const auto &create_info = pipe_state->create_info.graphics;
2092 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2093 const auto *viewport_state = create_info.pViewportState;
2094 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002095 cb_state->status &= ~cb_state->static_status;
Yilong Lid23bc292022-01-02 22:06:12 -08002096 cb_state->static_status = MakeStaticStateMask(dynamic_state ? dynamic_state->ptr() : nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002097 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002098 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002099
2100 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002101 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2102 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002103 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002104 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002105 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002106 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002107 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002108 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002109
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002110 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002111 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2112 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2113 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002114 if (!has_dynamic_viewport_count) {
2115 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002116 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002117 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2118 // should become = ~uint32_t(0) if the other interpretation is correct.
2119 }
2120 }
2121 if (!has_dynamic_scissor_count) {
2122 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002123 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002124 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2125 // should become = ~uint32_t(0) if the other interpretation is correct.
2126 }
2127 }
locke-lunargd556cc32019-09-17 01:21:23 -06002128 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002129 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002130 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state.get();
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002131 if (!disabled[command_buffer_state]) {
2132 cb_state->AddChild(pipe_state);
2133 }
locke-lunargd556cc32019-09-17 01:21:23 -06002134}
2135
2136void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2137 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002138 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002139 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002140 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2141 cb_state->viewportMask |= bits;
2142 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002143
2144 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2145 for (size_t i = 0; i < viewportCount; ++i) {
2146 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2147 }
locke-lunargd556cc32019-09-17 01:21:23 -06002148}
2149
2150void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2151 uint32_t exclusiveScissorCount,
2152 const VkRect2D *pExclusiveScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002153 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002154 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002155 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2156 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002157}
2158
2159void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2160 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002161 if (disabled[command_buffer_state]) return;
2162
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002163 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002164 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002165
2166 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002167 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002168 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002169 }
2170}
2171
2172void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2173 uint32_t viewportCount,
2174 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002175 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002176 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002177 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2178 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002179}
2180
2181void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2182 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2183 const VkAllocationCallbacks *pAllocator,
2184 VkAccelerationStructureNV *pAccelerationStructure,
2185 VkResult result) {
2186 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002187 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002188
2189 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002190 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002191 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002192 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002193 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2194
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002195 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002196 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002197 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002198 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2199 &as_state->build_scratch_memory_requirements);
2200
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002201 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002202 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002203 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002204 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2205 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002206 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002207 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002208}
2209
Jeff Bolz95176d02020-04-01 00:36:16 -05002210void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2211 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2212 const VkAllocationCallbacks *pAllocator,
2213 VkAccelerationStructureKHR *pAccelerationStructure,
2214 VkResult result) {
2215 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002216 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002217 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002218 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002219}
2220
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002221void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2222 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2223 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2224 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2225 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002226 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002227 if (dst_as_state != nullptr) {
2228 dst_as_state->Build(&pInfos[i]);
2229 }
2230 }
2231}
2232
sourav parmarcd5fb182020-07-17 12:58:44 -07002233void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2234 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2235 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002236 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002237 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002238 return;
2239 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002240 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002241 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002242 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002243 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002244 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002245 if (!disabled[command_buffer_state]) {
2246 cb_state->AddChild(dst_as_state);
2247 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002248 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002249 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002250 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002251 if (src_as_state != nullptr) {
2252 cb_state->AddChild(src_as_state);
2253 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002254 }
2255 }
2256 cb_state->hasBuildAccelerationStructureCmd = true;
2257}
2258
2259void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2260 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2261 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2262 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002263 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002264 if (cb_state == nullptr) {
2265 return;
2266 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002267 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002268 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002269 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002270 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002271 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002272 if (!disabled[command_buffer_state]) {
2273 cb_state->AddChild(dst_as_state);
2274 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002275 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002276 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002277 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002278 if (src_as_state != nullptr) {
2279 cb_state->AddChild(src_as_state);
2280 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002281 }
2282 }
2283 cb_state->hasBuildAccelerationStructureCmd = true;
2284}
locke-lunargd556cc32019-09-17 01:21:23 -06002285void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002286 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002287 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002288 if (as_state != nullptr) {
2289 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2290 as_state->memory_requirements = *pMemoryRequirements;
2291 as_state->memory_requirements_checked = true;
2292 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2293 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2294 as_state->build_scratch_memory_requirements_checked = true;
2295 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2296 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2297 as_state->update_scratch_memory_requirements_checked = true;
2298 }
2299 }
2300}
2301
sourav parmarcd5fb182020-07-17 12:58:44 -07002302void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2303 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002304 if (VK_SUCCESS != result) return;
2305 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002306 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002307
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002308 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002309 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002310 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06002311 auto mem_state = Get<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002312 if (mem_state) {
2313 as_state->SetMemBinding(mem_state, info.memoryOffset);
2314 }
locke-lunargd556cc32019-09-17 01:21:23 -06002315
2316 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002317 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002318 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002319 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2320 }
2321 }
2322 }
2323}
2324
2325void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2326 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2327 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002328 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002329 if (cb_state == nullptr) {
2330 return;
2331 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002332 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002333
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002334 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002335 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002336 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002337 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002338 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002339 }
locke-lunargd556cc32019-09-17 01:21:23 -06002340 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002341 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002342 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002343 if (src_as_state != nullptr) {
2344 cb_state->AddChild(src_as_state);
2345 }
locke-lunargd556cc32019-09-17 01:21:23 -06002346 }
2347 cb_state->hasBuildAccelerationStructureCmd = true;
2348}
2349
2350void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2351 VkAccelerationStructureNV dst,
2352 VkAccelerationStructureNV src,
2353 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002354 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002355 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002356 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2357 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002358 if (!disabled[command_buffer_state]) {
2359 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2360 }
locke-lunargd556cc32019-09-17 01:21:23 -06002361 if (dst_as_state != nullptr && src_as_state != nullptr) {
2362 dst_as_state->built = true;
2363 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002364 }
2365 }
2366}
2367
Jeff Bolz95176d02020-04-01 00:36:16 -05002368void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2369 VkAccelerationStructureKHR accelerationStructure,
2370 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002371 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002372}
2373
Jeff Bolz95176d02020-04-01 00:36:16 -05002374void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2375 VkAccelerationStructureNV accelerationStructure,
2376 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002377 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002378}
2379
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002380void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2381 uint32_t viewportCount,
2382 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002383 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002384 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002385}
2386
locke-lunargd556cc32019-09-17 01:21:23 -06002387void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002388 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002389 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002390}
2391
2392void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2393 uint16_t lineStipplePattern) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002394 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002395 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002396}
2397
2398void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2399 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002400 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002401 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002402}
2403
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002404void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2405 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002406 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002407 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002408 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2409 cb_state->scissorMask |= bits;
2410 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002411}
2412
locke-lunargd556cc32019-09-17 01:21:23 -06002413void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002414 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002415 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002416}
2417
2418void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2419 float maxDepthBounds) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002420 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002421 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002422}
2423
2424void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2425 uint32_t compareMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002426 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002427 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002428}
2429
2430void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2431 uint32_t writeMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002432 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002433 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002434}
2435
2436void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2437 uint32_t reference) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002438 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002439 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002440}
2441
locke-lunargd556cc32019-09-17 01:21:23 -06002442// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2443void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2444 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2445 uint32_t firstSet, uint32_t setCount,
2446 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2447 const uint32_t *pDynamicOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002448 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002449 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002450 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
locke-lunargd556cc32019-09-17 01:21:23 -06002451
Jeremy Gebben9f537102021-10-05 16:37:12 -06002452 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout.get(), firstSet, setCount, pDescriptorSets, nullptr,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002453 dynamicOffsetCount, pDynamicOffsets);
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002454}
2455
locke-lunargd556cc32019-09-17 01:21:23 -06002456void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2457 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2458 uint32_t set, uint32_t descriptorWriteCount,
2459 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002460 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2461 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002462 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout.get(), set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002463}
2464
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002465void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2466 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2467 const void *pValues) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002468 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002469 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002470 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002471 auto layout_state = Get<PIPELINE_LAYOUT_STATE>(layout);
2472 cb_state->ResetPushConstantDataIfIncompatible(layout_state.get());
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002473
2474 auto &push_constant_data = cb_state->push_constant_data;
2475 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2476 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002477 cb_state->push_constant_pipeline_layout_set = layout;
2478
2479 auto flags = stageFlags;
2480 uint32_t bit_shift = 0;
2481 while (flags) {
2482 if (flags & 1) {
2483 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2484 const auto it = cb_state->push_constant_data_update.find(flag);
2485
2486 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002487 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002488 }
2489 }
2490 flags = flags >> 1;
2491 ++bit_shift;
2492 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002493 }
2494}
2495
locke-lunargd556cc32019-09-17 01:21:23 -06002496void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2497 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002498 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002499
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002500 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002501 cb_state->index_buffer_binding.buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002502 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002503 cb_state->index_buffer_binding.offset = offset;
2504 cb_state->index_buffer_binding.index_type = indexType;
2505 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002506 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002507 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002508 }
locke-lunargd556cc32019-09-17 01:21:23 -06002509}
2510
2511void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2512 uint32_t bindingCount, const VkBuffer *pBuffers,
2513 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002514 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002515 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002516
2517 uint32_t end = firstBinding + bindingCount;
2518 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2519 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2520 }
2521
2522 for (uint32_t i = 0; i < bindingCount; ++i) {
2523 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06002524 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002525 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002526 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2527 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002528 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002529 if (pBuffers[i] && !disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002530 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Jeff Bolz165818a2020-05-08 11:19:03 -05002531 }
locke-lunargd556cc32019-09-17 01:21:23 -06002532 }
2533}
2534
2535void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2536 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002537 if (disabled[command_buffer_state]) return;
2538
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002539 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002540 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002541}
2542
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002543void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2544 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002545 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002546 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002547}
2548
2549void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2550 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002551 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002552 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2553
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002554 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2555 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002556}
2557
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002558void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2559 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002560 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002561 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002562}
2563
2564void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2565 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002566 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002567 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002568}
2569
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002570void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2571 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2572 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2573 uint32_t bufferMemoryBarrierCount,
2574 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2575 uint32_t imageMemoryBarrierCount,
2576 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002577 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002578 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
2579 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2580 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002581}
2582
2583void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2584 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002585 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002586 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06002587 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002588 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06002589 }
2590}
2591
2592void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2593 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2594 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2595 uint32_t bufferMemoryBarrierCount,
2596 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2597 uint32_t imageMemoryBarrierCount,
2598 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002599 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2600 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2601 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2602 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002603}
2604
2605void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2606 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002607 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2608 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2609 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002610}
2611
locke-lunargd556cc32019-09-17 01:21:23 -06002612void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2613 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002614 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002615
locke-lunargd556cc32019-09-17 01:21:23 -06002616 QueryObject query = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002617 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002618 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002619 if (!disabled[query_validation]) {
2620 cb_state->BeginQuery(query);
2621 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002622 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002623 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002624 cb_state->AddChild(pool_state);
2625 }
locke-lunargd556cc32019-09-17 01:21:23 -06002626}
2627
2628void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002629 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002630 QueryObject query_obj = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002631 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002632 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002633 if (!disabled[query_validation]) {
2634 cb_state->EndQuery(query_obj);
2635 }
2636 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002637 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002638 cb_state->AddChild(pool_state);
2639 }
locke-lunargd556cc32019-09-17 01:21:23 -06002640}
2641
2642void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2643 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002644 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002645 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002646
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002647 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002648 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002649
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002650 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002651 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002652 cb_state->AddChild(pool_state);
2653 }
locke-lunargd556cc32019-09-17 01:21:23 -06002654}
2655
2656void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2657 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2658 VkDeviceSize dstOffset, VkDeviceSize stride,
2659 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002660 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2661
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002662 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002663 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002664 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002665 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002666 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002667 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002668}
2669
2670void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2671 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002672 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002673 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002674}
2675
2676void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2677 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2678 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_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002681}
2682
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002683void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2684 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2685 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2686 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002687 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002688 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002689 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002690 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002691 cb_state->AddChild(pool_state);
2692 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002693 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002694}
2695
locke-lunargd556cc32019-09-17 01:21:23 -06002696void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2697 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2698 VkResult result) {
2699 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002700
Jeremy Gebben88f58142021-06-01 10:07:52 -06002701 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002702 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002703 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002704
locke-lunargd556cc32019-09-17 01:21:23 -06002705 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002706 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002707 }
2708 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002709
Jeremy Gebben9f537102021-10-05 16:37:12 -06002710 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002711 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002712}
2713
locke-lunargd556cc32019-09-17 01:21:23 -06002714void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2715 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2716 VkResult result) {
2717 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002718 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002719}
2720
Mike Schuchardt2df08912020-12-15 16:28:09 -08002721void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002722 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2723 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002724 if (VK_SUCCESS != result) return;
2725
Jeremy Gebben082a9832021-10-28 13:40:11 -06002726 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002727}
2728
Mike Schuchardt2df08912020-12-15 16:28:09 -08002729void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002730 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2731 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002732 if (VK_SUCCESS != result) return;
2733
Jeremy Gebben082a9832021-10-28 13:40:11 -06002734 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002735}
2736
locke-lunargd556cc32019-09-17 01:21:23 -06002737void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2738 const VkRenderPassBeginInfo *pRenderPassBegin,
2739 VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002740 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002741 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002742}
2743
2744void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2745 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002746 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002747 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002748 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002749}
2750
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002751void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2752 uint32_t counterBufferCount,
2753 const VkBuffer *pCounterBuffers,
2754 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002755 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002756
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002757 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002758 cb_state->transform_feedback_active = true;
2759}
2760
2761void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2762 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2763 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002764 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002765
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002766 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002767 cb_state->transform_feedback_active = false;
2768}
2769
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002770void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2771 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002772 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002773
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002774 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002775 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002776 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2777 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002778}
2779
2780void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002781 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002782
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002783 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002784 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002785 cb_state->conditional_rendering_inside_render_pass = false;
2786 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002787}
2788
amhagana448ea52021-11-02 14:09:14 -04002789void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002790 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002791 cb_state->activeRenderPass = nullptr;
2792}
2793
2794void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2795 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002796 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002797 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2798}
2799
2800void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
2801 RecordCmdEndRenderingRenderPassState(commandBuffer);
2802}
2803
Tony-LunarG977448c2019-12-02 14:52:02 -07002804void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2805 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002806 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002807 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002808 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07002809}
2810
locke-lunargd556cc32019-09-17 01:21:23 -06002811void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002812 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002813 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002814}
2815
2816void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002817 const VkSubpassBeginInfo *pSubpassBeginInfo,
2818 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002819 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002820 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002821}
2822
Tony-LunarG977448c2019-12-02 14:52:02 -07002823void ValidationStateTracker::PostCallRecordCmdNextSubpass2(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);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002827 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002828}
2829
2830void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002831 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002832 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06002833}
2834
2835void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002836 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002837 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002838 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06002839}
2840
Tony-LunarG977448c2019-12-02 14:52:02 -07002841void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002842 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002843 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002844 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07002845}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002846
locke-lunargd556cc32019-09-17 01:21:23 -06002847void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
2848 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002849 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002850
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002851 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002852}
2853
2854void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
2855 VkFlags flags, void **ppData, VkResult result) {
2856 if (VK_SUCCESS != result) return;
2857 RecordMappedMemory(mem, offset, size, ppData);
2858}
2859
2860void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002861 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06002862 if (mem_info) {
2863 mem_info->mapped_range = MemRange();
2864 mem_info->p_driver_data = nullptr;
2865 }
2866}
2867
2868void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002869 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06002870 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06002871 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
2872 // See: VUID-vkGetImageSubresourceLayout-image-01895
2873 image_state->fragment_encoder =
2874 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002875 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002876 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002877 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06002878 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002879 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07002880
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002881 if (!swapchain_image.fake_base_address) {
2882 auto size = image_state->fragment_encoder->TotalSize();
2883 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002884 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002885 // All images bound to this swapchain and index are aliases
2886 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06002887 }
2888 } else {
2889 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06002890 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06002891 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002892 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06002893 }
locke-lunargd556cc32019-09-17 01:21:23 -06002894 }
locke-lunargd556cc32019-09-17 01:21:23 -06002895 }
2896}
2897
2898void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2899 VkDeviceSize memoryOffset, VkResult result) {
2900 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002901 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002902 bind_info.image = image;
2903 bind_info.memory = mem;
2904 bind_info.memoryOffset = memoryOffset;
2905 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06002906}
2907
2908void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002909 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002910 if (VK_SUCCESS != result) return;
2911 for (uint32_t i = 0; i < bindInfoCount; i++) {
2912 UpdateBindImageMemoryState(pBindInfos[i]);
2913 }
2914}
2915
2916void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002917 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002918 if (VK_SUCCESS != result) return;
2919 for (uint32_t i = 0; i < bindInfoCount; i++) {
2920 UpdateBindImageMemoryState(pBindInfos[i]);
2921 }
2922}
2923
2924void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002925 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06002926 if (event_state) {
2927 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
2928 }
locke-lunargd556cc32019-09-17 01:21:23 -06002929}
2930
2931void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
2932 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
2933 VkResult result) {
2934 if (VK_SUCCESS != result) return;
2935 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
2936 pImportSemaphoreFdInfo->flags);
2937}
2938
2939void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002940 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002941 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07002942 if (semaphore_state) {
2943 semaphore_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06002944 }
2945}
2946
2947#ifdef VK_USE_PLATFORM_WIN32_KHR
2948void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
2949 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
2950 if (VK_SUCCESS != result) return;
2951 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
2952 pImportSemaphoreWin32HandleInfo->flags);
2953}
2954
2955void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
2956 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
2957 HANDLE *pHandle, VkResult result) {
2958 if (VK_SUCCESS != result) return;
2959 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
2960}
2961
2962void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
2963 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
2964 if (VK_SUCCESS != result) return;
2965 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
2966 pImportFenceWin32HandleInfo->flags);
2967}
2968
2969void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
2970 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
2971 HANDLE *pHandle, VkResult result) {
2972 if (VK_SUCCESS != result) return;
2973 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
2974}
2975#endif
2976
2977void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
2978 VkResult result) {
2979 if (VK_SUCCESS != result) return;
2980 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
2981}
2982
Mike Schuchardt2df08912020-12-15 16:28:09 -08002983void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
2984 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002985 auto fence_node = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07002986
2987 if (fence_node) {
2988 fence_node->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06002989 }
2990}
2991
2992void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
2993 VkResult result) {
2994 if (VK_SUCCESS != result) return;
2995 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
2996}
2997
Mike Schuchardt2df08912020-12-15 16:28:09 -08002998void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002999 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003000 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003001 fence_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003002 }
3003}
3004
3005void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3006 VkResult result) {
3007 if (VK_SUCCESS != result) return;
3008 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3009}
3010
3011void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3012 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3013 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003014 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003015}
3016
3017void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003018 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003019 SWAPCHAIN_NODE *old_swapchain_state) {
3020 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003021 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003022 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003023 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003024 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3025 surface_state->AddParent(swapchain.get());
3026 surface_state->swapchain = swapchain.get();
3027 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003028 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003029 } else {
3030 surface_state->swapchain = nullptr;
3031 }
3032 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003033 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003034 if (old_swapchain_state) {
3035 old_swapchain_state->retired = true;
3036 }
3037 return;
3038}
3039
3040void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3041 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3042 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003043 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003044 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003045 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003046}
3047
3048void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3049 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003050 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003051}
3052
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003053void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3054 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3055 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3056 VkResult result) {
3057 if (VK_SUCCESS != result) return;
3058 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003059 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003060}
3061
locke-lunargd556cc32019-09-17 01:21:23 -06003062void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003063 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06003064 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3065 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003066 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003067 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003068 semaphore_state->EnqueuePresent(queue_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003069 }
3070 }
3071
Tony-LunarG6f887e52021-07-27 11:23:14 -06003072 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003073 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3074 // 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
3075 // confused itself just as much.
3076 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3077 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3078 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003079 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003080 if (swapchain_data) {
3081 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003082 if (present_id_info) {
3083 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3084 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3085 }
3086 }
locke-lunargd556cc32019-09-17 01:21:23 -06003087 }
3088 }
locke-lunargd556cc32019-09-17 01:21:23 -06003089}
3090
3091void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3092 const VkSwapchainCreateInfoKHR *pCreateInfos,
3093 const VkAllocationCallbacks *pAllocator,
3094 VkSwapchainKHR *pSwapchains, VkResult result) {
3095 if (pCreateInfos) {
3096 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003097 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003098 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003099 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3100 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003101 }
3102 }
3103}
3104
3105void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3106 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003107 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003108 if (fence_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003109 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3110 // import
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003111 fence_state->EnqueueSignal(nullptr, 0);
locke-lunargd556cc32019-09-17 01:21:23 -06003112 }
3113
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003114 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003115 if (semaphore_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003116 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3117 // temporary import
Jeremy Gebben15332642021-12-15 19:33:15 -07003118 semaphore_state->EnqueueAcquire();
locke-lunargd556cc32019-09-17 01:21:23 -06003119 }
3120
3121 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003122 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003123 if (swapchain_data) {
3124 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003125 }
3126}
3127
3128void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3129 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3130 VkResult result) {
3131 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3132 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3133}
3134
3135void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3136 uint32_t *pImageIndex, VkResult result) {
3137 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3138 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3139 pAcquireInfo->fence, pImageIndex);
3140}
3141
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003142std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3143 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3144}
3145
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003146void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3147 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3148 VkResult result) {
3149 if (result != VK_SUCCESS) {
3150 return;
3151 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003152 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003153 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003154 // this can fail if the allocator fails
3155 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3156 if (result != VK_SUCCESS) {
3157 return;
3158 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003159 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003160 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3161 if (result != VK_SUCCESS) {
3162 return;
3163 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003164
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003165 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003166 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003167 }
3168}
3169
3170// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003171static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003172 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003173}
3174
3175void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3176 uint32_t *pQueueFamilyPropertyCount,
3177 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003178 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3179 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003180 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003181}
3182
3183void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003184 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003185 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3186 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003187 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003188}
3189
3190void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003191 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003192 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3193 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003194 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003195}
3196void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3197 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003198 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003199}
3200
Jeremy Gebben082a9832021-10-28 13:40:11 -06003201void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003202
3203void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3204 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3205 const VkAllocationCallbacks *pAllocator,
3206 VkSurfaceKHR *pSurface, VkResult result) {
3207 if (VK_SUCCESS != result) return;
3208 RecordVulkanSurface(pSurface);
3209}
3210
3211#ifdef VK_USE_PLATFORM_ANDROID_KHR
3212void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3213 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3214 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3215 VkResult result) {
3216 if (VK_SUCCESS != result) return;
3217 RecordVulkanSurface(pSurface);
3218}
3219#endif // VK_USE_PLATFORM_ANDROID_KHR
3220
3221#ifdef VK_USE_PLATFORM_IOS_MVK
3222void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3223 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3224 VkResult result) {
3225 if (VK_SUCCESS != result) return;
3226 RecordVulkanSurface(pSurface);
3227}
3228#endif // VK_USE_PLATFORM_IOS_MVK
3229
3230#ifdef VK_USE_PLATFORM_MACOS_MVK
3231void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3232 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3233 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3234 VkResult result) {
3235 if (VK_SUCCESS != result) return;
3236 RecordVulkanSurface(pSurface);
3237}
3238#endif // VK_USE_PLATFORM_MACOS_MVK
3239
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003240#ifdef VK_USE_PLATFORM_METAL_EXT
3241void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3242 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3243 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3244 VkResult result) {
3245 if (VK_SUCCESS != result) return;
3246 RecordVulkanSurface(pSurface);
3247}
3248#endif // VK_USE_PLATFORM_METAL_EXT
3249
locke-lunargd556cc32019-09-17 01:21:23 -06003250#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3251void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3252 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3253 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3254 VkResult result) {
3255 if (VK_SUCCESS != result) return;
3256 RecordVulkanSurface(pSurface);
3257}
3258#endif // VK_USE_PLATFORM_WAYLAND_KHR
3259
3260#ifdef VK_USE_PLATFORM_WIN32_KHR
3261void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3262 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3263 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3264 VkResult result) {
3265 if (VK_SUCCESS != result) return;
3266 RecordVulkanSurface(pSurface);
3267}
3268#endif // VK_USE_PLATFORM_WIN32_KHR
3269
3270#ifdef VK_USE_PLATFORM_XCB_KHR
3271void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3272 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3273 VkResult result) {
3274 if (VK_SUCCESS != result) return;
3275 RecordVulkanSurface(pSurface);
3276}
3277#endif // VK_USE_PLATFORM_XCB_KHR
3278
3279#ifdef VK_USE_PLATFORM_XLIB_KHR
3280void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3281 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3282 VkResult result) {
3283 if (VK_SUCCESS != result) return;
3284 RecordVulkanSurface(pSurface);
3285}
3286#endif // VK_USE_PLATFORM_XLIB_KHR
3287
Niklas Haas8b84af12020-04-19 22:20:11 +02003288void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3289 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3290 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3291 VkResult result) {
3292 if (VK_SUCCESS != result) return;
3293 RecordVulkanSurface(pSurface);
3294}
3295
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003296void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3297 VkSurfaceKHR surface,
3298 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3299 VkResult result) {
3300 if (VK_SUCCESS != result) return;
3301 auto surface_state = Get<SURFACE_STATE>(surface);
3302 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3303}
3304
3305void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3306 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3307 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3308 if (VK_SUCCESS != result) return;
3309 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3310 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3311}
3312
3313void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3314 VkSurfaceKHR surface,
3315 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3316 VkResult result) {
3317 auto surface_state = Get<SURFACE_STATE>(surface);
3318 VkSurfaceCapabilitiesKHR caps{
3319 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3320 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3321 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3322 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3323 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3324 };
3325 surface_state->SetCapabilities(physicalDevice, caps);
3326}
3327
locke-lunargd556cc32019-09-17 01:21:23 -06003328void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3329 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3330 VkBool32 *pSupported, VkResult result) {
3331 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003332 auto surface_state = Get<SURFACE_STATE>(surface);
3333 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3334}
3335
3336void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3337 VkSurfaceKHR surface,
3338 uint32_t *pPresentModeCount,
3339 VkPresentModeKHR *pPresentModes,
3340 VkResult result) {
3341 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3342
3343 if (pPresentModes) {
3344 auto surface_state = Get<SURFACE_STATE>(surface);
3345 surface_state->SetPresentModes(physicalDevice,
3346 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3347 }
3348}
3349
3350void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3351 uint32_t *pSurfaceFormatCount,
3352 VkSurfaceFormatKHR *pSurfaceFormats,
3353 VkResult result) {
3354 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3355
3356 if (pSurfaceFormats) {
3357 auto surface_state = Get<SURFACE_STATE>(surface);
3358 surface_state->SetFormats(physicalDevice,
3359 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3360 }
3361}
3362
3363void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3364 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3365 uint32_t *pSurfaceFormatCount,
3366 VkSurfaceFormat2KHR *pSurfaceFormats,
3367 VkResult result) {
3368 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3369
3370 if (pSurfaceFormats) {
3371 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3372 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3373 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3374 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3375 }
3376 surface_state->SetFormats(physicalDevice, std::move(fmts));
3377 }
locke-lunargd556cc32019-09-17 01:21:23 -06003378}
3379
locke-lunargd556cc32019-09-17 01:21:23 -06003380void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3381 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003382 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003383 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003384 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3385}
3386
3387void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003388 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003389 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003390 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3391}
3392
3393void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3394 const VkDebugUtilsLabelEXT *pLabelInfo) {
3395 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3396
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003397 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003398 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3399 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003400 cb_state->debug_label = LoggingLabel(pLabelInfo);
3401}
3402
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003403void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3404 uint32_t queueFamilyIndex,
3405 uint32_t *pCounterCount,
3406 VkPerformanceCounterKHR *pCounters) {
3407 if (NULL == pCounters) return;
3408
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003409 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3410 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003411
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003412 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3413 queue_family_counters->counters.resize(*pCounterCount);
3414 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003415
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003416 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003417}
3418
3419void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3420 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3421 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3422 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3423 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3424}
3425
3426void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3427 VkResult result) {
3428 if (result == VK_SUCCESS) performance_lock_acquired = true;
3429}
3430
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003431void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3432 performance_lock_acquired = false;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06003433 for (auto &cmd_buffer : command_buffer_map_.snapshot()) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003434 cmd_buffer.second->performance_lock_released = true;
3435 }
3436}
3437
locke-lunargd556cc32019-09-17 01:21:23 -06003438void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003439 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003440 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003441 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003442}
3443
3444void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003445 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003446 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003447 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003448}
3449
Mike Schuchardt2df08912020-12-15 16:28:09 -08003450void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3451 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003452 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003453}
3454
Mike Schuchardt2df08912020-12-15 16:28:09 -08003455void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3456 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3457 const VkAllocationCallbacks *pAllocator,
3458 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3459 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003460 if (VK_SUCCESS != result) return;
3461 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3462}
3463
3464void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003465 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3466 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003467 if (VK_SUCCESS != result) return;
3468 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3469}
3470
3471void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003472 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003473 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003474 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3475 assert(template_state);
3476 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003477 // TODO: Record template push descriptor updates
3478 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003479 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003480 }
3481 }
3482}
3483
3484void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3485 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3486 const void *pData) {
3487 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3488}
3489
3490void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003491 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003492 const void *pData) {
3493 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3494}
3495
Mike Schuchardt2df08912020-12-15 16:28:09 -08003496void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3497 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3498 VkPipelineLayout layout, uint32_t set,
3499 const void *pData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003500 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003501
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003502 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003503 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003504 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003505 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003506 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003507 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003508 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003509 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003510 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003511 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003512 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3513 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003514 }
3515}
3516
3517void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3518 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003519 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003520 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003521 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003522 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003523 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003524 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003525 }
3526}
3527
3528void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3529 uint32_t *pPropertyCount,
3530 VkDisplayPlanePropertiesKHR *pProperties,
3531 VkResult result) {
3532 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3533 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3534}
3535
3536void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3537 uint32_t *pPropertyCount,
3538 VkDisplayPlaneProperties2KHR *pProperties,
3539 VkResult result) {
3540 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3541 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3542}
3543
3544void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3545 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3546 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003547 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003548 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003549 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003550}
3551
3552void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3553 uint32_t query, uint32_t index) {
3554 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003555 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003556 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003557 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003558}
3559
3560void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3561 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003562 VkFormatFeatureFlags format_features = 0;
3563
3564 if (create_info->format != VK_FORMAT_UNDEFINED) {
3565 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003566 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003567 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3568 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003569 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003570
Jeremy Gebben082a9832021-10-28 13:40:11 -06003571 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003572}
3573
3574void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3575 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3576 const VkAllocationCallbacks *pAllocator,
3577 VkSamplerYcbcrConversion *pYcbcrConversion,
3578 VkResult result) {
3579 if (VK_SUCCESS != result) return;
3580 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3581}
3582
3583void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3584 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3585 const VkAllocationCallbacks *pAllocator,
3586 VkSamplerYcbcrConversion *pYcbcrConversion,
3587 VkResult result) {
3588 if (VK_SUCCESS != result) return;
3589 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3590}
3591
3592void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3593 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003594 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003595}
3596
3597void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3598 VkSamplerYcbcrConversion ycbcrConversion,
3599 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003600 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003601}
3602
Tony-LunarG977448c2019-12-02 14:52:02 -07003603void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3604 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003605 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003606 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003607
3608 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003609 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003610 if (!query_pool_state) return;
3611
3612 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003613 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3614 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003615 auto query_index = firstQuery + i;
3616 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003617 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003618 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003619 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003620 }
3621 }
locke-lunargd556cc32019-09-17 01:21:23 -06003622 }
3623}
3624
Tony-LunarG977448c2019-12-02 14:52:02 -07003625void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3626 uint32_t queryCount) {
3627 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3628}
3629
3630void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3631 uint32_t queryCount) {
3632 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3633}
3634
locke-lunargd556cc32019-09-17 01:21:23 -06003635void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003636 const UPDATE_TEMPLATE_STATE *template_state,
3637 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003638 // Translate the templated update into a normal update for validation...
3639 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3640 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3641 decoded_update.desc_writes.data(), 0, NULL);
3642}
3643
3644// Update the common AllocateDescriptorSetsData
3645void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003646 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003647 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003648 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003649 if (layout) {
3650 ds_data->layout_nodes[i] = layout;
3651 // Count total descriptors required per type
3652 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3653 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003654 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3655 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003656 }
3657 }
3658 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3659 }
3660}
3661
locke-lunargd556cc32019-09-17 01:21:23 -06003662void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3663 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003664 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003665 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003666}
3667
Tony-LunarG745150c2021-07-02 15:07:31 -06003668void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3669 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3670 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003671 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003672 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003673}
3674
locke-lunargd556cc32019-09-17 01:21:23 -06003675void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3676 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3677 uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003678 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003679 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003680}
3681
Tony-LunarG745150c2021-07-02 15:07:31 -06003682void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3683 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3684 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3685 const int32_t *pVertexOffset) {
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_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003688}
3689
locke-lunargd556cc32019-09-17 01:21:23 -06003690void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3691 uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003692 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3693 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003694 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003695 if (!disabled[command_buffer_state]) {
3696 cb_state->AddChild(buffer_state);
3697 }
locke-lunargd556cc32019-09-17 01:21:23 -06003698}
3699
3700void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3701 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003702 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3703 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003704 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003705 if (!disabled[command_buffer_state]) {
3706 cb_state->AddChild(buffer_state);
3707 }
locke-lunargd556cc32019-09-17 01:21:23 -06003708}
3709
3710void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003711 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003712 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003713}
3714
3715void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3716 VkDeviceSize offset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003717 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003718 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003719 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003720 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003721 cb_state->AddChild(buffer_state);
3722 }
locke-lunargd556cc32019-09-17 01:21:23 -06003723}
3724
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003725void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3726 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003727 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003728 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3729}
3730
3731void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3732 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003733 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003734 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3735}
3736
Tony-LunarG977448c2019-12-02 14:52:02 -07003737void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3738 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003739 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003740 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003741 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003742 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003743 auto buffer_state = Get<BUFFER_STATE>(buffer);
3744 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003745 cb_state->AddChild(buffer_state);
3746 cb_state->AddChild(count_buffer_state);
3747 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003748}
3749
locke-lunargd556cc32019-09-17 01:21:23 -06003750void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3751 VkDeviceSize offset, VkBuffer countBuffer,
3752 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3753 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003754 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003755 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003756}
3757
3758void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3759 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3760 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003761 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003762 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003763}
3764
3765void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3766 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003767 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003768 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003769 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003770 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003771 auto buffer_state = Get<BUFFER_STATE>(buffer);
3772 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003773 cb_state->AddChild(buffer_state);
3774 cb_state->AddChild(count_buffer_state);
3775 }
locke-lunargd556cc32019-09-17 01:21:23 -06003776}
3777
3778void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3779 VkDeviceSize offset, VkBuffer countBuffer,
3780 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3781 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003782 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003783 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003784}
3785
3786void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3787 VkDeviceSize offset, VkBuffer countBuffer,
3788 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3789 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003790 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003791 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003792}
3793
3794void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3795 uint32_t firstTask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003796 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003797 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003798}
3799
3800void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3801 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003802 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003803 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003804 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003805 if (!disabled[command_buffer_state] && buffer_state) {
3806 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003807 }
3808}
3809
3810void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3811 VkDeviceSize offset, VkBuffer countBuffer,
3812 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3813 uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003814 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003815 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003816 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003817 auto buffer_state = Get<BUFFER_STATE>(buffer);
3818 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003819 if (buffer_state) {
3820 cb_state->AddChild(buffer_state);
3821 }
3822 if (count_buffer_state) {
3823 cb_state->AddChild(count_buffer_state);
3824 }
locke-lunargd556cc32019-09-17 01:21:23 -06003825 }
3826}
3827
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003828void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
3829 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
3830 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
3831 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
3832 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
3833 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
3834 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003835 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003836 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003837 cb_state->hasTraceRaysCmd = true;
3838}
3839
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003840void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
3841 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3842 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3843 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3844 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
3845 uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003846 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003847 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003848 cb_state->hasTraceRaysCmd = true;
3849}
3850
3851void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
3852 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3853 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3854 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3855 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
3856 VkDeviceAddress indirectDeviceAddress) {
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_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003859 cb_state->hasTraceRaysCmd = true;
3860}
3861
locke-lunargd556cc32019-09-17 01:21:23 -06003862void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
3863 const VkAllocationCallbacks *pAllocator,
3864 VkShaderModule *pShaderModule, VkResult result,
3865 void *csm_state_data) {
3866 if (VK_SUCCESS != result) return;
3867 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
3868
sfricke-samsung45996a42021-09-16 13:45:27 -07003869 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06003870 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003871 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
3872 csm_state->unique_shader_id)
3873 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003874 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06003875}
3876
John Zulauf22b0fbe2019-10-15 06:26:16 -06003877void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
3878 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
3879 VkResult result) {
3880 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06003881 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003882
3883 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
3884
3885 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003886 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07003887 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07003888 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06003889
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003890 auto format_features =
3891 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
3892 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003893
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06003894 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003895 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003896 if (!swapchain_image.fake_base_address) {
3897 auto size = image_state->fragment_encoder->TotalSize();
3898 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07003899 }
3900
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003901 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003902 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003903 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06003904 }
3905 }
3906
3907 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003908 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
3909 }
3910}
sourav parmar35e7a002020-06-09 17:58:44 -07003911
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003912void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
3913 const VkCopyAccelerationStructureInfoKHR *pInfo,
3914 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003915 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
3916 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003917 if (dst_as_state != nullptr && src_as_state != nullptr) {
3918 dst_as_state->built = true;
3919 dst_as_state->build_info_khr = src_as_state->build_info_khr;
3920 }
3921}
3922
sourav parmar35e7a002020-06-09 17:58:44 -07003923void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
3924 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003925 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07003926 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003927 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003928 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
3929 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07003930 if (dst_as_state != nullptr && src_as_state != nullptr) {
3931 dst_as_state->built = true;
3932 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003933 if (!disabled[command_buffer_state]) {
3934 cb_state->AddChild(dst_as_state);
3935 cb_state->AddChild(src_as_state);
3936 }
sourav parmar35e7a002020-06-09 17:58:44 -07003937 }
3938 }
3939}
Piers Daniell39842ee2020-07-10 16:42:33 -06003940
3941void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003942 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003943 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003944}
3945
3946void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003947 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003948 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003949}
3950
3951void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
3952 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003953 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003954 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003955 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06003956}
3957
3958void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
3959 const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003960 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003961 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07003962 uint32_t bits = (1u << viewportCount) - 1u;
3963 cb_state->viewportWithCountMask |= bits;
3964 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00003965 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07003966 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07003967
3968 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
3969 for (size_t i = 0; i < viewportCount; ++i) {
3970 cb_state->dynamicViewports[i] = pViewports[i];
3971 }
Piers Daniell39842ee2020-07-10 16:42:33 -06003972}
3973
3974void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
3975 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003976 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003977 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07003978 uint32_t bits = (1u << scissorCount) - 1u;
3979 cb_state->scissorWithCountMask |= bits;
3980 cb_state->trashedScissorMask &= ~bits;
3981 cb_state->scissorWithCountCount = scissorCount;
3982 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06003983}
3984
3985void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3986 uint32_t bindingCount, const VkBuffer *pBuffers,
3987 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
3988 const VkDeviceSize *pStrides) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003989 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003990 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06003991
3992 uint32_t end = firstBinding + bindingCount;
3993 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
3994 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
3995 }
3996
3997 for (uint32_t i = 0; i < bindingCount; ++i) {
3998 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06003999 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004000 vertex_buffer_binding.offset = pOffsets[i];
4001 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4002 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4003 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004004 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004005 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004006 }
4007 }
4008}
4009
4010void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
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_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004013}
4014
4015void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004016 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004017 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004018}
4019
4020void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004021 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004022 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004023}
4024
4025void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4026 VkBool32 depthBoundsTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004027 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004028 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004029}
4030void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004031 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004032 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004033}
4034
4035void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4036 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4037 VkCompareOp compareOp) {
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_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004040}
locke-lunarg4189aa22020-10-21 00:23:48 -06004041
4042void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4043 uint32_t discardRectangleCount,
4044 const VkRect2D *pDiscardRectangles) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004045 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004046 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004047}
4048
4049void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4050 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004051 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004052 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004053}
4054
4055void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4056 VkCoarseSampleOrderTypeNV sampleOrderType,
4057 uint32_t customSampleOrderCount,
4058 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004059 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004060 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004061}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004062
4063void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004064 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004065 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004066}
4067
4068void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004069 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004070 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004071}
4072
4073void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4074 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004075 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004076 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004077}
4078
4079void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004080 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004081 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004082}
4083
4084void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4085 VkBool32 primitiveRestartEnable) {
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_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004088}
Piers Daniell924cd832021-05-18 13:48:47 -06004089
4090void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4091 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4092 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4093 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004094 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004095 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4096
4097 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4098 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4099 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004100 if (pipeline_state->create_info.graphics.pDynamicState) {
4101 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4102 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004103 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4104 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4105 break;
4106 }
4107 }
4108 }
4109 }
4110 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004111}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004112
4113void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004114 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004115 if (buffer_state) {
4116 // address is used for GPU-AV and ray tracing buffer validation
4117 buffer_state->deviceAddress = address;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06004118 buffer_address_map_.insert(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004119 }
4120}
4121
4122void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4123 VkDeviceAddress address) {
4124 RecordGetBufferDeviceAddress(pInfo, address);
4125}
4126
4127void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4128 VkDeviceAddress address) {
4129 RecordGetBufferDeviceAddress(pInfo, address);
4130}
4131
4132void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4133 VkDeviceAddress address) {
4134 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004135}
4136
4137std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4138 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004139 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004140}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004141
4142std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4143 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004144 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004145 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4146}