blob: bb977afe05ef930a93de5eb620c371c52015acb7 [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
Tony-LunarG4c253372022-01-18 13:51:07 -07002 * Copyright (c) 2019-2022 Valve Corporation
3 * Copyright (c) 2019-2022 LunarG, Inc.
John Zulauf9cb530d2019-09-30 14:14:10 -06004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: John Zulauf <jzulauf@lunarg.com>
John Zulaufab7756b2020-12-29 16:10:16 -070018 * Author: Locke Lin <locke@lunarg.com>
19 * Author: Jeremy Gebben <jeremyg@lunarg.com>
John Zulauf9cb530d2019-09-30 14:14:10 -060020 */
21
22#pragma once
23
John Zulauf7635de32020-05-29 17:14:15 -060024#include <limits>
John Zulauf9cb530d2019-09-30 14:14:10 -060025#include <memory>
John Zulauf9cb530d2019-09-30 14:14:10 -060026#include <vulkan/vulkan.h>
27
28#include "synchronization_validation_types.h"
29#include "state_tracker.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060030#include "cmd_buffer_state.h"
31#include "render_pass_state.h"
John Zulauf9cb530d2019-09-30 14:14:10 -060032
John Zulaufd5115702021-01-18 12:34:33 -070033class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070034class CommandBufferAccessContext;
John Zulauf64ffe552021-02-06 10:25:07 -070035class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070036class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060037struct ResourceFirstAccess;
John Zulaufd5115702021-01-18 12:34:33 -070038class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060039
John Zulaufd0ec59f2021-03-13 14:25:08 -070040using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
41using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
42
John Zulauf2f952d22020-02-10 11:34:51 -070043enum SyncHazard {
44 NONE = 0,
45 READ_AFTER_WRITE,
46 WRITE_AFTER_READ,
47 WRITE_AFTER_WRITE,
48 READ_RACING_WRITE,
49 WRITE_RACING_WRITE,
50 WRITE_RACING_READ,
51};
John Zulauf9cb530d2019-09-30 14:14:10 -060052
John Zulauf8e3c3e92021-01-06 11:19:36 -070053enum class SyncOrdering : uint8_t {
54 kNonAttachment = 0,
55 kColorAttachment = 1,
56 kDepthStencilAttachment = 2,
57 kRaster = 3,
58 kNumOrderings = 4,
59};
60
John Zulauf9cb530d2019-09-30 14:14:10 -060061// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
62struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070063 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060064 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
65 }
John Zulauf1507ee42020-05-18 11:33:09 -060066 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
67 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
68 }
John Zulauf9cb530d2019-09-30 14:14:10 -060069
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070070 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060071 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
72
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070073 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
74 return (stage_access_bit & syncStageAccessWriteMask).any();
75 }
76 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
77 return (stage_access_mask & syncStageAccessWriteMask).any();
78 }
John Zulauf9cb530d2019-09-30 14:14:10 -060079 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070080 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060081 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
82 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070083 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
84 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
85 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
86 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060087 return stage_scope & AccessScopeByAccess(accesses);
88 }
89};
90
John Zulauf14940722021-04-12 15:19:02 -060091struct ResourceUsageRecord {
John Zulauf41a9c7c2021-12-07 15:59:53 -070092 enum class SubcommandType { kNone, kSubpassTransition, kLoadOp, kStoreOp, kResolveOp, kIndex };
93
John Zulauf14940722021-04-12 15:19:02 -060094 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070095 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070096 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -060097 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070098 CMD_TYPE command = CMD_NONE;
99 Count seq_num = 0U;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700100 SubcommandType sub_command_type = SubcommandType::kNone;
John Zulauffaea0ee2021-01-14 14:01:32 -0700101 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600102
103 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
104 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600105 const CMD_BUFFER_STATE *cb_state = nullptr; // plain pointer as a shared pointer is held by the context storing this record
John Zulauf3c2a0b32021-07-14 11:14:52 -0600106 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700107
John Zulauf14940722021-04-12 15:19:02 -0600108 ResourceUsageRecord() = default;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700109 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, SubcommandType sub_type_, Count sub_command_,
110 const CMD_BUFFER_STATE *cb_state_, Count reset_count_)
111 : command(command_),
112 seq_num(seq_num_),
113 sub_command_type(sub_type_),
114 sub_command(sub_command_),
115 cb_state(cb_state_),
116 reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600117};
118
John Zulauf3c2a0b32021-07-14 11:14:52 -0600119// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600120using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600121using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600122
John Zulauf9cb530d2019-09-30 14:14:10 -0600123struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600124 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600125 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600126 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600127 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600128 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600129 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600130 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600131 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600132 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulauf9cb530d2019-09-30 14:14:10 -0600133};
134
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700135struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700136 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
137 VkPipelineStageFlags2KHR
138 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
139 VkPipelineStageFlags2KHR exec_scope; // all earlier or later stages that would be affected by a barrier using this scope.
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700140 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
141
142 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
143
John Zulauf06f6f1e2022-04-19 15:28:11 -0600144 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask,
145 const VkPipelineStageFlags2KHR disabled_feature_mask = 0);
Jeremy Gebben40a22942020-12-22 14:22:06 -0700146 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700147};
148
John Zulauf3d84f1b2020-03-09 13:33:25 -0600149struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700150 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600151 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700152 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600153 SyncStageAccessFlags dst_access_scope;
154 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700155 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600156 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700157
158 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
John Zulauf06f6f1e2022-04-19 15:28:11 -0600159 SyncBarrier(const SyncExecScope &src_exec, const SyncStageAccessFlags &src_access, const SyncExecScope &dst_exec,
160 const SyncStageAccessFlags &dst_access)
161 : src_exec_scope(src_exec), src_access_scope(src_access), dst_exec_scope(dst_exec), dst_access_scope(dst_access) {}
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700162
163 template <typename Barrier>
164 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
165
166 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700167 // template constructor for sync2 barriers
168 template <typename Barrier>
169 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700170
John Zulaufa0a98292020-09-18 09:30:10 -0600171 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700172 // Note that after merge, only the exec_scope and access_scope fields are fully valid
173 // TODO: Do we need to update any of the other fields? Merging has limited application.
174 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600175 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700176 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600177 dst_access_scope |= other.dst_access_scope;
178 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600179};
John Zulauf69133422020-05-20 14:55:53 -0600180
John Zulauf43cc7462020-12-03 12:33:12 -0700181enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
182
John Zulauf4a6105a2020-11-17 15:11:05 -0700183struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700184 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700185 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700186 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
187 EventPointer event;
188 CMD_TYPE last_command; // Only Event commands are valid here.
John Zulauf610e28c2021-08-03 17:46:23 -0600189 ResourceUsageTag last_command_tag; // Needed to filter replay validation
John Zulauf4a6105a2020-11-17 15:11:05 -0700190 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700191 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700192 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700193 ResourceUsageTag first_scope_tag;
John Zulauf78b1f892021-09-20 15:02:09 -0600194 bool first_scope_set;
John Zulaufd5115702021-01-18 12:34:33 -0700195 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700196 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700197 template <typename EventPointerType>
198 SyncEventState(EventPointerType &&event_state)
199 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700200 last_command(CMD_NONE),
John Zulauf610e28c2021-08-03 17:46:23 -0600201 last_command_tag(0),
John Zulaufd5115702021-01-18 12:34:33 -0700202 unsynchronized_set(CMD_NONE),
203 barriers(0U),
204 scope(),
205 first_scope_tag(),
John Zulauf78b1f892021-09-20 15:02:09 -0600206 first_scope_set(false),
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600207 destroyed((event_state.get() == nullptr) || event_state->Destroyed()) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700208 SyncEventState() : SyncEventState(EventPointer()) {}
209 void ResetFirstScope();
210 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700211 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700212 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700213};
John Zulaufea943c52022-02-22 11:05:17 -0700214
John Zulauf669dfd52021-01-27 17:15:28 -0700215class SyncEventsContext {
216 public:
John Zulaufea943c52022-02-22 11:05:17 -0700217 using Map = layer_data::unordered_map<const EVENT_STATE *, std::shared_ptr<SyncEventState>>;
John Zulauf669dfd52021-01-27 17:15:28 -0700218 using iterator = Map::iterator;
219 using const_iterator = Map::const_iterator;
220
221 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
222 const auto find_it = map_.find(event_state.get());
223 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700224 if (!event_state.get()) return nullptr;
225
John Zulauf669dfd52021-01-27 17:15:28 -0700226 const auto *event_plain_ptr = event_state.get();
John Zulaufea943c52022-02-22 11:05:17 -0700227 auto sync_state = std::shared_ptr<SyncEventState>(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700228 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700229 return insert_pair.first->second.get();
230 }
231 return find_it->second.get();
232 }
233
234 const SyncEventState *Get(const EVENT_STATE *event_state) const {
235 const auto find_it = map_.find(event_state);
236 if (find_it == map_.end()) {
237 return nullptr;
238 }
239 return find_it->second.get();
240 }
John Zulauf6ce24372021-01-30 05:56:25 -0700241 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700242
John Zulauf8eda1562021-04-13 17:06:41 -0600243 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst);
244
John Zulauf669dfd52021-01-27 17:15:28 -0700245 // stl style naming for range-for support
246 inline iterator begin() { return map_.begin(); }
247 inline const_iterator begin() const { return map_.begin(); }
248 inline iterator end() { return map_.end(); }
249 inline const_iterator end() const { return map_.end(); }
250
251 void Destroy(const EVENT_STATE *event_state) {
252 auto sync_it = map_.find(event_state);
253 if (sync_it != map_.end()) {
254 sync_it->second->destroyed = true;
255 map_.erase(sync_it);
256 }
257 }
258 void Clear() { map_.clear(); }
259
260 private:
261 Map map_;
262};
John Zulauf4a6105a2020-11-17 15:11:05 -0700263
John Zulauf4fa68462021-04-26 21:04:22 -0600264struct ResourceFirstAccess {
265 ResourceUsageTag tag;
266 SyncStageAccessIndex usage_index;
267 SyncOrdering ordering_rule;
268 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
269 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
270 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
271 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
272 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
273 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
274 bool operator==(const ResourceFirstAccess &rhs) const {
275 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
276 }
277};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600278
John Zulauf9cb530d2019-09-30 14:14:10 -0600279class ResourceAccessState : public SyncStageAccess {
280 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700281 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700282 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700283 SyncStageAccessFlags access_scope;
284 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700285 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700286 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700287 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600288 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
289 exec_scope |= rhs.exec_scope;
290 access_scope |= rhs.access_scope;
291 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700292 }
293 };
John Zulauf4fa68462021-04-26 21:04:22 -0600294 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
295 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700296
John Zulauf9cb530d2019-09-30 14:14:10 -0600297 // Mutliple read operations can be simlutaneously (and independently) synchronized,
298 // given the only the second execution scope creates a dependency chain, we have to track each,
299 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
300 // and applicable one for hazard detection
301 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700302 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600303 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600304 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700305 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600306 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700307 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
308 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600309 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700310 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600311 ResourceUsageTag tag_)
John Zulaufab7756b2020-12-29 16:10:16 -0700312 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600313 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600314 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600315 return same;
316 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700317 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700318 // If the read stage is not in the src sync scope
319 // *AND* not execution chained with an existing sync barrier (that's the or)
320 // then the barrier access is unsafe (R/W after R)
321 return (src_exec_scope & (stage | barriers)) == 0;
322 }
323
John Zulaufe5da6e52020-03-18 15:32:18 -0600324 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
John Zulaufee984022022-04-13 16:39:50 -0600325 void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
326 ResourceUsageTag tag_);
John Zulauf9cb530d2019-09-30 14:14:10 -0600327 };
328
329 public:
330 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf4fa68462021-04-26 21:04:22 -0600331 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule) const;
332 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering) const;
John Zulaufae842002021-04-15 18:20:55 -0600333 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
334
335 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
336 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
337 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600338
Jeremy Gebben40a22942020-12-22 14:22:06 -0700339 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700340 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700341 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600342 const SyncStageAccessFlags &source_access_scope, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600343
John Zulauf14940722021-04-12 15:19:02 -0600344 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
345 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600346 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600347 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulaufbb890452021-12-14 11:30:18 -0700348 void ApplyBarriersImmediate(const std::vector<SyncBarrier> &barriers);
John Zulauf89311b42020-09-29 16:28:47 -0600349 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600350 void ApplyBarrier(ResourceUsageTag scope_tag, const SyncBarrier &barrier, bool layout_transition);
351 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufae842002021-04-15 18:20:55 -0600352 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600353
John Zulauf4fa68462021-04-26 21:04:22 -0600354 void OffsetTag(ResourceUsageTag offset) {
355 if (last_write.any()) write_tag += offset;
356 for (auto &read_access : last_reads) {
357 read_access.tag += offset;
358 }
359 for (auto &first : first_accesses_) {
360 first.tag += offset;
361 }
362 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600363 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600364 : write_barriers(~SyncStageAccessFlags(0)),
365 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600366 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600367 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600368 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600369 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600370 read_execution_barriers(0),
371 pending_write_dep_chain(0),
372 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700373 pending_write_barriers(0),
John Zulauf4fa68462021-04-26 21:04:22 -0600374 pending_layout_ordering_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700375 first_accesses_(),
John Zulauf4fa68462021-04-26 21:04:22 -0600376 first_read_stages_(0U),
377 first_write_layout_ordering_() {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600378
John Zulaufb02c1eb2020-10-06 16:33:36 -0600379 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700380 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600381 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600382 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600383 bool operator==(const ResourceAccessState &rhs) const {
384 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700385 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
386 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700387 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600388 return same;
389 }
390 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700391 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600392 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700393 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700394 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
395 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600396
John Zulauf9cb530d2019-09-30 14:14:10 -0600397 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700398 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700399 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700400 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
401 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600402 // If the previous write is *not* a layout transition
403 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700404 // *AND* the current barrier is not in the dependency chain
405 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
406 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600407 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
408 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700409 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700410 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700411 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
412 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700413 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700414 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600415 }
John Zulaufd14743a2020-07-03 09:42:39 -0600416
Jeremy Gebben40a22942020-12-22 14:22:06 -0700417 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600418 return stage_mask != (stage_mask & barriers);
419 }
420
Jeremy Gebben40a22942020-12-22 14:22:06 -0700421 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600422 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700423 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700424 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700425
John Zulauf14940722021-04-12 15:19:02 -0600426 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600427 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700428
John Zulauf8e3c3e92021-01-06 11:19:36 -0700429 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
430 return kOrderingRules[static_cast<size_t>(ordering_enum)];
431 }
John Zulaufd14743a2020-07-03 09:42:39 -0600432
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700433 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600434
John Zulauf9cb530d2019-09-30 14:14:10 -0600435 // With reads, each must be "safe" relative to it's prior write, so we need only
436 // save the most recent write operation (as anything *transitively* unsafe would arleady
437 // be included
438 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700439 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600440 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600441 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600442
John Zulauff51fbb62020-10-02 14:43:24 -0600443 // TODO Input Attachment cleanup for multiple reads in a given stage
444 // Tracks whether the fragment shader read is input attachment read
445 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600446
Jeremy Gebben40a22942020-12-22 14:22:06 -0700447 VkPipelineStageFlags2KHR last_read_stages;
448 VkPipelineStageFlags2KHR read_execution_barriers;
Artem Bolgar09b01542021-06-01 23:49:14 -0700449 small_vector<ReadState, 3, uint32_t> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600450
451 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700452 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600453 bool pending_layout_transition;
454 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600455 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700456 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700457 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600458 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700459
460 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600461};
John Zulauf22aefed2021-03-11 18:14:35 -0700462using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
463using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600464
John Zulauf16adfc92020-04-08 10:28:33 -0600465using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700466using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700467using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600468using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600469
John Zulaufd0ec59f2021-03-13 14:25:08 -0700470class AttachmentViewGen {
471 public:
472 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
473 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
474 AttachmentViewGen(const AttachmentViewGen &other) = default;
475 AttachmentViewGen(AttachmentViewGen &&other) = default;
476 AccessAddressType GetAddressType() const;
477 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
478 const ImageRangeGen *GetRangeGen(Gen type) const;
479 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
480 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
481
482 private:
483 using RangeGenStore = layer_data::optional<ImageRangeGen>;
484 const IMAGE_VIEW_STATE *view_ = nullptr;
485 VkImageAspectFlags view_mask_ = 0U;
486 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
487};
488
489using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
490
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700491using SyncMemoryBarrier = SyncBarrier;
492struct SyncBufferMemoryBarrier {
493 using Buffer = std::shared_ptr<const BUFFER_STATE>;
494 Buffer buffer;
495 SyncBarrier barrier;
496 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700497 bool IsLayoutTransition() const { return false; }
498 const ResourceAccessRange &Range() const { return range; };
499 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700500 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
501 : buffer(buffer_), barrier(barrier_), range(range_) {}
502 SyncBufferMemoryBarrier() = default;
503};
504
505struct SyncImageMemoryBarrier {
506 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600507
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700508 Image image;
509 uint32_t index;
510 SyncBarrier barrier;
511 VkImageLayout old_layout;
512 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600513 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700514
515 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600516 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700517 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700518 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
519 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
520 : image(image_),
521 index(index_),
522 barrier(barrier_),
523 old_layout(old_layout_),
524 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600525 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700526 SyncImageMemoryBarrier() = default;
527};
528
John Zulaufbb890452021-12-14 11:30:18 -0700529template <typename SubpassNode>
530struct SubpassBarrierTrackback {
531 std::vector<SyncBarrier> barriers;
532 const SubpassNode *source_subpass = nullptr;
533 SubpassBarrierTrackback() = default;
534 SubpassBarrierTrackback(const SubpassBarrierTrackback &) = default;
535 SubpassBarrierTrackback(const SubpassNode *source_subpass_, VkQueueFlags queue_flags_,
536 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
537 : barriers(), source_subpass(source_subpass_) {
538 barriers.reserve(subpass_dependencies_.size());
539 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
540 assert(dependency);
541 barriers.emplace_back(queue_flags_, *dependency);
542 }
543 }
John Zulauf06f6f1e2022-04-19 15:28:11 -0600544 SubpassBarrierTrackback(const SubpassNode *source_subpass_, const SyncBarrier &barrier_)
545 : barriers(1, barrier_), source_subpass(source_subpass_) {}
John Zulaufbb890452021-12-14 11:30:18 -0700546 SubpassBarrierTrackback &operator=(const SubpassBarrierTrackback &) = default;
547};
548
549struct ReplayTrackbackBarriersAction {
550 struct TrackbackBarriers : public SubpassBarrierTrackback<ReplayTrackbackBarriersAction> {
551 using Base = SubpassBarrierTrackback<ReplayTrackbackBarriersAction>;
552 TrackbackBarriers(const ReplayTrackbackBarriersAction *source_subpass_, VkQueueFlags queue_flags_,
553 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_);
554 void operator()(ResourceAccessState *access) const;
555 };
556
557 ReplayTrackbackBarriersAction() = default;
558 ReplayTrackbackBarriersAction(VkQueueFlags queue_flags, const SubpassDependencyGraphNode &dependencies,
559 const std::vector<ReplayTrackbackBarriersAction> &contexts);
560
561 void operator()(ResourceAccessState *access) const;
562 std::vector<TrackbackBarriers> trackback_barriers;
563};
564
565struct ReplayRenderpassContext {
566 std::vector<ReplayTrackbackBarriersAction> subpass_contexts;
567};
568
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700569class SyncOpBase {
570 public:
John Zulaufbb890452021-12-14 11:30:18 -0700571 using ReplayContextPtr = std::shared_ptr<ReplayRenderpassContext>;
sfricke-samsung85584a72021-09-30 21:43:38 -0700572 SyncOpBase() : cmd_(CMD_NONE) {}
573 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600574 virtual ~SyncOpBase() = default;
575
sfricke-samsung85584a72021-09-30 21:43:38 -0700576 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufbb890452021-12-14 11:30:18 -0700577 const ReplayTrackbackBarriersAction *GetReplayTrackback() const;
578
579 void SetReplayContext(uint32_t subpass, ReplayContextPtr &&replay);
580
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700581 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600582 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
583 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700584 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const = 0;
585 virtual void ReplayRecord(ResourceUsageTag tag, AccessContext *access_context, SyncEventsContext *events_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700586
587 protected:
John Zulaufbb890452021-12-14 11:30:18 -0700588 // Only non-null and valid for SyncOps within a render pass instance WIP -- think about how to manage for non RPI calls within
589 // RPI and 2ndarys...
590 ReplayContextPtr replay_context_;
591 uint32_t subpass_ = VK_SUBPASS_EXTERNAL;
John Zulauf36ef9282021-02-02 11:47:24 -0700592 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700593};
594
John Zulaufd5115702021-01-18 12:34:33 -0700595class SyncOpBarriers : public SyncOpBase {
596 protected:
597 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600598 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700599 AccessContext *context);
600 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600601 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700602 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700603
John Zulauf36ef9282021-02-02 11:47:24 -0700604 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700605 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
606 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
607 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
608 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700609 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
610 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700611
John Zulauf8eda1562021-04-13 17:06:41 -0600612 ~SyncOpBarriers() override = default;
613
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700614 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700615 struct BarrierSet {
616 VkDependencyFlags dependency_flags;
617 SyncExecScope src_exec_scope;
618 SyncExecScope dst_exec_scope;
619 std::vector<SyncMemoryBarrier> memory_barriers;
620 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
621 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
622 bool single_exec_scope;
623 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
624 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
625 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
626 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
627 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
628 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
629 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
630 const VkImageMemoryBarrier *pImageMemoryBarriers);
631 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700632 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700633 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700634 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700635 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700636 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700637 };
638 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700639};
640
John Zulaufd5115702021-01-18 12:34:33 -0700641class SyncOpPipelineBarrier : public SyncOpBarriers {
642 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700643 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
644 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
645 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700646 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
647 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700648 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
649 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600650 ~SyncOpPipelineBarrier() override = default;
651
John Zulaufd5115702021-01-18 12:34:33 -0700652 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600653 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
654 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700655 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
656 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
657 SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700658};
659
660class SyncOpWaitEvents : public SyncOpBarriers {
661 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700662 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
663 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
664 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700665 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
666 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700667
668 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
669 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600670 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700671
John Zulaufd5115702021-01-18 12:34:33 -0700672 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600673 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
674 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700675 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
676 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
677 SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700678
679 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600680 static const char *const kIgnored;
John Zulaufbb890452021-12-14 11:30:18 -0700681 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700682 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
683 // TODO PHASE2 May need to capture by value w.r.t. "first use" or build up in calling/enqueue context through replay.
John Zulauf669dfd52021-01-27 17:15:28 -0700684 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
685 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700686};
687
John Zulauf6ce24372021-01-30 05:56:25 -0700688class SyncOpResetEvent : public SyncOpBase {
689 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700690 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700691 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600692 ~SyncOpResetEvent() override = default;
693
John Zulauf6ce24372021-01-30 05:56:25 -0700694 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600695 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
696 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700697 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
698 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
699 SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700700
701 private:
John Zulaufbb890452021-12-14 11:30:18 -0700702 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700703 std::shared_ptr<const EVENT_STATE> event_;
704 SyncExecScope exec_scope_;
705};
706
707class SyncOpSetEvent : public SyncOpBase {
708 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700709 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700710 VkPipelineStageFlags2KHR stageMask);
711 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
712 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600713 ~SyncOpSetEvent() override = default;
714
John Zulauf6ce24372021-01-30 05:56:25 -0700715 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600716 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
717 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700718 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700719
720 private:
John Zulaufbb890452021-12-14 11:30:18 -0700721 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
722 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
723 SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700724 std::shared_ptr<const EVENT_STATE> event_;
725 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700726 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600727 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700728};
John Zulauf64ffe552021-02-06 10:25:07 -0700729
730class SyncOpBeginRenderPass : public SyncOpBase {
731 public:
732 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700733 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600734 ~SyncOpBeginRenderPass() override = default;
735
John Zulauf64ffe552021-02-06 10:25:07 -0700736 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600737 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
738 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700739 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
740 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
741 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700742
743 protected:
744 safe_VkRenderPassBeginInfo renderpass_begin_info_;
745 safe_VkSubpassBeginInfo subpass_begin_info_;
746 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
747 std::vector<const IMAGE_VIEW_STATE *> attachments_;
748 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
John Zulaufbb890452021-12-14 11:30:18 -0700749 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Shared across all subpasses for same renderpass instance
John Zulauf64ffe552021-02-06 10:25:07 -0700750};
751
752class SyncOpNextSubpass : public SyncOpBase {
753 public:
754 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700755 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600756 ~SyncOpNextSubpass() override = default;
757
John Zulauf64ffe552021-02-06 10:25:07 -0700758 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600759 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
760 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700761 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
762 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
763 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700764
765 protected:
766 safe_VkSubpassBeginInfo subpass_begin_info_;
767 safe_VkSubpassEndInfo subpass_end_info_;
John Zulaufbb890452021-12-14 11:30:18 -0700768 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Shared across all subpasses for same renderpass instance
John Zulauf64ffe552021-02-06 10:25:07 -0700769};
770
771class SyncOpEndRenderPass : public SyncOpBase {
772 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700773 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600774 ~SyncOpEndRenderPass() override = default;
775
John Zulauf64ffe552021-02-06 10:25:07 -0700776 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600777 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
778 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700779 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
780 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
781 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700782
783 protected:
784 safe_VkSubpassEndInfo subpass_end_info_;
785};
786
John Zulauf540266b2020-04-06 18:54:53 -0600787class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700788 public:
John Zulauf69133422020-05-20 14:55:53 -0600789 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600790 kDetectPrevious = 1U << 0,
791 kDetectAsync = 1U << 1,
792 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600793 };
John Zulauf43cc7462020-12-03 12:33:12 -0700794 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600795
John Zulaufbb890452021-12-14 11:30:18 -0700796 using TrackBack = SubpassBarrierTrackback<AccessContext>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700797
John Zulauf355e49b2020-04-24 15:11:15 -0600798 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600799 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600800 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
801 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600802 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700803 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
804 DetectOptions options) const;
805 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600806 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
807 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600808 template <typename Detector>
809 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
810 DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600811 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf110413c2021-03-20 05:38:38 -0600812 const VkImageSubresourceRange &subresource_range) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700813 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
814 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
815
John Zulauf69133422020-05-20 14:55:53 -0600816 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700817 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600818 const VkOffset3D &offset, const VkExtent3D &extent) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700819 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700820 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700821 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
822 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700823 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
824 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700825 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700826 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700827 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700828 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700829 const SyncStageAccessFlags &src_stage_accesses,
830 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700831 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700832 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600833
John Zulaufb02c1eb2020-10-06 16:33:36 -0600834 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600835 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600836
John Zulaufbb890452021-12-14 11:30:18 -0700837 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context,
838 const ReplayTrackbackBarriersAction *replay_barrier) const;
John Zulaufae842002021-04-15 18:20:55 -0600839
John Zulaufe5da6e52020-03-18 15:32:18 -0600840 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600841 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600842 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600843 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600844 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700845 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600846 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700847 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600848 for (auto &map : access_state_maps_) {
849 map.clear();
850 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600851 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600852
853 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
854 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600855 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
856 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700857 template <typename BarrierAction>
858 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
859 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700860 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700861 const ResourceAccessState *infill_state,
862 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700863 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600864 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700865 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
866 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600867 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700868 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600869 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
870 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600871
John Zulauf8e3c3e92021-01-06 11:19:36 -0700872 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600873 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700874 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600875 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
876 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600877 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600878 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700879 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600880 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700881 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600882 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600883 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700884 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600885 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700886 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600887 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600888
John Zulauf540266b2020-04-06 18:54:53 -0600889 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600890
John Zulauf4fa68462021-04-26 21:04:22 -0600891 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700892 template <typename Action, typename RangeGen>
893 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600894 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700895 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600896 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700897 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700898 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600899
John Zulauf540266b2020-04-06 18:54:53 -0600900 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600901 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600902
903 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600904 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600905
John Zulauf43cc7462020-12-03 12:33:12 -0700906 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
907 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
908 return access_state_maps_[static_cast<size_t>(type)];
909 }
910 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
911 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
912 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
913 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600914 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
915 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700916 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600917 } else {
918 assert(subpass < prev_by_subpass_.size());
919 return prev_by_subpass_[subpass];
920 }
921 }
John Zulauf16adfc92020-04-08 10:28:33 -0600922
John Zulauf64ffe552021-02-06 10:25:07 -0700923 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700924 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
925 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700926 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700927 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
928 const char *func_name) const;
929 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
930
931 const RENDER_PASS_STATE &rp_state,
932
933 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
934 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700935 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700936 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700937 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600938
John Zulauf14940722021-04-12 15:19:02 -0600939 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700940 template <typename Action>
941 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700942
John Zulauf06f6f1e2022-04-19 15:28:11 -0600943 // For use during queue submit building up the QueueBatchContext AccessContext
944 TrackBack *AddTrackBack(const AccessContext *context, const SyncBarrier &barrier);
945 void AddAsyncContext(const AccessContext *context);
946 // For use during queue submit to avoid stale pointers;
947 void ClearTrackBacks() { prev_.clear(); }
948 void ClearAsyncContext(const AccessContext *context) { async_.clear(); }
949
John Zulauf3d84f1b2020-03-09 13:33:25 -0600950 private:
951 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700952 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600953 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600954 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700955 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600956 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700957 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700958 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600959 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600960
961 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600962 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600963 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700964 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700965 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600966 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700967 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600968};
969
John Zulauf355e49b2020-04-24 15:11:15 -0600970class RenderPassAccessContext {
971 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700972 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
973 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700974 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
975 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
976 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600977
John Zulauf64ffe552021-02-06 10:25:07 -0700978 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
979 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -0600980 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700981 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
982 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
983 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600984
John Zulauf14940722021-04-12 15:19:02 -0600985 void RecordLayoutTransitions(ResourceUsageTag tag);
986 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -0700987 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
988 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
989 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600990
John Zulauf540266b2020-04-06 18:54:53 -0600991 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
992 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600993 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
994 uint32_t GetCurrentSubpass() const { return current_subpass_; }
995 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700996 AccessContext *CreateStoreResolveProxy() const;
John Zulaufbb890452021-12-14 11:30:18 -0700997 std::shared_ptr<ReplayRenderpassContext> GetReplayContext() const { return replay_context_; }
John Zulauf355e49b2020-04-24 15:11:15 -0600998
999 private:
John Zulauf355e49b2020-04-24 15:11:15 -06001000 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001001 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -06001002 uint32_t current_subpass_;
1003 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -07001004 AttachmentViewGenVector attachment_views_;
John Zulaufbb890452021-12-14 11:30:18 -07001005 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Each SyncOp for this renderpass instance will have a copy
John Zulauf3d84f1b2020-03-09 13:33:25 -06001006};
1007
John Zulauf64ffe552021-02-06 10:25:07 -07001008// Command execution context is the base class for command buffer and queue contexts
1009// Preventing unintented leakage of subclass specific state, storing enough information
1010// for message logging.
1011// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
1012class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001013 public:
John Zulauf3c788ef2022-02-22 12:12:30 -07001014 using AccessLog = std::vector<ResourceUsageRecord>;
John Zulauf64ffe552021-02-06 10:25:07 -07001015 CommandExecutionContext() : sync_state_(nullptr) {}
John Zulauf3c788ef2022-02-22 12:12:30 -07001016 CommandExecutionContext(const SyncValidator *sync_validator) : sync_state_(sync_validator) {}
John Zulauf64ffe552021-02-06 10:25:07 -07001017 virtual ~CommandExecutionContext() = default;
John Zulaufbb890452021-12-14 11:30:18 -07001018 virtual AccessContext *GetCurrentAccessContext() = 0;
1019 virtual SyncEventsContext *GetCurrentEventsContext() = 0;
1020 virtual const AccessContext *GetCurrentAccessContext() const = 0;
1021 virtual const SyncEventsContext *GetCurrentEventsContext() const = 0;
1022
John Zulauf64ffe552021-02-06 10:25:07 -07001023 const SyncValidator &GetSyncState() const {
1024 assert(sync_state_);
1025 return *sync_state_;
1026 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001027
John Zulauf06f6f1e2022-04-19 15:28:11 -06001028 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context, CMD_TYPE cmd);
John Zulauf3c788ef2022-02-22 12:12:30 -07001029 void ResolveRecordedContext(const AccessContext &recorded_context, ResourceUsageTag offset);
1030
1031 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulauf06f6f1e2022-04-19 15:28:11 -06001032 std::string FormatHazard(const HazardResult &hazard) const;
1033
John Zulaufbb890452021-12-14 11:30:18 -07001034 virtual ResourceUsageTag GetTagLimit() const = 0;
1035 virtual VulkanTypedHandle Handle() const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -06001036 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
John Zulauf3c788ef2022-02-22 12:12:30 -07001037 virtual void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) = 0;
John Zulauf64ffe552021-02-06 10:25:07 -07001038
1039 protected:
John Zulauf3c788ef2022-02-22 12:12:30 -07001040 const SyncValidator *sync_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001041};
1042
1043class CommandBufferAccessContext : public CommandExecutionContext {
1044 public:
John Zulauf8eda1562021-04-13 17:06:41 -06001045 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
1046 struct SyncOpEntry {
1047 ResourceUsageTag tag;
1048 SyncOpPointer sync_op;
1049 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
1050 SyncOpEntry() = default;
1051 SyncOpEntry(const SyncOpEntry &other) = default;
1052 };
1053
John Zulauf3c788ef2022-02-22 12:12:30 -07001054 CommandBufferAccessContext(const SyncValidator *sync_validator = nullptr)
John Zulauf64ffe552021-02-06 10:25:07 -07001055 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -06001056 cb_state_(),
1057 queue_flags_(),
1058 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -06001059 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -06001060 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -07001061 command_number_(0),
1062 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001063 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001064 cb_access_context_(),
1065 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001066 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001067 render_pass_contexts_(),
1068 current_renderpass_context_(),
1069 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001070 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001071 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001072 cb_state_ = cb_state;
1073 queue_flags_ = queue_flags;
1074 }
John Zulauf4fa68462021-04-26 21:04:22 -06001075
1076 struct AsProxyContext {};
1077 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1078
John Zulauf64ffe552021-02-06 10:25:07 -07001079 ~CommandBufferAccessContext() override = default;
1080 CommandExecutionContext &GetExecutionContext() { return *this; }
1081 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001082
1083 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001084 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001085 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001086 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001087 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001088 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001089 reset_count_++;
1090 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001091 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001092 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001093 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001094 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001095 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001096 void MarkDestroyed() { destroyed_ = true; }
1097 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001098
John Zulauf4fa68462021-04-26 21:04:22 -06001099 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001100 std::string FormatUsage(const ResourceFirstAccess &access) const; // Only command buffers have "first usage"
John Zulaufbb890452021-12-14 11:30:18 -07001101 AccessContext *GetCurrentAccessContext() override { return current_context_; }
1102 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1103 const AccessContext *GetCurrentAccessContext() const override { return current_context_; }
1104 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1105
John Zulauf64ffe552021-02-06 10:25:07 -07001106 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001107 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
John Zulauf41a9c7c2021-12-07 15:59:53 -07001108 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
1109 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
Jeremy Gebben9893daf2021-01-04 10:40:50 -07001110 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -07001111
locke-lunarg61870c22020-06-09 14:51:50 -06001112 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001113 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001114 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001115 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001116 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001117 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001118 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001119 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001120 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd);
1121 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd);
John Zulauf4a6105a2020-11-17 15:11:05 -07001122 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001123
John Zulaufbb890452021-12-14 11:30:18 -07001124 bool ValidateFirstUse(CommandExecutionContext *proxy_context, const char *func_name, uint32_t index) const;
John Zulauf4fa68462021-04-26 21:04:22 -06001125
John Zulauf3d84f1b2020-03-09 13:33:25 -06001126 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1127 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001128
John Zulauf41a9c7c2021-12-07 15:59:53 -07001129 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
John Zulaufbb890452021-12-14 11:30:18 -07001130 ResourceUsageTag GetTagLimit() const override { return access_log_.size(); }
1131 VulkanTypedHandle Handle() const override {
1132 if (cb_state_) {
1133 return cb_state_->Handle();
1134 }
1135 return VulkanTypedHandle(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), kVulkanObjectTypeCommandBuffer);
1136 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001137
John Zulauf41a9c7c2021-12-07 15:59:53 -07001138 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1139 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1140 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001141
John Zulauf3c788ef2022-02-22 12:12:30 -07001142 std::shared_ptr<const CMD_BUFFER_STATE> GetCBStateShared() const { return cb_state_; }
1143
John Zulauffaea0ee2021-01-14 14:01:32 -07001144 const CMD_BUFFER_STATE &GetCBState() const {
1145 assert(cb_state_);
1146 return *(cb_state_.get());
1147 }
1148 CMD_BUFFER_STATE &GetCBState() {
1149 assert(cb_state_);
1150 return *(cb_state_.get());
1151 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001152
John Zulauf1bf30522021-09-03 15:39:06 -06001153 template <class T, class... Args>
1154 void RecordSyncOp(Args &&...args) {
1155 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1156 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
John Zulaufbb890452021-12-14 11:30:18 -07001157 RecordSyncOp(std::move(sync_op)); // Call the non-template version
John Zulauf1bf30522021-09-03 15:39:06 -06001158 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001159 const AccessLog &GetAccessLog() const { return access_log_; }
1160 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001161 const std::vector<SyncOpEntry> &GetSyncOps() const { return sync_ops_; };
John Zulauf8eda1562021-04-13 17:06:41 -06001162
John Zulauf3d84f1b2020-03-09 13:33:25 -06001163 private:
John Zulaufbb890452021-12-14 11:30:18 -07001164 // As this is passing around a shared pointer to record, move to avoid needless atomics.
1165 void RecordSyncOp(SyncOpPointer &&sync_op);
John Zulauf4fa68462021-04-26 21:04:22 -06001166 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1167 VkQueueFlags queue_flags_;
1168 bool destroyed_;
1169
John Zulauf3c788ef2022-02-22 12:12:30 -07001170 AccessLog access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001171 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001172 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001173 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001174 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001175
John Zulauf355e49b2020-04-24 15:11:15 -06001176 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001177 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001178 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001179
1180 // Don't need the following for an active proxy cb context
1181 std::vector<RenderPassAccessContext> render_pass_contexts_;
1182 RenderPassAccessContext *current_renderpass_context_;
1183 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001184};
1185
John Zulauf697c0e12022-04-19 16:31:12 -06001186class QueueSyncState;
1187
1188// Store the ResourceUsageRecords for the global tag range. The prev_ field allows for
1189// const Validation phase access from the cmd state "overlay" seamlessly.
1190class AccessLogger {
1191 public:
1192 struct BatchRecord {
1193 BatchRecord() = default;
1194 BatchRecord(const BatchRecord &other) = default;
1195 BatchRecord(BatchRecord &&other) = default;
1196 BatchRecord(const QueueSyncState *q, uint64_t submit, uint32_t batch)
1197 : queue(q), submit_index(submit), batch_index(batch) {}
1198 BatchRecord &operator=(const BatchRecord &other) = default;
1199 const QueueSyncState *queue;
1200 uint64_t submit_index;
1201 uint32_t batch_index;
1202 };
1203
1204 struct AccessRecord {
1205 const BatchRecord *batch;
1206 const ResourceUsageRecord *record;
1207 bool IsValid() const { return batch && record; }
1208 };
1209
1210 // BatchLog lookup is batch relative, thus the batch doesn't need to track it's offset
1211 class BatchLog {
1212 public:
1213 BatchLog() = default;
1214 BatchLog(const BatchLog &batch) = default;
1215 BatchLog(BatchLog &&other) = default;
1216 BatchLog &operator=(const BatchLog &other) = default;
1217 BatchLog &operator=(BatchLog &&other) = default;
1218 BatchLog(const BatchRecord &batch) : batch_(batch) {}
1219
1220 size_t Size() const { return log_.size(); }
1221 const BatchRecord &GetBatch() const { return batch_; }
1222 AccessRecord operator[](size_t index) const;
1223
1224 void Append(const CommandExecutionContext::AccessLog &other);
1225
1226 private:
1227 BatchRecord batch_;
1228 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
1229 CommandExecutionContext::AccessLog log_;
1230 };
1231
1232 using AccessLogRangeMap = sparse_container::range_map<ResourceUsageTag, BatchLog>;
1233
1234 AccessLogger(const AccessLogger *prev = nullptr) : prev_(prev) {}
1235 // AccessLogger lookup is based on global tags
1236 AccessRecord operator[](ResourceUsageTag tag) const;
1237 BatchLog *AddBatch(const QueueSyncState *queue_state, uint64_t submit_id, uint32_t batch_id, const ResourceUsageRange &range);
1238 void MergeMove(AccessLogger &&child);
1239 void Reset();
1240
1241 private:
1242 const AccessLogger *prev_;
1243 AccessLogRangeMap access_log_map_;
1244};
1245
1246class SemaphoreSyncState;
John Zulaufcb7e1672022-05-04 13:46:08 -06001247class SignaledSemaphores;
John Zulauf697c0e12022-04-19 16:31:12 -06001248// TODO need a map from fence to submbit batch id
1249class QueueBatchContext : public CommandExecutionContext {
1250 public:
1251 using BatchSet = layer_data::unordered_set<std::shared_ptr<const QueueBatchContext>>;
1252 struct CmdBufferEntry {
1253 uint32_t index = 0;
1254 std::shared_ptr<const CommandBufferAccessContext> cb;
1255 CmdBufferEntry(uint32_t index_, std::shared_ptr<const CommandBufferAccessContext> &&cb_)
1256 : index(index_), cb(std::move(cb_)) {}
1257 };
1258 using CommandBuffers = std::vector<CmdBufferEntry>;
1259
1260 std::string FormatUsage(ResourceUsageTag tag) const override;
1261 AccessContext *GetCurrentAccessContext() override { return &access_context_; }
1262 const AccessContext *GetCurrentAccessContext() const override { return &access_context_; }
1263 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1264 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1265 const QueueSyncState *GetQueueSyncState() const { return queue_state_; }
1266 VkQueueFlags GetQueueFlags() const;
1267
1268 void SetBatchLog(AccessLogger &loggger, uint64_t sumbit_id, uint32_t batch_id);
1269 void ResetAccessLog() {
1270 logger_ = nullptr;
1271 batch_log_ = nullptr;
1272 }
1273 ResourceUsageTag GetTagLimit() const override { return batch_log_->Size() + tag_range_.begin; }
1274 // begin is the tag bias / .size() is the number of total records that should eventually be in access_log_
1275 ResourceUsageRange GetTagRange() const { return tag_range_; }
1276 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
1277
1278 void SetTagBias(ResourceUsageTag);
1279 CommandBuffers::const_iterator begin() const { return command_buffers_.cbegin(); }
1280 CommandBuffers::const_iterator end() const { return command_buffers_.cend(); }
1281
John Zulaufcb7e1672022-05-04 13:46:08 -06001282 QueueBatchContext(const SyncValidator &sync_state, const QueueSyncState &queue_state);
John Zulauf697c0e12022-04-19 16:31:12 -06001283 QueueBatchContext() = delete;
1284
John Zulaufcb7e1672022-05-04 13:46:08 -06001285 template <typename BatchInfo>
1286 void Setup(const std::shared_ptr<const QueueBatchContext> &prev_batch, const BatchInfo &batch_info,
1287 SignaledSemaphores &signaled);
1288
John Zulauf697c0e12022-04-19 16:31:12 -06001289 VulkanTypedHandle Handle() const override;
1290
1291 template <typename BatchInfo, typename Fn>
1292 static void ForEachWaitSemaphore(const BatchInfo &batch_info, Fn &&func);
1293
1294 private:
1295 using WaitBatchMap = layer_data::unordered_map<const QueueBatchContext *, AccessContext::TrackBack *>;
1296
1297 // The BatchInfo is either the Submit or Submit2 version with traits allowing generic acces
1298 template <typename BatchInfo>
1299 class SubmitInfoAccessor {};
1300 template <typename BatchInfo>
John Zulaufcb7e1672022-05-04 13:46:08 -06001301 void SetupAccessContext(const std::shared_ptr<const QueueBatchContext> &prev, const BatchInfo &batch_info,
1302 SignaledSemaphores &signaled_semaphores);
John Zulauf697c0e12022-04-19 16:31:12 -06001303 template <typename BatchInfo>
1304 void SetupCommandBufferInfo(const BatchInfo &batch_info);
1305
John Zulaufcb7e1672022-05-04 13:46:08 -06001306 void WaitOneSemaphore(VkSemaphore sem, VkPipelineStageFlags2 wait_mask, WaitBatchMap &batch_trackbacks,
1307 SignaledSemaphores &signaled);
John Zulauf697c0e12022-04-19 16:31:12 -06001308
1309 const QueueSyncState *queue_state_ = nullptr;
1310 ResourceUsageRange tag_range_ = ResourceUsageRange(0, 0); // Range of tags referenced by cbs_referenced
1311
1312 AccessContext access_context_;
1313 SyncEventsContext events_context_;
1314
1315 // Clear these after validation and import
1316 CommandBuffers command_buffers_;
1317 BatchSet async_batches_;
1318 // When null use the global logger
1319 AccessLogger *logger_ = nullptr;
1320 AccessLogger::BatchLog *batch_log_ = nullptr;
1321};
John Zulaufbbda4572022-04-19 16:20:45 -06001322
1323class QueueSyncState {
1324 public:
1325 QueueSyncState(const std::shared_ptr<QUEUE_STATE> &queue_state, VkQueueFlags queue_flags)
1326 : submit_index_(0), queue_state_(queue_state), last_batch_(), queue_flags_(queue_flags) {}
1327
1328 VulkanTypedHandle Handle() const {
1329 if (queue_state_) {
1330 return queue_state_->Handle();
1331 }
1332 return VulkanTypedHandle(static_cast<VkQueue>(VK_NULL_HANDLE), kVulkanObjectTypeQueue);
1333 }
1334 std::shared_ptr<const QueueBatchContext> LastBatch() const { return last_batch_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001335 void SetLastBatch(std::shared_ptr<QueueBatchContext> &&last);
John Zulaufbbda4572022-04-19 16:20:45 -06001336 QUEUE_STATE *GetQueueState() { return queue_state_.get(); }
1337 const QUEUE_STATE *GetQueueState() const { return queue_state_.get(); }
1338 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
1339
John Zulauf697c0e12022-04-19 16:31:12 -06001340 uint64_t ReserveSubmitId() const; // Method is const but updates mutable sumbit_index atomically.
1341
John Zulaufbbda4572022-04-19 16:20:45 -06001342 private:
1343 mutable std::atomic<uint64_t> submit_index_;
1344 std::shared_ptr<QUEUE_STATE> queue_state_;
1345 std::shared_ptr<QueueBatchContext> last_batch_;
1346 const VkQueueFlags queue_flags_;
1347};
1348
John Zulaufcb7e1672022-05-04 13:46:08 -06001349class SignaledSemaphores {
John Zulaufbbda4572022-04-19 16:20:45 -06001350 public:
John Zulaufcb7e1672022-05-04 13:46:08 -06001351 // Is the record of a signaled semaphore, deleted when unsignaled
1352 struct Signal {
1353 Signal() = delete;
1354 Signal(const Signal &other) = default;
1355 Signal(Signal &&other) = default;
1356 Signal &operator=(const Signal &other) = default;
1357 Signal &operator=(Signal &&other) = default;
1358 Signal(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state_, const std::shared_ptr<QueueBatchContext> &batch_,
1359 const SyncExecScope &exec_scope_)
1360 : sem_state(sem_state_), batch(batch_), exec_scope(exec_scope_) {
1361 // Illegal to create a signal from no batch and an invalid semaphore... caller must assure validity
1362 assert(batch);
1363 assert(sem_state);
1364 }
1365
1366 std::shared_ptr<const SEMAPHORE_STATE> sem_state;
1367 std::shared_ptr<QueueBatchContext> batch;
1368 // Use the SyncExecScope::valid_accesses for first access scope
1369 SyncExecScope exec_scope;
1370 // TODO add timeline semaphore support.
1371 };
1372 using SignalMap = layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>>;
1373 using iterator = SignalMap::iterator;
1374 iterator begin() { return signaled_.begin(); }
1375 iterator end() { return signaled_.end(); }
1376
1377 bool SignalSemaphore(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state, const std::shared_ptr<QueueBatchContext> &batch,
1378 const VkSemaphoreSubmitInfo &signal_info);
1379 std::shared_ptr<Signal> Unsignal(VkSemaphore);
1380 void Import(VkSemaphore sem, std::shared_ptr<Signal> &&move_from);
John Zulauf697c0e12022-04-19 16:31:12 -06001381 void Reset();
John Zulaufbbda4572022-04-19 16:20:45 -06001382
1383 private:
John Zulaufcb7e1672022-05-04 13:46:08 -06001384 std::shared_ptr<Signal> GetPrev(VkSemaphore sem) const;
1385 layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>> signaled_;
1386 const SignaledSemaphores *prev_; // Allowing this type to act as a writable overlay
John Zulaufbbda4572022-04-19 16:20:45 -06001387};
1388
John Zulauf9cb530d2019-09-30 14:14:10 -06001389class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1390 public:
John Zulauf9cb530d2019-09-30 14:14:10 -06001391 using StateTracker = ValidationStateTracker;
John Zulaufea943c52022-02-22 11:05:17 -07001392 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
John Zulauf888bb9d2022-05-20 16:13:00 -06001393 virtual ~SyncValidator() { ResetCommandBufferCallbacks(); };
John Zulauf9cb530d2019-09-30 14:14:10 -06001394
John Zulauf697c0e12022-04-19 16:31:12 -06001395 // Global tag range for submitted command buffers resource usage logs
1396 mutable std::atomic<ResourceUsageTag> tag_limit_{0}; // This is reserved in Validation phase, thus mutable and atomic
1397 ResourceUsageRange ReserveGlobalTagRange(size_t tag_count) const; // Note that the tag_limit_ is mutable this has side effects
1398 // This is a snapshot value only
John Zulauf697c0e12022-04-19 16:31:12 -06001399 AccessLogger global_access_log_;
1400
John Zulaufea943c52022-02-22 11:05:17 -07001401 layer_data::unordered_map<VkCommandBuffer, std::shared_ptr<CommandBufferAccessContext>> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001402
John Zulaufbbda4572022-04-19 16:20:45 -06001403 layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>> queue_sync_states_;
John Zulaufcb7e1672022-05-04 13:46:08 -06001404 SignaledSemaphores signaled_semaphores_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001405
John Zulaufbbda4572022-04-19 16:20:45 -06001406 const QueueSyncState *GetQueueSyncState(VkQueue queue) const;
1407 QueueSyncState *GetQueueSyncState(VkQueue queue);
1408 std::shared_ptr<const QueueSyncState> GetQueueSyncStateShared(VkQueue queue) const;
1409 std::shared_ptr<QueueSyncState> GetQueueSyncStateShared(VkQueue queue);
John Zulauf697c0e12022-04-19 16:31:12 -06001410 template <typename Predicate>
1411 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot(Predicate &&pred) const;
John Zulaufbbda4572022-04-19 16:20:45 -06001412
John Zulauf697c0e12022-04-19 16:31:12 -06001413 std::shared_ptr<const SemaphoreSyncState> GetSignalledSemaphore(VkSemaphore sem) const;
1414 void SignalSemaphore(std::shared_ptr<SemaphoreSyncState> &&sem_state);
1415 std::shared_ptr<SemaphoreSyncState> UnsignalSemaphore(VkSemaphore sem);
John Zulaufbbda4572022-04-19 16:20:45 -06001416
1417 std::shared_ptr<CommandBufferAccessContext> AccessContextFactory(VkCommandBuffer command_buffer);
John Zulaufea943c52022-02-22 11:05:17 -07001418 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer);
1419 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer);
1420 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const;
1421 std::shared_ptr<CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer);
1422 std::shared_ptr<const CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001423
John Zulaufd1f85d42020-04-15 12:23:15 -06001424 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1425 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001426 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001427 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001428 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001429 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1430 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001431 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001432
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001433 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001434
John Zulauf355e49b2020-04-24 15:11:15 -06001435 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001436 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001437
1438 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001439 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001440
1441 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001442 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001443
1444 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001445 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001446
John Zulauf9cb530d2019-09-30 14:14:10 -06001447 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001448 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001449
1450 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001451 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001452
John Zulauf4a6105a2020-11-17 15:11:05 -07001453 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001454 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001455 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1456 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001457
Tony-LunarGef035472021-11-02 10:23:33 -06001458 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001459 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001460 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001461
John Zulauf5c5e88d2019-12-26 11:22:02 -07001462 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1463 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001464 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001465
1466 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001467 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001468
Tony-LunarGb61514a2021-11-02 12:36:51 -06001469 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001470 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001471 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001472
Tony-LunarGb61514a2021-11-02 12:36:51 -06001473 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001474 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001475 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001476
John Zulauf9cb530d2019-09-30 14:14:10 -06001477 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1478 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1479 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1480 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1481 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001482 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001483
1484 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1485 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1486 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1487 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001488 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001489
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001490 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1491 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001492 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001493 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001494 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001495
John Zulauf3d84f1b2020-03-09 13:33:25 -06001496 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001497 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001498
1499 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001500 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001501 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001502 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001503 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001504 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001505
Mike Schuchardt2df08912020-12-15 16:28:09 -08001506 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001507 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001508 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001509 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1510 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1511 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1512 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001513
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001514 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001515 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001516 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001517 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001518 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001519
sfricke-samsung85584a72021-09-30 21:43:38 -07001520 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001521 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001522 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1523 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001524
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001525 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1526 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1527 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001528
sfricke-samsung71f04e32022-03-16 01:21:21 -05001529 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001530 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001531 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001532 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001533 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1534 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001535 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001536 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001537 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001538 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1539 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001540
sfricke-samsung71f04e32022-03-16 01:21:21 -05001541 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001542 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001543 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001544 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001545 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001546 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001547 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001548 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001549 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1550 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001551
sfricke-samsung71f04e32022-03-16 01:21:21 -05001552 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001553 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001554 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001555 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001556 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001557 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001558 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001559 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001560 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1561 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001562
sfricke-samsung71f04e32022-03-16 01:21:21 -05001563 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001564 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001565 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001566 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001567 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001568 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001569 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001570 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1571 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001572
1573 template <typename RegionType>
1574 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1575 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1576 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001577
1578 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1579 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001580 const VkImageBlit *pRegions, VkFilter filter) const override;
1581 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001582 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001583
Jeff Leger178b1e52020-10-05 12:22:23 -04001584 template <typename RegionType>
1585 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1586 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1587 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001588 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1589 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001590 VkFilter filter) override;
1591 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001592 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001593
John Zulauffaea0ee2021-01-14 14:01:32 -07001594 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1595 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1596 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001597 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001598 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1599 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001600
John Zulauffaea0ee2021-01-14 14:01:32 -07001601 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1602 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001603 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001604
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001605 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1606 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001607
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001608 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1609 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001610
1611 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001612 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001613 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001614 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001615
1616 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001617 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001618 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001619 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001620
1621 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001622 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001623 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001624 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001625
1626 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001627 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001628 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001629 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001630
locke-lunargff255f92020-05-13 18:53:52 -06001631 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1632 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1633 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001634 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1635 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001636 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001637 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1638 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001639 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1640 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001641 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001642 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1643 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001644 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001645 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1646 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001647 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001648 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1649 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001650 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001651 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1652 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001653 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001654
locke-lunargff255f92020-05-13 18:53:52 -06001655 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1656 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1657 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001658 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1659 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001660 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001661 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1662 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1663 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001664 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1665 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001666 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001667 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1668 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001669 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001670 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1671 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001672 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001673 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1674 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001675 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001676 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1677 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001678 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001679
1680 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1681 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001682 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001683 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1684 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001685 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001686
1687 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1688 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001689 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001690 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1691 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001692 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001693
1694 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1695 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001696 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001697 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1698 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001699 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001700
1701 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001702 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001703 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001704 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001705
1706 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1707 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001708 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001709
locke-lunarge1a67022020-04-29 00:15:36 -06001710 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1711 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001712 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001713
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001714 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001715 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1716 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001717 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001718 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1719 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001720
locke-lunarge1a67022020-04-29 00:15:36 -06001721 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001722 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001723 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001724 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001725
1726 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001727 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001728 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001729 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001730
1731 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1732 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1733
John Zulauf4edde622021-02-15 08:54:50 -07001734 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1735 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001736 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1737 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001738 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1739 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001740 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001741
John Zulauf49beb112020-11-04 16:06:31 -07001742 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1743 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1744
John Zulauf4edde622021-02-15 08:54:50 -07001745 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1746 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001747 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1748 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001749 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001750 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001751
John Zulauf49beb112020-11-04 16:06:31 -07001752 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1753 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1754 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1755 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1756 uint32_t imageMemoryBarrierCount,
1757 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1758 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1759 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1760 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1761 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1762 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001763 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1764 const VkDependencyInfoKHR *pDependencyInfos) const override;
1765 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1766 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001767 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1768 const VkDependencyInfo *pDependencyInfos) const override;
1769 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1770 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001771 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1772 VkDeviceSize dstOffset, uint32_t marker) const override;
1773 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1774 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001775 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1776 const VkCommandBuffer *pCommandBuffers) const override;
1777 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1778 const VkCommandBuffer *pCommandBuffers) override;
John Zulaufbbda4572022-04-19 16:20:45 -06001779 bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1780 VkFence fence) const override;
1781 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence,
1782 VkResult result) override;
1783 bool PreCallValidateQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1784 VkFence fence) const override;
1785 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence,
1786 VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001787};