blob: 345034c869a7997fc5f68edbffd4b27b2ade98d9 [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
John Zulaufab7756b2020-12-29 16:10:16 -07002 * Copyright (c) 2019-2021 Valve Corporation
3 * Copyright (c) 2019-2021 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 Zulaufe7f6a5e2021-01-16 14:31:18 -070035using CommandBufferAccessContextShared = std::shared_ptr<CommandBufferAccessContext>;
John Zulauf64ffe552021-02-06 10:25:07 -070036class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070037class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060038struct ResourceFirstAccess;
John Zulaufd5115702021-01-18 12:34:33 -070039class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060040
John Zulaufd0ec59f2021-03-13 14:25:08 -070041using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
42using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
43
John Zulauf2f952d22020-02-10 11:34:51 -070044enum SyncHazard {
45 NONE = 0,
46 READ_AFTER_WRITE,
47 WRITE_AFTER_READ,
48 WRITE_AFTER_WRITE,
49 READ_RACING_WRITE,
50 WRITE_RACING_WRITE,
51 WRITE_RACING_READ,
52};
John Zulauf9cb530d2019-09-30 14:14:10 -060053
John Zulauf8e3c3e92021-01-06 11:19:36 -070054enum class SyncOrdering : uint8_t {
55 kNonAttachment = 0,
56 kColorAttachment = 1,
57 kDepthStencilAttachment = 2,
58 kRaster = 3,
59 kNumOrderings = 4,
60};
61
John Zulauf9cb530d2019-09-30 14:14:10 -060062// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
63struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070064 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060065 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
66 }
John Zulauf1507ee42020-05-18 11:33:09 -060067 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
68 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
69 }
John Zulauf9cb530d2019-09-30 14:14:10 -060070
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070071 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060072 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
73
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070074 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
75 return (stage_access_bit & syncStageAccessWriteMask).any();
76 }
77 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
78 return (stage_access_mask & syncStageAccessWriteMask).any();
79 }
John Zulauf9cb530d2019-09-30 14:14:10 -060080 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070081 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060082 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
83 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070084 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
85 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
86 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
87 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060088 return stage_scope & AccessScopeByAccess(accesses);
89 }
90};
91
John Zulauf14940722021-04-12 15:19:02 -060092struct ResourceUsageRecord {
93 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070094 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070095 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -060096 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070097 CMD_TYPE command = CMD_NONE;
98 Count seq_num = 0U;
99 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600100
101 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
102 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600103 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 -0600104 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700105
John Zulauf14940722021-04-12 15:19:02 -0600106 ResourceUsageRecord() = default;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600107 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, Count sub_command_, const CMD_BUFFER_STATE *cb_state_,
108 Count reset_count_)
109 : command(command_), seq_num(seq_num_), sub_command(sub_command_), cb_state(cb_state_), reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600110};
111
John Zulauf3c2a0b32021-07-14 11:14:52 -0600112// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600113using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600114using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600115
John Zulauf9cb530d2019-09-30 14:14:10 -0600116struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600117 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600118 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600119 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600120 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600121 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600122 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600123 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600124 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600125 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulauf9cb530d2019-09-30 14:14:10 -0600126};
127
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700128struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700129 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
130 VkPipelineStageFlags2KHR
131 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
132 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 -0700133 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
134
135 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
136
Jeremy Gebben40a22942020-12-22 14:22:06 -0700137 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
138 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700139};
140
John Zulauf3d84f1b2020-03-09 13:33:25 -0600141struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700142 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600143 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700144 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600145 SyncStageAccessFlags dst_access_scope;
146 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700147 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600148 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700149
150 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
151
152 template <typename Barrier>
153 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
154
155 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700156 // template constructor for sync2 barriers
157 template <typename Barrier>
158 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700159
John Zulaufa0a98292020-09-18 09:30:10 -0600160 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700161 // Note that after merge, only the exec_scope and access_scope fields are fully valid
162 // TODO: Do we need to update any of the other fields? Merging has limited application.
163 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600164 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700165 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600166 dst_access_scope |= other.dst_access_scope;
167 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600168};
John Zulauf69133422020-05-20 14:55:53 -0600169
John Zulauf43cc7462020-12-03 12:33:12 -0700170enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
171
John Zulauf4a6105a2020-11-17 15:11:05 -0700172struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700173 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700174 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700175 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
176 EventPointer event;
177 CMD_TYPE last_command; // Only Event commands are valid here.
John Zulauf610e28c2021-08-03 17:46:23 -0600178 ResourceUsageTag last_command_tag; // Needed to filter replay validation
John Zulauf4a6105a2020-11-17 15:11:05 -0700179 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700180 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700181 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700182 ResourceUsageTag first_scope_tag;
John Zulauf78b1f892021-09-20 15:02:09 -0600183 bool first_scope_set;
John Zulaufd5115702021-01-18 12:34:33 -0700184 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700185 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700186 template <typename EventPointerType>
187 SyncEventState(EventPointerType &&event_state)
188 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700189 last_command(CMD_NONE),
John Zulauf610e28c2021-08-03 17:46:23 -0600190 last_command_tag(0),
John Zulaufd5115702021-01-18 12:34:33 -0700191 unsynchronized_set(CMD_NONE),
192 barriers(0U),
193 scope(),
194 first_scope_tag(),
John Zulauf78b1f892021-09-20 15:02:09 -0600195 first_scope_set(false),
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600196 destroyed((event_state.get() == nullptr) || event_state->Destroyed()) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700197 SyncEventState() : SyncEventState(EventPointer()) {}
198 void ResetFirstScope();
199 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700200 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700201 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700202};
John Zulaufd5115702021-01-18 12:34:33 -0700203using SyncEventStateShared = std::shared_ptr<SyncEventState>;
204using SyncEventStateConstShared = std::shared_ptr<const SyncEventState>;
John Zulauf669dfd52021-01-27 17:15:28 -0700205class SyncEventsContext {
206 public:
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700207 using Map = layer_data::unordered_map<const EVENT_STATE *, SyncEventStateShared>;
John Zulauf669dfd52021-01-27 17:15:28 -0700208 using iterator = Map::iterator;
209 using const_iterator = Map::const_iterator;
210
211 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
212 const auto find_it = map_.find(event_state.get());
213 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700214 if (!event_state.get()) return nullptr;
215
John Zulauf669dfd52021-01-27 17:15:28 -0700216 const auto *event_plain_ptr = event_state.get();
217 auto sync_state = SyncEventStateShared(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700218 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700219 return insert_pair.first->second.get();
220 }
221 return find_it->second.get();
222 }
223
224 const SyncEventState *Get(const EVENT_STATE *event_state) const {
225 const auto find_it = map_.find(event_state);
226 if (find_it == map_.end()) {
227 return nullptr;
228 }
229 return find_it->second.get();
230 }
John Zulauf6ce24372021-01-30 05:56:25 -0700231 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700232
John Zulauf8eda1562021-04-13 17:06:41 -0600233 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst);
234
John Zulauf669dfd52021-01-27 17:15:28 -0700235 // stl style naming for range-for support
236 inline iterator begin() { return map_.begin(); }
237 inline const_iterator begin() const { return map_.begin(); }
238 inline iterator end() { return map_.end(); }
239 inline const_iterator end() const { return map_.end(); }
240
241 void Destroy(const EVENT_STATE *event_state) {
242 auto sync_it = map_.find(event_state);
243 if (sync_it != map_.end()) {
244 sync_it->second->destroyed = true;
245 map_.erase(sync_it);
246 }
247 }
248 void Clear() { map_.clear(); }
249
250 private:
251 Map map_;
252};
John Zulauf4a6105a2020-11-17 15:11:05 -0700253
John Zulauf4fa68462021-04-26 21:04:22 -0600254struct ResourceFirstAccess {
255 ResourceUsageTag tag;
256 SyncStageAccessIndex usage_index;
257 SyncOrdering ordering_rule;
258 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
259 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
260 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
261 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
262 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
263 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
264 bool operator==(const ResourceFirstAccess &rhs) const {
265 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
266 }
267};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600268
John Zulauf9cb530d2019-09-30 14:14:10 -0600269class ResourceAccessState : public SyncStageAccess {
270 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700271 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700272 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700273 SyncStageAccessFlags access_scope;
274 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700275 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700276 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700277 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600278 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
279 exec_scope |= rhs.exec_scope;
280 access_scope |= rhs.access_scope;
281 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700282 }
283 };
John Zulauf4fa68462021-04-26 21:04:22 -0600284 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
285 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700286
John Zulauf9cb530d2019-09-30 14:14:10 -0600287 // Mutliple read operations can be simlutaneously (and independently) synchronized,
288 // given the only the second execution scope creates a dependency chain, we have to track each,
289 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
290 // and applicable one for hazard detection
291 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700292 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600293 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600294 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700295 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600296 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700297 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
298 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600299 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700300 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600301 ResourceUsageTag tag_)
John Zulaufab7756b2020-12-29 16:10:16 -0700302 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600303 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600304 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600305 return same;
306 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700307 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700308 // If the read stage is not in the src sync scope
309 // *AND* not execution chained with an existing sync barrier (that's the or)
310 // then the barrier access is unsafe (R/W after R)
311 return (src_exec_scope & (stage | barriers)) == 0;
312 }
313
John Zulaufe5da6e52020-03-18 15:32:18 -0600314 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700315 inline void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600316 ResourceUsageTag tag_) {
John Zulauf4285ee92020-09-23 10:20:52 -0600317 stage = stage_;
318 access = access_;
319 barriers = barriers_;
320 tag = tag_;
John Zulauf89311b42020-09-29 16:28:47 -0600321 pending_dep_chain = 0; // If this is a new read, we aren't applying a barrier set.
John Zulauf4285ee92020-09-23 10:20:52 -0600322 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600323 };
324
325 public:
326 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf4fa68462021-04-26 21:04:22 -0600327 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule) const;
328 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering) const;
John Zulaufae842002021-04-15 18:20:55 -0600329 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
330
331 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
332 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
333 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600334
Jeremy Gebben40a22942020-12-22 14:22:06 -0700335 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700336 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700337 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600338 const SyncStageAccessFlags &source_access_scope, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600339
John Zulauf14940722021-04-12 15:19:02 -0600340 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
341 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600342 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600343 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600344 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, ResourceUsageTag tag);
John Zulauf89311b42020-09-29 16:28:47 -0600345 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600346 void ApplyBarrier(ResourceUsageTag scope_tag, const SyncBarrier &barrier, bool layout_transition);
347 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufae842002021-04-15 18:20:55 -0600348 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600349
John Zulauf4fa68462021-04-26 21:04:22 -0600350 void OffsetTag(ResourceUsageTag offset) {
351 if (last_write.any()) write_tag += offset;
352 for (auto &read_access : last_reads) {
353 read_access.tag += offset;
354 }
355 for (auto &first : first_accesses_) {
356 first.tag += offset;
357 }
358 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600359 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600360 : write_barriers(~SyncStageAccessFlags(0)),
361 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600362 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600363 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600364 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600365 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600366 read_execution_barriers(0),
367 pending_write_dep_chain(0),
368 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700369 pending_write_barriers(0),
John Zulauf4fa68462021-04-26 21:04:22 -0600370 pending_layout_ordering_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700371 first_accesses_(),
John Zulauf4fa68462021-04-26 21:04:22 -0600372 first_read_stages_(0U),
373 first_write_layout_ordering_() {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600374
John Zulaufb02c1eb2020-10-06 16:33:36 -0600375 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700376 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600377 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600378 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600379 bool operator==(const ResourceAccessState &rhs) const {
380 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700381 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
382 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700383 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600384 return same;
385 }
386 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700387 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600388 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700389 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700390 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
391 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600392
John Zulauf9cb530d2019-09-30 14:14:10 -0600393 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700394 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700395 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700396 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
397 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600398 // If the previous write is *not* a layout transition
399 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700400 // *AND* the current barrier is not in the dependency chain
401 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
402 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600403 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
404 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700405 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700406 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700407 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
408 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700409 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700410 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600411 }
John Zulaufd14743a2020-07-03 09:42:39 -0600412
Jeremy Gebben40a22942020-12-22 14:22:06 -0700413 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600414 return stage_mask != (stage_mask & barriers);
415 }
416
Jeremy Gebben40a22942020-12-22 14:22:06 -0700417 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600418 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700419 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700420 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700421
John Zulauf14940722021-04-12 15:19:02 -0600422 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600423 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700424
John Zulauf8e3c3e92021-01-06 11:19:36 -0700425 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
426 return kOrderingRules[static_cast<size_t>(ordering_enum)];
427 }
John Zulaufd14743a2020-07-03 09:42:39 -0600428
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700429 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600430
John Zulauf9cb530d2019-09-30 14:14:10 -0600431 // With reads, each must be "safe" relative to it's prior write, so we need only
432 // save the most recent write operation (as anything *transitively* unsafe would arleady
433 // be included
434 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700435 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600436 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600437 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600438
John Zulauff51fbb62020-10-02 14:43:24 -0600439 // TODO Input Attachment cleanup for multiple reads in a given stage
440 // Tracks whether the fragment shader read is input attachment read
441 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600442
Jeremy Gebben40a22942020-12-22 14:22:06 -0700443 VkPipelineStageFlags2KHR last_read_stages;
444 VkPipelineStageFlags2KHR read_execution_barriers;
Artem Bolgar09b01542021-06-01 23:49:14 -0700445 small_vector<ReadState, 3, uint32_t> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600446
447 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700448 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600449 bool pending_layout_transition;
450 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600451 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700452 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700453 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600454 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700455
456 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600457};
John Zulauf22aefed2021-03-11 18:14:35 -0700458using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
459using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600460
John Zulauf16adfc92020-04-08 10:28:33 -0600461using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700462using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700463using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600464using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600465
John Zulaufd0ec59f2021-03-13 14:25:08 -0700466class AttachmentViewGen {
467 public:
468 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
469 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
470 AttachmentViewGen(const AttachmentViewGen &other) = default;
471 AttachmentViewGen(AttachmentViewGen &&other) = default;
472 AccessAddressType GetAddressType() const;
473 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
474 const ImageRangeGen *GetRangeGen(Gen type) const;
475 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
476 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
477
478 private:
479 using RangeGenStore = layer_data::optional<ImageRangeGen>;
480 const IMAGE_VIEW_STATE *view_ = nullptr;
481 VkImageAspectFlags view_mask_ = 0U;
482 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
483};
484
485using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
486
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700487using SyncMemoryBarrier = SyncBarrier;
488struct SyncBufferMemoryBarrier {
489 using Buffer = std::shared_ptr<const BUFFER_STATE>;
490 Buffer buffer;
491 SyncBarrier barrier;
492 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700493 bool IsLayoutTransition() const { return false; }
494 const ResourceAccessRange &Range() const { return range; };
495 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700496 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
497 : buffer(buffer_), barrier(barrier_), range(range_) {}
498 SyncBufferMemoryBarrier() = default;
499};
500
501struct SyncImageMemoryBarrier {
502 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600503
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700504 Image image;
505 uint32_t index;
506 SyncBarrier barrier;
507 VkImageLayout old_layout;
508 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600509 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700510
511 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600512 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700513 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700514 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
515 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
516 : image(image_),
517 index(index_),
518 barrier(barrier_),
519 old_layout(old_layout_),
520 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600521 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700522 SyncImageMemoryBarrier() = default;
523};
524
525class SyncOpBase {
526 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700527 SyncOpBase() : cmd_(CMD_NONE) {}
528 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600529 virtual ~SyncOpBase() = default;
530
sfricke-samsung85584a72021-09-30 21:43:38 -0700531 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700532 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600533 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
534 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600535 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -0600536 virtual void DoRecord(ResourceUsageTag tag, AccessContext *access_context, SyncEventsContext *events_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700537
538 protected:
539 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700540};
541
John Zulaufd5115702021-01-18 12:34:33 -0700542class SyncOpBarriers : public SyncOpBase {
543 protected:
544 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600545 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700546 AccessContext *context);
547 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600548 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700549 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700550
John Zulauf36ef9282021-02-02 11:47:24 -0700551 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700552 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
553 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
554 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
555 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700556 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
557 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700558
John Zulauf8eda1562021-04-13 17:06:41 -0600559 ~SyncOpBarriers() override = default;
560
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700561 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700562 struct BarrierSet {
563 VkDependencyFlags dependency_flags;
564 SyncExecScope src_exec_scope;
565 SyncExecScope dst_exec_scope;
566 std::vector<SyncMemoryBarrier> memory_barriers;
567 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
568 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
569 bool single_exec_scope;
570 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
571 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
572 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
573 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
574 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
575 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
576 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
577 const VkImageMemoryBarrier *pImageMemoryBarriers);
578 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
579 const VkMemoryBarrier2KHR *barriers);
580 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
581 uint32_t barrier_count, const VkBufferMemoryBarrier2KHR *barriers);
582 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
583 uint32_t barrier_count, const VkImageMemoryBarrier2KHR *barriers);
584 };
585 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700586};
587
John Zulaufd5115702021-01-18 12:34:33 -0700588class SyncOpPipelineBarrier : public SyncOpBarriers {
589 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700590 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
591 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
592 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700593 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
594 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700595 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
596 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600597 ~SyncOpPipelineBarrier() override = default;
598
John Zulaufd5115702021-01-18 12:34:33 -0700599 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600600 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
601 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600602 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600603 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700604};
605
606class SyncOpWaitEvents : public SyncOpBarriers {
607 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700608 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
609 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
610 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700611 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
612 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700613
614 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
615 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600616 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700617
John Zulaufd5115702021-01-18 12:34:33 -0700618 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600619 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
620 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600621 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600622 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700623
624 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600625 static const char *const kIgnored;
626 bool DoValidate(const CommandBufferAccessContext &cb_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700627 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
628 // 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 -0700629 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
630 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700631};
632
John Zulauf6ce24372021-01-30 05:56:25 -0700633class SyncOpResetEvent : public SyncOpBase {
634 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700635 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700636 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600637 ~SyncOpResetEvent() override = default;
638
John Zulauf6ce24372021-01-30 05:56:25 -0700639 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600640 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
641 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600642 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600643 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700644
645 private:
John Zulauf1bf30522021-09-03 15:39:06 -0600646 bool DoValidate(const CommandBufferAccessContext& cb_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700647 std::shared_ptr<const EVENT_STATE> event_;
648 SyncExecScope exec_scope_;
649};
650
651class SyncOpSetEvent : public SyncOpBase {
652 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700653 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700654 VkPipelineStageFlags2KHR stageMask);
655 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
656 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600657 ~SyncOpSetEvent() override = default;
658
John Zulauf6ce24372021-01-30 05:56:25 -0700659 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600660 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
661 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600662 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700663
664 private:
John Zulauf610e28c2021-08-03 17:46:23 -0600665 bool DoValidate(const CommandBufferAccessContext &cb_context, const ResourceUsageTag base_tag) const;
666 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700667 std::shared_ptr<const EVENT_STATE> event_;
668 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700669 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
670 std::shared_ptr<safe_VkDependencyInfoKHR> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700671};
John Zulauf64ffe552021-02-06 10:25:07 -0700672
673class SyncOpBeginRenderPass : public SyncOpBase {
674 public:
675 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700676 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600677 ~SyncOpBeginRenderPass() override = default;
678
John Zulauf64ffe552021-02-06 10:25:07 -0700679 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600680 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
681 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600682 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600683 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700684
685 protected:
686 safe_VkRenderPassBeginInfo renderpass_begin_info_;
687 safe_VkSubpassBeginInfo subpass_begin_info_;
688 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
689 std::vector<const IMAGE_VIEW_STATE *> attachments_;
690 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
691};
692
693class SyncOpNextSubpass : public SyncOpBase {
694 public:
695 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700696 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600697 ~SyncOpNextSubpass() override = default;
698
John Zulauf64ffe552021-02-06 10:25:07 -0700699 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600700 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
701 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600702 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600703 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700704
705 protected:
706 safe_VkSubpassBeginInfo subpass_begin_info_;
707 safe_VkSubpassEndInfo subpass_end_info_;
708};
709
710class SyncOpEndRenderPass : public SyncOpBase {
711 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700712 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600713 ~SyncOpEndRenderPass() override = default;
714
John Zulauf64ffe552021-02-06 10:25:07 -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 Zulauf610e28c2021-08-03 17:46:23 -0600718 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600719 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700720
721 protected:
722 safe_VkSubpassEndInfo subpass_end_info_;
723};
724
John Zulauf540266b2020-04-06 18:54:53 -0600725class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700726 public:
John Zulauf69133422020-05-20 14:55:53 -0600727 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600728 kDetectPrevious = 1U << 0,
729 kDetectAsync = 1U << 1,
730 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600731 };
John Zulauf43cc7462020-12-03 12:33:12 -0700732 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600733
John Zulauf3d84f1b2020-03-09 13:33:25 -0600734 struct TrackBack {
John Zulaufa0a98292020-09-18 09:30:10 -0600735 std::vector<SyncBarrier> barriers;
John Zulauf1a224292020-06-30 14:52:13 -0600736 const AccessContext *context;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700737 TrackBack(const TrackBack &) = default;
John Zulaufbaea94f2020-09-15 17:55:16 -0600738 TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_,
John Zulaufa0a98292020-09-18 09:30:10 -0600739 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
740 : barriers(), context(context_) {
741 barriers.reserve(subpass_dependencies_.size());
742 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
743 assert(dependency);
744 barriers.emplace_back(queue_flags_, *dependency);
745 }
746 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600747 TrackBack &operator=(const TrackBack &) = default;
748 TrackBack() = default;
749 };
John Zulauf5c5e88d2019-12-26 11:22:02 -0700750
John Zulauf355e49b2020-04-24 15:11:15 -0600751 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600752 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600753 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
754 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600755 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700756 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
757 DetectOptions options) const;
758 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600759 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
760 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600761 template <typename Detector>
762 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
763 DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600764 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf110413c2021-03-20 05:38:38 -0600765 const VkImageSubresourceRange &subresource_range) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700766 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
767 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
768
John Zulauf69133422020-05-20 14:55:53 -0600769 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700770 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600771 const VkOffset3D &offset, const VkExtent3D &extent) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700772 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700773 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700774 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
775 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700776 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
777 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700778 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700779 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700780 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700781 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700782 const SyncStageAccessFlags &src_stage_accesses,
783 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700784 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700785 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600786
John Zulaufb02c1eb2020-10-06 16:33:36 -0600787 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600788 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600789
John Zulaufae842002021-04-15 18:20:55 -0600790 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context) const;
791
John Zulaufe5da6e52020-03-18 15:32:18 -0600792 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600793 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600794 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600795 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600796 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700797 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600798 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700799 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600800 for (auto &map : access_state_maps_) {
801 map.clear();
802 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600803 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600804
805 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
806 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600807 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
808 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700809 template <typename BarrierAction>
810 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
811 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700812 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700813 const ResourceAccessState *infill_state,
814 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700815 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600816 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700817 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
818 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600819 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700820 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600821 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
822 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600823
John Zulauf8e3c3e92021-01-06 11:19:36 -0700824 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600825 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700826 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600827 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
828 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600829 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600830 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700831 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600832 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700833 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600834 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600835 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700836 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600837 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700838 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600839 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600840
John Zulauf540266b2020-04-06 18:54:53 -0600841 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600842
John Zulauf4fa68462021-04-26 21:04:22 -0600843 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700844 template <typename Action, typename RangeGen>
845 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600846 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700847 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600848 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700849 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700850 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600851
John Zulauf540266b2020-04-06 18:54:53 -0600852 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600853 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600854
855 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600856 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600857
John Zulauf43cc7462020-12-03 12:33:12 -0700858 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
859 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
860 return access_state_maps_[static_cast<size_t>(type)];
861 }
862 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
863 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
864 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
865 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600866 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
867 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700868 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600869 } else {
870 assert(subpass < prev_by_subpass_.size());
871 return prev_by_subpass_[subpass];
872 }
873 }
John Zulauf16adfc92020-04-08 10:28:33 -0600874
John Zulauf64ffe552021-02-06 10:25:07 -0700875 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700876 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
877 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700878 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700879 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
880 const char *func_name) const;
881 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
882
883 const RENDER_PASS_STATE &rp_state,
884
885 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
886 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700887 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700888 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700889 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600890
John Zulauf14940722021-04-12 15:19:02 -0600891 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700892 template <typename Action>
893 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700894
John Zulauf3d84f1b2020-03-09 13:33:25 -0600895 private:
896 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700897 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600898 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600899 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700900 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600901 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700902 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700903 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600904 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600905
906 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600907 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600908 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700909 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700910 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600911 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700912 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600913};
914
John Zulauf355e49b2020-04-24 15:11:15 -0600915class RenderPassAccessContext {
916 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700917 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
918 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700919 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
920 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
921 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600922
John Zulauf64ffe552021-02-06 10:25:07 -0700923 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
924 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -0600925 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700926 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
927 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
928 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600929
John Zulauf14940722021-04-12 15:19:02 -0600930 void RecordLayoutTransitions(ResourceUsageTag tag);
931 void RecordLoadOperations(ResourceUsageTag tag);
932 void RecordBeginRenderPass(ResourceUsageTag tag);
933 void RecordNextSubpass(ResourceUsageTag prev_subpass_tag, ResourceUsageTag next_subpass_tag);
934 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600935
John Zulauf540266b2020-04-06 18:54:53 -0600936 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
937 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600938 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
939 uint32_t GetCurrentSubpass() const { return current_subpass_; }
940 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700941 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -0600942
943 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600944 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700945 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600946 uint32_t current_subpass_;
947 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700948 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600949};
950
John Zulauf64ffe552021-02-06 10:25:07 -0700951// Command execution context is the base class for command buffer and queue contexts
952// Preventing unintented leakage of subclass specific state, storing enough information
953// for message logging.
954// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
955class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600956 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700957 CommandExecutionContext() : sync_state_(nullptr) {}
958 CommandExecutionContext(SyncValidator *sync_validator) : sync_state_(sync_validator) {}
959 virtual ~CommandExecutionContext() = default;
960 const SyncValidator &GetSyncState() const {
961 assert(sync_state_);
962 return *sync_state_;
963 }
964 SyncValidator &GetSyncState() {
965 assert(sync_state_);
966 return *sync_state_;
967 }
John Zulauf4fa68462021-04-26 21:04:22 -0600968 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
969 virtual std::string FormatUsage(const ResourceFirstAccess &access) const = 0;
John Zulauf64ffe552021-02-06 10:25:07 -0700970 virtual std::string FormatUsage(const HazardResult &hazard) const = 0;
971
972 protected:
973 SyncValidator *sync_state_;
974};
975
976class CommandBufferAccessContext : public CommandExecutionContext {
977 public:
John Zulauf8eda1562021-04-13 17:06:41 -0600978 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
979 struct SyncOpEntry {
980 ResourceUsageTag tag;
981 SyncOpPointer sync_op;
982 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
983 SyncOpEntry() = default;
984 SyncOpEntry(const SyncOpEntry &other) = default;
985 };
986
John Zulauf64ffe552021-02-06 10:25:07 -0700987 CommandBufferAccessContext(SyncValidator *sync_validator = nullptr)
988 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -0600989 cb_state_(),
990 queue_flags_(),
991 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -0600992 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -0600993 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700994 command_number_(0),
995 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600996 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600997 cb_access_context_(),
998 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -0700999 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001000 render_pass_contexts_(),
1001 current_renderpass_context_(),
1002 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001003 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001004 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001005 cb_state_ = cb_state;
1006 queue_flags_ = queue_flags;
1007 }
John Zulauf4fa68462021-04-26 21:04:22 -06001008
1009 struct AsProxyContext {};
1010 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1011
John Zulauf64ffe552021-02-06 10:25:07 -07001012 ~CommandBufferAccessContext() override = default;
1013 CommandExecutionContext &GetExecutionContext() { return *this; }
1014 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001015
1016 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001017 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001018 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001019 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001020 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001021 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001022 reset_count_++;
1023 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001024 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001025 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001026 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001027 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001028 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001029 void MarkDestroyed() { destroyed_ = true; }
1030 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001031
John Zulauf4fa68462021-04-26 21:04:22 -06001032 std::string FormatUsage(ResourceUsageTag tag) const override;
1033 std::string FormatUsage(const ResourceFirstAccess &access) const override;
John Zulauf64ffe552021-02-06 10:25:07 -07001034 std::string FormatUsage(const HazardResult &hazard) const override;
John Zulauf540266b2020-04-06 18:54:53 -06001035 AccessContext *GetCurrentAccessContext() { return current_context_; }
John Zulauf669dfd52021-01-27 17:15:28 -07001036 SyncEventsContext *GetCurrentEventsContext() { return &events_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001037 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf540266b2020-04-06 18:54:53 -06001038 const AccessContext *GetCurrentAccessContext() const { return current_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001039 const SyncEventsContext *GetCurrentEventsContext() const { return &events_context_; }
1040 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
1041 void RecordBeginRenderPass(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
John Zulauf14940722021-04-12 15:19:02 -06001042 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, ResourceUsageTag tag);
Jeremy Gebben9893daf2021-01-04 10:40:50 -07001043 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -07001044
locke-lunarg61870c22020-06-09 14:51:50 -06001045 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001046 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001047 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001048 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001049 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001050 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001051 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001052 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf8eda1562021-04-13 17:06:41 -06001053 void RecordNextSubpass(ResourceUsageTag prev_tag, ResourceUsageTag next_tag);
1054 void RecordEndRenderPass(ResourceUsageTag tag);
John Zulauf4a6105a2020-11-17 15:11:05 -07001055 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001056
John Zulauf4fa68462021-04-26 21:04:22 -06001057 bool ValidateFirstUse(CommandBufferAccessContext *proxy_context, const char *func_name, uint32_t index) const;
1058 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context, CMD_TYPE cmd);
1059
1060 void ResolveRecordedContext(const AccessContext &recorded_context, ResourceUsageTag offset);
1061 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulaufae842002021-04-15 18:20:55 -06001062
John Zulauf3d84f1b2020-03-09 13:33:25 -06001063 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1064 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001065
1066 inline ResourceUsageTag NextSubcommandTag(CMD_TYPE command) {
John Zulauf14940722021-04-12 15:19:02 -06001067 ResourceUsageTag next = access_log_.size();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001068 access_log_.emplace_back(command, command_number_, ++subcommand_number_, cb_state_.get(), reset_count_);
John Zulauffaea0ee2021-01-14 14:01:32 -07001069 return next;
1070 }
John Zulauf4fa68462021-04-26 21:04:22 -06001071 inline ResourceUsageTag GetTagLimit() const { return access_log_.size(); }
John Zulauffaea0ee2021-01-14 14:01:32 -07001072
John Zulauf355e49b2020-04-24 15:11:15 -06001073 inline ResourceUsageTag NextCommandTag(CMD_TYPE command) {
John Zulauf355e49b2020-04-24 15:11:15 -06001074 command_number_++;
John Zulauffaea0ee2021-01-14 14:01:32 -07001075 subcommand_number_ = 0;
John Zulauf14940722021-04-12 15:19:02 -06001076 ResourceUsageTag next = access_log_.size();
Jeremy Gebben6ea9d9e2020-12-11 09:41:01 -07001077 // The lowest bit is a sub-command number used to separate operations at the end of the previous renderpass
1078 // from the start of the new one in VkCmdNextRenderpass().
John Zulauf3c2a0b32021-07-14 11:14:52 -06001079 access_log_.emplace_back(command, command_number_, subcommand_number_, cb_state_.get(), reset_count_);
John Zulauf355e49b2020-04-24 15:11:15 -06001080 return next;
1081 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001082
John Zulauffaea0ee2021-01-14 14:01:32 -07001083 const CMD_BUFFER_STATE &GetCBState() const {
1084 assert(cb_state_);
1085 return *(cb_state_.get());
1086 }
1087 CMD_BUFFER_STATE &GetCBState() {
1088 assert(cb_state_);
1089 return *(cb_state_.get());
1090 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001091
John Zulauf1bf30522021-09-03 15:39:06 -06001092 template <class T, class... Args>
1093 void RecordSyncOp(Args &&...args) {
1094 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1095 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
1096 auto tag = sync_op->Record(this);
1097 AddSyncOp(tag, std::move(sync_op));
1098 }
John Zulauf8eda1562021-04-13 17:06:41 -06001099
John Zulauf3d84f1b2020-03-09 13:33:25 -06001100 private:
John Zulauf1bf30522021-09-03 15:39:06 -06001101 void AddSyncOp(ResourceUsageTag tag, SyncOpPointer &&sync_op) { sync_ops_.emplace_back(tag, std::move(sync_op)); }
John Zulauf4fa68462021-04-26 21:04:22 -06001102 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1103 VkQueueFlags queue_flags_;
1104 bool destroyed_;
1105
John Zulauf14940722021-04-12 15:19:02 -06001106 std::vector<ResourceUsageRecord> access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001107 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001108 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001109 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001110 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001111
John Zulauf355e49b2020-04-24 15:11:15 -06001112 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001113 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001114 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001115
1116 // Don't need the following for an active proxy cb context
1117 std::vector<RenderPassAccessContext> render_pass_contexts_;
1118 RenderPassAccessContext *current_renderpass_context_;
1119 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001120};
1121
1122class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1123 public:
1124 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
1125 using StateTracker = ValidationStateTracker;
1126
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001127 layer_data::unordered_map<VkCommandBuffer, CommandBufferAccessContextShared> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001128
1129 CommandBufferAccessContextShared GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
John Zulauf9cb530d2019-09-30 14:14:10 -06001130 auto found_it = cb_access_state.find(command_buffer);
1131 if (found_it == cb_access_state.end()) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001132 if (!do_insert) return CommandBufferAccessContextShared();
John Zulauf9cb530d2019-09-30 14:14:10 -06001133 // If we don't have one, make it.
John Zulauf3d84f1b2020-03-09 13:33:25 -06001134 auto cb_state = GetShared<CMD_BUFFER_STATE>(command_buffer);
1135 assert(cb_state.get());
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06001136 auto queue_flags = cb_state->GetQueueFlags();
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001137 std::shared_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001138 auto insert_pair = cb_access_state.emplace(command_buffer, std::move(context));
John Zulauf9cb530d2019-09-30 14:14:10 -06001139 found_it = insert_pair.first;
1140 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001141 return found_it->second;
John Zulauf9cb530d2019-09-30 14:14:10 -06001142 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001143
John Zulauf3d84f1b2020-03-09 13:33:25 -06001144 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001145 return GetAccessContextImpl(command_buffer, true).get(); // true -> do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001146 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001147 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001148 return GetAccessContextImpl(command_buffer, false).get(); // false -> don't do_insert on not found
1149 }
1150
1151 CommandBufferAccessContextShared GetAccessContextShared(VkCommandBuffer command_buffer) {
1152 return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
1153 }
1154 CommandBufferAccessContextShared GetAccessContextSharedNoInsert(VkCommandBuffer command_buffer) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001155 return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001156 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001157
1158 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
John Zulauf9cb530d2019-09-30 14:14:10 -06001159 const auto found_it = cb_access_state.find(command_buffer);
1160 if (found_it == cb_access_state.end()) {
1161 return nullptr;
1162 }
1163 return found_it->second.get();
1164 }
1165
John Zulaufd1f85d42020-04-15 12:23:15 -06001166 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1167 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001168 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001169 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001170 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001171 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1172 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001173 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001174
1175 void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001176 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001177
John Zulauf355e49b2020-04-24 15:11:15 -06001178 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001179 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001180
1181 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001182 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001183
1184 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001185 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001186
1187 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001188 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001189
John Zulauf9cb530d2019-09-30 14:14:10 -06001190 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001191 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001192
1193 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001194 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001195
John Zulauf4a6105a2020-11-17 15:11:05 -07001196 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001197 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001198
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001199 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001200
John Zulauf5c5e88d2019-12-26 11:22:02 -07001201 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1202 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001203 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001204
1205 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001206 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001207
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001208 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001209
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001210 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001211
John Zulauf9cb530d2019-09-30 14:14:10 -06001212 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1213 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1214 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1215 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1216 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001217 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001218
1219 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1220 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1221 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1222 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001223 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001224
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001225 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1226 const VkDependencyInfoKHR *pDependencyInfo) const override;
1227 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
1228
John Zulauf3d84f1b2020-03-09 13:33:25 -06001229 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001230 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001231
1232 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001233 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001234 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001235 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001236 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001237 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001238
Mike Schuchardt2df08912020-12-15 16:28:09 -08001239 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001240 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001241 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001242 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1243 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1244 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1245 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001246
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001247 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001248 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001249 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001250 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001251 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001252
sfricke-samsung85584a72021-09-30 21:43:38 -07001253 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001254 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001255 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1256 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001257
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001258 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1259 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1260 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001261
1262 template <typename BufferImageCopyRegionType>
1263 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1264 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1265 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001266 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1267 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001268 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001269 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001270 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001271
Jeff Leger178b1e52020-10-05 12:22:23 -04001272 template <typename BufferImageCopyRegionType>
1273 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1274 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1275 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001276 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001277 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001278 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001279 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001280
Jeff Leger178b1e52020-10-05 12:22:23 -04001281 template <typename BufferImageCopyRegionType>
1282 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1283 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1284 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001285 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001286 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001287 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001288 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001289
Jeff Leger178b1e52020-10-05 12:22:23 -04001290 template <typename BufferImageCopyRegionType>
1291 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1292 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1293 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001294 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001295 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001296 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001297 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001298
1299 template <typename RegionType>
1300 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1301 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1302 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001303
1304 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1305 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001306 const VkImageBlit *pRegions, VkFilter filter) const override;
1307 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001308
Jeff Leger178b1e52020-10-05 12:22:23 -04001309 template <typename RegionType>
1310 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1311 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1312 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001313 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1314 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001315 VkFilter filter) override;
1316 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001317
John Zulauffaea0ee2021-01-14 14:01:32 -07001318 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1319 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1320 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001321 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001322 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1323 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001324
John Zulauffaea0ee2021-01-14 14:01:32 -07001325 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1326 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001327 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001328
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001329 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1330 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001331
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001332 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1333 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001334
1335 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001336 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001337 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001338 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001339
1340 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001341 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001342 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001343 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001344
1345 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001346 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001347 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001348 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001349
1350 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001351 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001352 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001353 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001354
locke-lunargff255f92020-05-13 18:53:52 -06001355 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1356 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1357 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001358 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1359 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001360 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001361 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1362 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001363 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1364 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001365 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001366 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1367 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001368 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001369 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1370 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001371 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001372 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1373 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001374 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001375 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1376 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001377 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001378
locke-lunargff255f92020-05-13 18:53:52 -06001379 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1380 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1381 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001382 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1383 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001384 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001385 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1386 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1387 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001388 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1389 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001390 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001391 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1392 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001393 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001394 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1395 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001396 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001397 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1398 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001399 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001400 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1401 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001402 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001403
1404 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1405 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001406 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001407 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1408 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001409 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001410
1411 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1412 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001413 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001414 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1415 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001416 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001417
1418 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1419 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001420 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001421 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1422 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001423 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001424
1425 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001426 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001427 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001428 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001429
1430 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1431 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001432 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001433
locke-lunarge1a67022020-04-29 00:15:36 -06001434 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1435 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001436 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001437
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001438 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
1439 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001440
locke-lunarge1a67022020-04-29 00:15:36 -06001441 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001442 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001443 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001444 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001445
1446 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001447 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001448 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001449 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001450
1451 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1452 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1453
John Zulauf4edde622021-02-15 08:54:50 -07001454 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1455 const VkDependencyInfoKHR *pDependencyInfo) const override;
1456 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1457 const VkDependencyInfoKHR *pDependencyInfo) override;
1458
John Zulauf49beb112020-11-04 16:06:31 -07001459 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1460 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1461
John Zulauf4edde622021-02-15 08:54:50 -07001462 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1463 VkPipelineStageFlags2KHR stageMask) const override;
1464 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
1465
John Zulauf49beb112020-11-04 16:06:31 -07001466 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1467 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1468 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1469 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1470 uint32_t imageMemoryBarrierCount,
1471 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1472 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1473 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1474 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1475 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1476 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001477 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1478 const VkDependencyInfoKHR *pDependencyInfos) const override;
1479 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1480 const VkDependencyInfoKHR *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001481 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1482 VkDeviceSize dstOffset, uint32_t marker) const override;
1483 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1484 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001485 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1486 const VkCommandBuffer *pCommandBuffers) const override;
1487 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1488 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001489};