blob: acc2b9fe9367d62fed614fa3b2ce64293878b11f [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 <map>
26#include <memory>
27#include <unordered_map>
28#include <vulkan/vulkan.h>
29
30#include "synchronization_validation_types.h"
31#include "state_tracker.h"
32
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;
38class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060039
John Zulauf2f952d22020-02-10 11:34:51 -070040enum SyncHazard {
41 NONE = 0,
42 READ_AFTER_WRITE,
43 WRITE_AFTER_READ,
44 WRITE_AFTER_WRITE,
45 READ_RACING_WRITE,
46 WRITE_RACING_WRITE,
47 WRITE_RACING_READ,
48};
John Zulauf9cb530d2019-09-30 14:14:10 -060049
John Zulauf8e3c3e92021-01-06 11:19:36 -070050enum class SyncOrdering : uint8_t {
51 kNonAttachment = 0,
52 kColorAttachment = 1,
53 kDepthStencilAttachment = 2,
54 kRaster = 3,
55 kNumOrderings = 4,
56};
57
John Zulauf9cb530d2019-09-30 14:14:10 -060058// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
59struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070060 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060061 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
62 }
John Zulauf1507ee42020-05-18 11:33:09 -060063 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
64 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
65 }
John Zulauf9cb530d2019-09-30 14:14:10 -060066
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070067 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060068 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
69
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070070 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
71 return (stage_access_bit & syncStageAccessWriteMask).any();
72 }
73 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
74 return (stage_access_mask & syncStageAccessWriteMask).any();
75 }
John Zulauf9cb530d2019-09-30 14:14:10 -060076 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070077 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060078 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
79 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070080 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
81 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
82 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
83 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060084 return stage_scope & AccessScopeByAccess(accesses);
85 }
86};
87
John Zulauffaea0ee2021-01-14 14:01:32 -070088// The resource tag is relative to the command buffer or queue in which it's found
John Zulauf5f13a792020-03-10 07:31:21 -060089struct ResourceUsageTag {
John Zulauff4aecca2021-01-05 16:21:58 -070090 using TagIndex = uint64_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070091 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070092 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070093 constexpr static uint32_t kMaxCount = std::numeric_limits<Count>::max();
Jeremy Gebben4bb73502020-12-14 11:17:50 -070094
John Zulauffaea0ee2021-01-14 14:01:32 -070095 TagIndex index = 0U; // the index of the command within the command buffer itself (primary or secondary)
96 CMD_TYPE command = CMD_NONE;
97 Count seq_num = 0U;
98 Count sub_command = 0U;
Jeremy Gebben4bb73502020-12-14 11:17:50 -070099
John Zulauffaea0ee2021-01-14 14:01:32 -0700100 bool operator<(const ResourceUsageTag &rhs) const { return index < rhs.index; }
John Zulauf5f13a792020-03-10 07:31:21 -0600101 bool IsBefore(const ResourceUsageTag &rhs) const { return index < rhs.index; }
John Zulauffaea0ee2021-01-14 14:01:32 -0700102 bool operator==(const ResourceUsageTag &rhs) const { return (index == rhs.index); }
John Zulaufe5da6e52020-03-18 15:32:18 -0600103 bool operator!=(const ResourceUsageTag &rhs) const { return !(*this == rhs); }
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700104
John Zulauffaea0ee2021-01-14 14:01:32 -0700105 ResourceUsageTag() = default;
106 ResourceUsageTag(TagIndex index_, Count seq_num_, Count sub_command_, CMD_TYPE command_)
107 : index(index_), command(command_), seq_num(seq_num_), sub_command(sub_command_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600108};
109
John Zulauf9cb530d2019-09-30 14:14:10 -0600110struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600111 std::unique_ptr<const ResourceAccessState> access_state;
112 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600113 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600114 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600115 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600116 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700117 const SyncStageAccessFlags &prior_, const ResourceUsageTag &tag_);
John Zulauf9cb530d2019-09-30 14:14:10 -0600118};
119
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700120struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700121 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
122 VkPipelineStageFlags2KHR
123 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
124 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 -0700125 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
126
127 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
128
Jeremy Gebben40a22942020-12-22 14:22:06 -0700129 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
130 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700131};
132
John Zulauf3d84f1b2020-03-09 13:33:25 -0600133struct SyncBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700134 VkPipelineStageFlags2KHR src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600135 SyncStageAccessFlags src_access_scope;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700136 VkPipelineStageFlags2KHR dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600137 SyncStageAccessFlags dst_access_scope;
138 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700139 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600140 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700141
142 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
143
144 template <typename Barrier>
145 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
146
147 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700148 // template constructor for sync2 barriers
149 template <typename Barrier>
150 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700151
John Zulaufa0a98292020-09-18 09:30:10 -0600152 void Merge(const SyncBarrier &other) {
153 src_exec_scope |= other.src_exec_scope;
154 src_access_scope |= other.src_access_scope;
155 dst_exec_scope |= other.dst_exec_scope;
156 dst_access_scope |= other.dst_access_scope;
157 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600158};
John Zulauf69133422020-05-20 14:55:53 -0600159
John Zulauf43cc7462020-12-03 12:33:12 -0700160enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
161
John Zulauf4a6105a2020-11-17 15:11:05 -0700162struct SyncEventState {
163 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, SetRace, MissingStageBits };
John Zulauf669dfd52021-01-27 17:15:28 -0700164 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700165 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
166 EventPointer event;
167 CMD_TYPE last_command; // Only Event commands are valid here.
168 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700169 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700170 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700171 ResourceUsageTag first_scope_tag;
John Zulaufd5115702021-01-18 12:34:33 -0700172 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700173 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700174 template <typename EventPointerType>
175 SyncEventState(EventPointerType &&event_state)
176 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700177 last_command(CMD_NONE),
178 unsynchronized_set(CMD_NONE),
179 barriers(0U),
180 scope(),
181 first_scope_tag(),
182 destroyed((event_state.get() == nullptr) || event_state->destroyed) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700183 SyncEventState() : SyncEventState(EventPointer()) {}
184 void ResetFirstScope();
185 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700186 IgnoreReason IsIgnoredByWait(VkPipelineStageFlags2KHR srcStageMask) const;
187 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700188};
John Zulaufd5115702021-01-18 12:34:33 -0700189using SyncEventStateShared = std::shared_ptr<SyncEventState>;
190using SyncEventStateConstShared = std::shared_ptr<const SyncEventState>;
John Zulauf669dfd52021-01-27 17:15:28 -0700191class SyncEventsContext {
192 public:
193 using Map = std::unordered_map<const EVENT_STATE *, SyncEventStateShared>;
194 using iterator = Map::iterator;
195 using const_iterator = Map::const_iterator;
196
197 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
198 const auto find_it = map_.find(event_state.get());
199 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700200 if (!event_state.get()) return nullptr;
201
John Zulauf669dfd52021-01-27 17:15:28 -0700202 const auto *event_plain_ptr = event_state.get();
203 auto sync_state = SyncEventStateShared(new SyncEventState(event_state));
204 auto insert_pair = map_.insert(std::make_pair(event_plain_ptr, std::move(sync_state)));
205 return insert_pair.first->second.get();
206 }
207 return find_it->second.get();
208 }
209
210 const SyncEventState *Get(const EVENT_STATE *event_state) const {
211 const auto find_it = map_.find(event_state);
212 if (find_it == map_.end()) {
213 return nullptr;
214 }
215 return find_it->second.get();
216 }
John Zulauf6ce24372021-01-30 05:56:25 -0700217 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700218
219 // stl style naming for range-for support
220 inline iterator begin() { return map_.begin(); }
221 inline const_iterator begin() const { return map_.begin(); }
222 inline iterator end() { return map_.end(); }
223 inline const_iterator end() const { return map_.end(); }
224
225 void Destroy(const EVENT_STATE *event_state) {
226 auto sync_it = map_.find(event_state);
227 if (sync_it != map_.end()) {
228 sync_it->second->destroyed = true;
229 map_.erase(sync_it);
230 }
231 }
232 void Clear() { map_.clear(); }
233
234 private:
235 Map map_;
236};
John Zulauf4a6105a2020-11-17 15:11:05 -0700237
John Zulauf69133422020-05-20 14:55:53 -0600238// To represent ordering guarantees such as rasterization and store
John Zulauf3d84f1b2020-03-09 13:33:25 -0600239
John Zulauf9cb530d2019-09-30 14:14:10 -0600240class ResourceAccessState : public SyncStageAccess {
241 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700242 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700243 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700244 SyncStageAccessFlags access_scope;
245 OrderingBarrier() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700246 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700247 OrderingBarrier &operator=(const OrderingBarrier &) = default;
248 };
249 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
250
John Zulauffaea0ee2021-01-14 14:01:32 -0700251 struct FirstAccess {
252 ResourceUsageTag tag;
253 SyncStageAccessIndex usage_index;
254 SyncOrdering ordering_rule;
255 FirstAccess(const ResourceUsageTag &tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
256 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
257 FirstAccess(const FirstAccess &other) = default;
258 FirstAccess(FirstAccess &&other) = default;
259 FirstAccess &operator=(const FirstAccess &rhs) = default;
260 FirstAccess &operator=(FirstAccess &&rhs) = default;
261
262 bool operator==(const FirstAccess &rhs) const {
263 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
264 }
265 };
266 using FirstAccesses = small_vector<FirstAccess, 3>;
267
John Zulauf9cb530d2019-09-30 14:14:10 -0600268 // Mutliple read operations can be simlutaneously (and independently) synchronized,
269 // given the only the second execution scope creates a dependency chain, we have to track each,
270 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
271 // and applicable one for hazard detection
272 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700273 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600274 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600275 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700276 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600277 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700278 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
279 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600280 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700281 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulaufab7756b2020-12-29 16:10:16 -0700282 const ResourceUsageTag &tag_)
283 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600284 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600285 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600286 return same;
287 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700288 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700289 // If the read stage is not in the src sync scope
290 // *AND* not execution chained with an existing sync barrier (that's the or)
291 // then the barrier access is unsafe (R/W after R)
292 return (src_exec_scope & (stage | barriers)) == 0;
293 }
294
John Zulaufe5da6e52020-03-18 15:32:18 -0600295 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700296 inline void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf4285ee92020-09-23 10:20:52 -0600297 const ResourceUsageTag &tag_) {
298 stage = stage_;
299 access = access_;
300 barriers = barriers_;
301 tag = tag_;
John Zulauf89311b42020-09-29 16:28:47 -0600302 pending_dep_chain = 0; // If this is a new read, we aren't applying a barrier set.
John Zulauf4285ee92020-09-23 10:20:52 -0600303 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600304 };
305
306 public:
307 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700308 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const SyncOrdering &ordering_rule) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600309
Jeremy Gebben40a22942020-12-22 14:22:06 -0700310 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700311 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700312 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, const ResourceUsageTag &start_tag) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700313 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700314 const SyncStageAccessFlags &source_access_scope, const ResourceUsageTag &event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600315
John Zulauf8e3c3e92021-01-06 11:19:36 -0700316 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, const ResourceUsageTag &tag);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700317 void SetWrite(const SyncStageAccessFlags &usage_bit, const ResourceUsageTag &tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600318 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600319 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
320 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, const ResourceUsageTag &tag);
John Zulauf89311b42020-09-29 16:28:47 -0600321 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf4a6105a2020-11-17 15:11:05 -0700322 void ApplyBarrier(const ResourceUsageTag &scope_tag, const SyncBarrier &barrier, bool layout_transition);
John Zulauf89311b42020-09-29 16:28:47 -0600323 void ApplyPendingBarriers(const ResourceUsageTag &tag);
John Zulauf9cb530d2019-09-30 14:14:10 -0600324
325 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600326 : write_barriers(~SyncStageAccessFlags(0)),
327 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600328 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600329 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600330 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600331 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600332 read_execution_barriers(0),
333 pending_write_dep_chain(0),
334 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700335 pending_write_barriers(0),
336 first_accesses_(),
337 first_read_stages_(0U) {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600338
John Zulaufb02c1eb2020-10-06 16:33:36 -0600339 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700340 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600341 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600342 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600343 bool operator==(const ResourceAccessState &rhs) const {
344 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700345 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
346 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700347 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600348 return same;
349 }
350 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700351 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600352 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700353 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700354 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
355 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600356
John Zulauf9cb530d2019-09-30 14:14:10 -0600357 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700358 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700359 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700360 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
361 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700362 // If the previous write is *not* in the 1st access scope
363 // *AND* the current barrier is not in the dependency chain
364 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
365 // then the barrier access is unsafe (R/W after W)
366 return ((last_write & src_access_scope) == 0) && ((src_exec_scope & write_dependency_chain) == 0) && (write_barriers == 0);
367 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700368 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700369 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
370 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700371 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700372 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600373 }
John Zulaufd14743a2020-07-03 09:42:39 -0600374
Jeremy Gebben40a22942020-12-22 14:22:06 -0700375 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600376 return stage_mask != (stage_mask & barriers);
377 }
378
Jeremy Gebben40a22942020-12-22 14:22:06 -0700379 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600380 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700381 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700382 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700383
John Zulauffaea0ee2021-01-14 14:01:32 -0700384 void UpdateFirst(const ResourceUsageTag &tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
385
John Zulauf8e3c3e92021-01-06 11:19:36 -0700386 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
387 return kOrderingRules[static_cast<size_t>(ordering_enum)];
388 }
John Zulaufd14743a2020-07-03 09:42:39 -0600389
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700390 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600391
John Zulauf9cb530d2019-09-30 14:14:10 -0600392 // With reads, each must be "safe" relative to it's prior write, so we need only
393 // save the most recent write operation (as anything *transitively* unsafe would arleady
394 // be included
395 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700396 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600397 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600398 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600399
John Zulauff51fbb62020-10-02 14:43:24 -0600400 // TODO Input Attachment cleanup for multiple reads in a given stage
401 // Tracks whether the fragment shader read is input attachment read
402 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600403
Jeremy Gebben40a22942020-12-22 14:22:06 -0700404 VkPipelineStageFlags2KHR last_read_stages;
405 VkPipelineStageFlags2KHR read_execution_barriers;
John Zulaufab7756b2020-12-29 16:10:16 -0700406 small_vector<ReadState, 3> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600407
408 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700409 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600410 bool pending_layout_transition;
411 SyncStageAccessFlags pending_write_barriers;
John Zulauffaea0ee2021-01-14 14:01:32 -0700412 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700413 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700414
415 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600416};
417
John Zulauf16adfc92020-04-08 10:28:33 -0600418using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700419using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600420using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600421
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700422using SyncMemoryBarrier = SyncBarrier;
423struct SyncBufferMemoryBarrier {
424 using Buffer = std::shared_ptr<const BUFFER_STATE>;
425 Buffer buffer;
426 SyncBarrier barrier;
427 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700428 bool IsLayoutTransition() const { return false; }
429 const ResourceAccessRange &Range() const { return range; };
430 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700431 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
432 : buffer(buffer_), barrier(barrier_), range(range_) {}
433 SyncBufferMemoryBarrier() = default;
434};
435
436struct SyncImageMemoryBarrier {
437 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulaufd5115702021-01-18 12:34:33 -0700438 struct SubImageRange {
439 VkImageSubresourceRange subresource_range;
440 VkOffset3D offset;
441 VkExtent3D extent;
442 };
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700443 Image image;
444 uint32_t index;
445 SyncBarrier barrier;
446 VkImageLayout old_layout;
447 VkImageLayout new_layout;
John Zulaufd5115702021-01-18 12:34:33 -0700448 SubImageRange range;
449
450 bool IsLayoutTransition() const { return old_layout != new_layout; }
451 const SubImageRange &Range() const { return range; };
452 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700453 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
454 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
455 : image(image_),
456 index(index_),
457 barrier(barrier_),
458 old_layout(old_layout_),
459 new_layout(new_layout_),
John Zulaufd5115702021-01-18 12:34:33 -0700460 range({subresource_range_, VkOffset3D{0, 0, 0}, image->createInfo.extent}) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700461 SyncImageMemoryBarrier() = default;
462};
463
464class SyncOpBase {
465 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700466 SyncOpBase() : cmd_(CMD_NONE), name_override_(nullptr) {}
467 SyncOpBase(CMD_TYPE cmd, const char *name_override = nullptr) : cmd_(cmd), name_override_(name_override) {}
468 const char *CmdName() const { return name_override_ ? name_override_ : CommandTypeString(cmd_); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700469 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700470 virtual void Record(CommandBufferAccessContext *cb_context) const = 0;
471
472 protected:
473 CMD_TYPE cmd_;
John Zulauf64ffe552021-02-06 10:25:07 -0700474 // Some promoted commands alias CMD_TYPE for KHR and non-KHR versions, also callers to preserve the cmd name as needed
475 const char *name_override_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700476};
477
John Zulaufd5115702021-01-18 12:34:33 -0700478class SyncOpBarriers : public SyncOpBase {
479 protected:
480 template <typename Barriers, typename FunctorFactory>
481 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, const ResourceUsageTag &tag,
482 AccessContext *context);
483 template <typename Barriers, typename FunctorFactory>
484 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, const ResourceUsageTag &tag,
485 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700486
John Zulauf36ef9282021-02-02 11:47:24 -0700487 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700488 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
489 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
490 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
491 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700492 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
493 const VkDependencyInfoKHR &pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700494
495 protected:
496 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
497 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
498 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
499 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
500 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
501 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
502 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
503 const VkImageMemoryBarrier *pImageMemoryBarriers);
504
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700505 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
506 const VkMemoryBarrier2KHR *barriers);
507 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
508 uint32_t barrier_count, const VkBufferMemoryBarrier2KHR *barriers);
509 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
510 uint32_t barrier_count, const VkImageMemoryBarrier2KHR *barriers);
511
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700512 VkDependencyFlags dependency_flags_;
513 SyncExecScope src_exec_scope_;
514 SyncExecScope dst_exec_scope_;
515 std::vector<SyncMemoryBarrier> memory_barriers_;
516 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers_;
517 std::vector<SyncImageMemoryBarrier> image_memory_barriers_;
518};
519
John Zulaufd5115702021-01-18 12:34:33 -0700520class SyncOpPipelineBarrier : public SyncOpBarriers {
521 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700522 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
523 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
524 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700525 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
526 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700527 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
528 const VkDependencyInfoKHR &pDependencyInfo);
John Zulaufd5115702021-01-18 12:34:33 -0700529 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700530 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700531};
532
533class SyncOpWaitEvents : public SyncOpBarriers {
534 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700535 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
536 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
537 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700538 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
539 const VkImageMemoryBarrier *pImageMemoryBarriers);
540 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700541 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700542
543 protected:
544 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
545 // 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 -0700546 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
547 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700548};
549
John Zulauf6ce24372021-01-30 05:56:25 -0700550class SyncOpResetEvent : public SyncOpBase {
551 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700552 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
553 VkPipelineStageFlags stageMask);
John Zulauf6ce24372021-01-30 05:56:25 -0700554 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700555 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700556
557 private:
558 std::shared_ptr<const EVENT_STATE> event_;
559 SyncExecScope exec_scope_;
560};
561
562class SyncOpSetEvent : public SyncOpBase {
563 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700564 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
565 VkPipelineStageFlags stageMask);
John Zulauf6ce24372021-01-30 05:56:25 -0700566 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700567 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700568
569 private:
570 std::shared_ptr<const EVENT_STATE> event_;
571 SyncExecScope src_exec_scope_;
572};
John Zulauf64ffe552021-02-06 10:25:07 -0700573
574class SyncOpBeginRenderPass : public SyncOpBase {
575 public:
576 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
577 const VkSubpassBeginInfo *pSubpassBeginInfo, const char *command_name = nullptr);
578 bool Validate(const CommandBufferAccessContext &cb_context) const override;
579 void Record(CommandBufferAccessContext *cb_context) const override;
580
581 protected:
582 safe_VkRenderPassBeginInfo renderpass_begin_info_;
583 safe_VkSubpassBeginInfo subpass_begin_info_;
584 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
585 std::vector<const IMAGE_VIEW_STATE *> attachments_;
586 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
587};
588
589class SyncOpNextSubpass : public SyncOpBase {
590 public:
591 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
592 const VkSubpassEndInfo *pSubpassEndInfo, const char *name_override = nullptr);
593 bool Validate(const CommandBufferAccessContext &cb_context) const override;
594 void Record(CommandBufferAccessContext *cb_context) const override;
595
596 protected:
597 safe_VkSubpassBeginInfo subpass_begin_info_;
598 safe_VkSubpassEndInfo subpass_end_info_;
599};
600
601class SyncOpEndRenderPass : public SyncOpBase {
602 public:
603 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo,
604 const char *name_override = nullptr);
605 bool Validate(const CommandBufferAccessContext &cb_context) const override;
606 void Record(CommandBufferAccessContext *cb_context) const override;
607
608 protected:
609 safe_VkSubpassEndInfo subpass_end_info_;
610};
611
John Zulauf540266b2020-04-06 18:54:53 -0600612class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700613 public:
John Zulauf69133422020-05-20 14:55:53 -0600614 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600615 kDetectPrevious = 1U << 0,
616 kDetectAsync = 1U << 1,
617 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600618 };
John Zulauf43cc7462020-12-03 12:33:12 -0700619 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600620
John Zulaufbaea94f2020-09-15 17:55:16 -0600621 // WIP TODO WIP Multi-dep -- change track back to support barrier vector, not just last.
John Zulauf3d84f1b2020-03-09 13:33:25 -0600622 struct TrackBack {
John Zulaufa0a98292020-09-18 09:30:10 -0600623 std::vector<SyncBarrier> barriers;
John Zulauf1a224292020-06-30 14:52:13 -0600624 const AccessContext *context;
John Zulaufbaea94f2020-09-15 17:55:16 -0600625 TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_,
John Zulaufa0a98292020-09-18 09:30:10 -0600626 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
627 : barriers(), context(context_) {
628 barriers.reserve(subpass_dependencies_.size());
629 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
630 assert(dependency);
631 barriers.emplace_back(queue_flags_, *dependency);
632 }
633 }
634
John Zulauf3d84f1b2020-03-09 13:33:25 -0600635 TrackBack &operator=(const TrackBack &) = default;
636 TrackBack() = default;
637 };
John Zulauf5c5e88d2019-12-26 11:22:02 -0700638
John Zulauf355e49b2020-04-24 15:11:15 -0600639 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600640 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600641 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
642 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600643 template <typename Detector>
644 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
645 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600646 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
647 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset,
648 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600649 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700650 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600651 const VkOffset3D &offset, const VkExtent3D &extent) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700652 HazardResult DetectHazard(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulaufb027cdb2020-05-21 14:25:22 -0600653 const VkOffset3D &offset, const VkExtent3D &extent, VkImageAspectFlags aspect_mask = 0U) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700654 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700655 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700656 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
657 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700658 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700659 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700660 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700661 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700662 const SyncStageAccessFlags &src_stage_accesses,
663 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700664 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulauf7635de32020-05-29 17:14:15 -0600665 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const IMAGE_VIEW_STATE *attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600666
John Zulaufb02c1eb2020-10-06 16:33:36 -0600667 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
668 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const ResourceUsageTag &tag);
669
John Zulaufe5da6e52020-03-18 15:32:18 -0600670 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600671 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600672 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600673 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600674 async_.clear();
John Zulaufe5da6e52020-03-18 15:32:18 -0600675 src_external_ = TrackBack();
John Zulaufa0a98292020-09-18 09:30:10 -0600676 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700677 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600678 for (auto &map : access_state_maps_) {
679 map.clear();
680 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600681 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600682
683 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
684 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600685 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
686 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf43cc7462020-12-03 12:33:12 -0700687 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf355e49b2020-04-24 15:11:15 -0600688 const ResourceAccessState *infill_state) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700689 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600690 template <typename BarrierAction>
691 void ResolveAccessRange(const IMAGE_STATE &image_state, const VkImageSubresourceRange &subresource_range,
John Zulauf43cc7462020-12-03 12:33:12 -0700692 BarrierAction &barrier_action, AccessAddressType address_type, ResourceAccessRangeMap *descent_map,
John Zulaufb02c1eb2020-10-06 16:33:36 -0600693 const ResourceAccessState *infill_state) const;
694 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700695 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600696 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
697 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600698
John Zulauf8e3c3e92021-01-06 11:19:36 -0700699 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
700 const ResourceAccessRange &range, const ResourceUsageTag &tag);
701 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600702 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
703 const ResourceUsageTag &tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700704 void UpdateAccessState(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
705 const VkOffset3D &offset, const VkExtent3D &extent, VkImageAspectFlags aspect_mask,
706 const ResourceUsageTag &tag);
707 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600708 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
709 const ResourceUsageTag &tag);
John Zulauf7635de32020-05-29 17:14:15 -0600710 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
711 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass,
712 const ResourceUsageTag &tag);
John Zulaufaff20662020-06-01 14:07:58 -0600713 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
714 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass,
715 const ResourceUsageTag &tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600716
John Zulauf540266b2020-04-06 18:54:53 -0600717 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600718
John Zulauf540266b2020-04-06 18:54:53 -0600719 template <typename Action>
John Zulauf89311b42020-09-29 16:28:47 -0600720 void UpdateResourceAccess(const BUFFER_STATE &buffer, const ResourceAccessRange &range, const Action action);
John Zulauf540266b2020-04-06 18:54:53 -0600721 template <typename Action>
John Zulauf89311b42020-09-29 16:28:47 -0600722 void UpdateResourceAccess(const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range, const Action action);
John Zulauf540266b2020-04-06 18:54:53 -0600723
724 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700725 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700726 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600727
John Zulauf540266b2020-04-06 18:54:53 -0600728 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600729 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600730
731 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600732 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600733
John Zulauf43cc7462020-12-03 12:33:12 -0700734 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
735 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
736 return access_state_maps_[static_cast<size_t>(type)];
737 }
738 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
739 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
740 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
741 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600742 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
743 if (subpass == VK_SUBPASS_EXTERNAL) {
744 return &src_external_;
745 } else {
746 assert(subpass < prev_by_subpass_.size());
747 return prev_by_subpass_[subpass];
748 }
749 }
John Zulauf16adfc92020-04-08 10:28:33 -0600750
John Zulauf64ffe552021-02-06 10:25:07 -0700751 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulauffaea0ee2021-01-14 14:01:32 -0700752 const VkRect2D &render_area, uint32_t subpass,
753 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700754 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulauffaea0ee2021-01-14 14:01:32 -0700755 const VkRect2D &render_area, uint32_t subpass,
756 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700757 bool ValidateStoreOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulauffaea0ee2021-01-14 14:01:32 -0700758 const VkRect2D &render_area, uint32_t subpass,
759 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700760 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulauffaea0ee2021-01-14 14:01:32 -0700761 const VkRect2D &render_area, const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
762 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600763
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700764 void SetStartTag(const ResourceUsageTag &tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700765 template <typename Action>
766 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700767
John Zulauf3d84f1b2020-03-09 13:33:25 -0600768 private:
769 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700770 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600771 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600772 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700773 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600774 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700775 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700776 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
777 const ResourceAccessRange &range, const ResourceUsageTag &tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600778
779 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600780 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600781 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700782 std::vector<const AccessContext *> async_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600783 TrackBack src_external_;
784 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700785 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600786};
787
John Zulauf355e49b2020-04-24 15:11:15 -0600788class RenderPassAccessContext {
789 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700790 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
791 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
792 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600793
John Zulauf64ffe552021-02-06 10:25:07 -0700794 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
795 const char *func_name) const;
796 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, const ResourceUsageTag &tag);
797 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
798 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
799 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600800
801 void RecordLayoutTransitions(const ResourceUsageTag &tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700802 void RecordLoadOperations(const ResourceUsageTag &tag);
803 void RecordBeginRenderPass(const ResourceUsageTag &tag);
804 void RecordNextSubpass(const ResourceUsageTag &prev_subpass_tag, const ResourceUsageTag &next_subpass_tag);
805 void RecordEndRenderPass(AccessContext *external_context, const ResourceUsageTag &tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600806
John Zulauf540266b2020-04-06 18:54:53 -0600807 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
808 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600809 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
810 uint32_t GetCurrentSubpass() const { return current_subpass_; }
811 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700812 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -0600813
814 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600815 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700816 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600817 uint32_t current_subpass_;
818 std::vector<AccessContext> subpass_contexts_;
819 std::vector<const IMAGE_VIEW_STATE *> attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600820};
821
John Zulauf64ffe552021-02-06 10:25:07 -0700822// Command execution context is the base class for command buffer and queue contexts
823// Preventing unintented leakage of subclass specific state, storing enough information
824// for message logging.
825// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
826class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600827 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700828 CommandExecutionContext() : sync_state_(nullptr) {}
829 CommandExecutionContext(SyncValidator *sync_validator) : sync_state_(sync_validator) {}
830 virtual ~CommandExecutionContext() = default;
831 const SyncValidator &GetSyncState() const {
832 assert(sync_state_);
833 return *sync_state_;
834 }
835 SyncValidator &GetSyncState() {
836 assert(sync_state_);
837 return *sync_state_;
838 }
839 virtual std::string FormatUsage(const HazardResult &hazard) const = 0;
840
841 protected:
842 SyncValidator *sync_state_;
843};
844
845class CommandBufferAccessContext : public CommandExecutionContext {
846 public:
847 CommandBufferAccessContext(SyncValidator *sync_validator = nullptr)
848 : CommandExecutionContext(sync_validator),
849 access_index_(0),
John Zulauffaea0ee2021-01-14 14:01:32 -0700850 command_number_(0),
851 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600852 reset_count_(0),
853 render_pass_contexts_(),
854 cb_access_context_(),
855 current_context_(&cb_access_context_),
John Zulauf3d84f1b2020-03-09 13:33:25 -0600856 current_renderpass_context_(),
857 cb_state_(),
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700858 queue_flags_(),
John Zulauf669dfd52021-01-27 17:15:28 -0700859 events_context_(),
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700860 destroyed_(false) {}
John Zulauf355e49b2020-04-24 15:11:15 -0600861 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -0700862 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600863 cb_state_ = cb_state;
864 queue_flags_ = queue_flags;
865 }
John Zulauf64ffe552021-02-06 10:25:07 -0700866 ~CommandBufferAccessContext() override = default;
867 CommandExecutionContext &GetExecutionContext() { return *this; }
868 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -0700869
870 void Reset() {
John Zulauffaea0ee2021-01-14 14:01:32 -0700871 access_index_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -0600872 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -0700873 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -0600874 reset_count_++;
875 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600876 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600877 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600878 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -0700879 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -0700880 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700881 void MarkDestroyed() { destroyed_ = true; }
882 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -0700883
John Zulauf64ffe552021-02-06 10:25:07 -0700884 std::string FormatUsage(const HazardResult &hazard) const override;
John Zulauf540266b2020-04-06 18:54:53 -0600885 AccessContext *GetCurrentAccessContext() { return current_context_; }
John Zulauf669dfd52021-01-27 17:15:28 -0700886 SyncEventsContext *GetCurrentEventsContext() { return &events_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700887 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf540266b2020-04-06 18:54:53 -0600888 const AccessContext *GetCurrentAccessContext() const { return current_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700889 const SyncEventsContext *GetCurrentEventsContext() const { return &events_context_; }
890 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
891 void RecordBeginRenderPass(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
892 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const ResourceUsageTag &tag);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700893 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -0700894
locke-lunarg61870c22020-06-09 14:51:50 -0600895 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
896 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const ResourceUsageTag &tag);
897 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
898 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const ResourceUsageTag &tag);
899 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
900 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const ResourceUsageTag &tag);
901 bool ValidateDrawSubpassAttachment(const char *func_name) const;
902 void RecordDrawSubpassAttachment(const ResourceUsageTag &tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700903 void RecordNextSubpass(CMD_TYPE command);
904 void RecordEndRenderPass(CMD_TYPE command);
John Zulauf4a6105a2020-11-17 15:11:05 -0700905 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -0700906
John Zulauf3d84f1b2020-03-09 13:33:25 -0600907 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
908 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -0700909 inline ResourceUsageTag::TagIndex NextAccessIndex() { return access_index_++; }
910
911 inline ResourceUsageTag NextSubcommandTag(CMD_TYPE command) {
912 ResourceUsageTag next(NextAccessIndex(), command_number_, subcommand_number_++, command);
913 return next;
914 }
915
John Zulauf355e49b2020-04-24 15:11:15 -0600916 inline ResourceUsageTag NextCommandTag(CMD_TYPE command) {
John Zulauf355e49b2020-04-24 15:11:15 -0600917 command_number_++;
John Zulauffaea0ee2021-01-14 14:01:32 -0700918 subcommand_number_ = 0;
Jeremy Gebben6ea9d9e2020-12-11 09:41:01 -0700919 // The lowest bit is a sub-command number used to separate operations at the end of the previous renderpass
920 // from the start of the new one in VkCmdNextRenderpass().
John Zulauffaea0ee2021-01-14 14:01:32 -0700921 ResourceUsageTag next(NextAccessIndex(), command_number_, subcommand_number_, command);
John Zulauf355e49b2020-04-24 15:11:15 -0600922 return next;
923 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600924
John Zulauffaea0ee2021-01-14 14:01:32 -0700925 const CMD_BUFFER_STATE &GetCBState() const {
926 assert(cb_state_);
927 return *(cb_state_.get());
928 }
929 CMD_BUFFER_STATE &GetCBState() {
930 assert(cb_state_);
931 return *(cb_state_.get());
932 }
John Zulauffaea0ee2021-01-14 14:01:32 -0700933
John Zulauf3d84f1b2020-03-09 13:33:25 -0600934 private:
John Zulauffaea0ee2021-01-14 14:01:32 -0700935 ResourceUsageTag::TagIndex access_index_;
John Zulauf355e49b2020-04-24 15:11:15 -0600936 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700937 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -0600938 uint32_t reset_count_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600939 std::vector<RenderPassAccessContext> render_pass_contexts_;
John Zulauf355e49b2020-04-24 15:11:15 -0600940 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -0600941 AccessContext *current_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600942 RenderPassAccessContext *current_renderpass_context_;
943 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
John Zulauf355e49b2020-04-24 15:11:15 -0600944
John Zulauf3d84f1b2020-03-09 13:33:25 -0600945 VkQueueFlags queue_flags_;
John Zulauf669dfd52021-01-27 17:15:28 -0700946 SyncEventsContext events_context_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700947 bool destroyed_;
John Zulauf9cb530d2019-09-30 14:14:10 -0600948};
949
950class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
951 public:
952 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
953 using StateTracker = ValidationStateTracker;
954
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700955 std::unordered_map<VkCommandBuffer, CommandBufferAccessContextShared> cb_access_state;
956
957 CommandBufferAccessContextShared GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
John Zulauf9cb530d2019-09-30 14:14:10 -0600958 auto found_it = cb_access_state.find(command_buffer);
959 if (found_it == cb_access_state.end()) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700960 if (!do_insert) return CommandBufferAccessContextShared();
John Zulauf9cb530d2019-09-30 14:14:10 -0600961 // If we don't have one, make it.
John Zulauf3d84f1b2020-03-09 13:33:25 -0600962 auto cb_state = GetShared<CMD_BUFFER_STATE>(command_buffer);
963 assert(cb_state.get());
964 auto queue_flags = GetQueueFlags(*cb_state);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700965 std::shared_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
John Zulauf3d84f1b2020-03-09 13:33:25 -0600966 auto insert_pair = cb_access_state.insert(std::make_pair(command_buffer, std::move(context)));
John Zulauf9cb530d2019-09-30 14:14:10 -0600967 found_it = insert_pair.first;
968 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700969 return found_it->second;
John Zulauf9cb530d2019-09-30 14:14:10 -0600970 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700971
John Zulauf3d84f1b2020-03-09 13:33:25 -0600972 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700973 return GetAccessContextImpl(command_buffer, true).get(); // true -> do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -0600974 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600975 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700976 return GetAccessContextImpl(command_buffer, false).get(); // false -> don't do_insert on not found
977 }
978
979 CommandBufferAccessContextShared GetAccessContextShared(VkCommandBuffer command_buffer) {
980 return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
981 }
982 CommandBufferAccessContextShared GetAccessContextSharedNoInsert(VkCommandBuffer command_buffer) {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600983 return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -0600984 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600985
986 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
John Zulauf9cb530d2019-09-30 14:14:10 -0600987 const auto found_it = cb_access_state.find(command_buffer);
988 if (found_it == cb_access_state.end()) {
989 return nullptr;
990 }
991 return found_it->second.get();
992 }
993
John Zulaufd1f85d42020-04-15 12:23:15 -0600994 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
995 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600996 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
John Zulauf64ffe552021-02-06 10:25:07 -0700997 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd, const char *cmd_name = nullptr);
998 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
999 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command, const char *command_name = nullptr);
1000 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd,
1001 const char *cmd_name = nullptr);
John Zulauf33fc1d52020-07-17 11:01:10 -06001002 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001003
1004 void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001005 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001006
John Zulauf355e49b2020-04-24 15:11:15 -06001007 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
John Zulauf64ffe552021-02-06 10:25:07 -07001008 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd, const char *cmd_name = nullptr) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001009
1010 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001011 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001012
1013 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001014 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001015
1016 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001017 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001018
John Zulauf9cb530d2019-09-30 14:14:10 -06001019 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001020 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001021
1022 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001023 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001024
John Zulauf4a6105a2020-11-17 15:11:05 -07001025 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001026 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001027
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001028 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001029
John Zulauf5c5e88d2019-12-26 11:22:02 -07001030 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1031 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001032 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001033
1034 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001035 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001036
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001037 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001038
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001039 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001040
John Zulauf9cb530d2019-09-30 14:14:10 -06001041 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1042 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1043 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1044 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1045 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001046 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001047
1048 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1049 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1050 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1051 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001052 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001053
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001054 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1055 const VkDependencyInfoKHR *pDependencyInfo) const override;
1056 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
1057
John Zulauf3d84f1b2020-03-09 13:33:25 -06001058 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001059 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001060
1061 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001062 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001063 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001064 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001065 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001066 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001067
Mike Schuchardt2df08912020-12-15 16:28:09 -08001068 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
John Zulauf64ffe552021-02-06 10:25:07 -07001069 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd, const char *cmd_name = nullptr) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001070 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001071 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1072 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1073 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1074 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001075
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001076 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001077 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001078 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001079 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001080 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001081
John Zulauf64ffe552021-02-06 10:25:07 -07001082 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd,
1083 const char *cmd_name = nullptr) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001084 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001085 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1086 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001087
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001088 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1089 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1090 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001091
1092 template <typename BufferImageCopyRegionType>
1093 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1094 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1095 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001096 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1097 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001098 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001099 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001100 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001101
Jeff Leger178b1e52020-10-05 12:22:23 -04001102 template <typename BufferImageCopyRegionType>
1103 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1104 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1105 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001106 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001107 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001108 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001109 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001110
Jeff Leger178b1e52020-10-05 12:22:23 -04001111 template <typename BufferImageCopyRegionType>
1112 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1113 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1114 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001115 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001116 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001117 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001118 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001119
Jeff Leger178b1e52020-10-05 12:22:23 -04001120 template <typename BufferImageCopyRegionType>
1121 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1122 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1123 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001124 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001125 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001126 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001127 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001128
1129 template <typename RegionType>
1130 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1131 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1132 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001133
1134 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1135 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001136 const VkImageBlit *pRegions, VkFilter filter) const override;
1137 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001138
Jeff Leger178b1e52020-10-05 12:22:23 -04001139 template <typename RegionType>
1140 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1141 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1142 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001143 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1144 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001145 VkFilter filter) override;
1146 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001147
John Zulauffaea0ee2021-01-14 14:01:32 -07001148 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1149 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1150 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001151 const char *function) const;
1152 void RecordIndirectBuffer(AccessContext &context, const ResourceUsageTag &tag, const VkDeviceSize struct_size,
1153 const VkBuffer buffer, const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001154
John Zulauffaea0ee2021-01-14 14:01:32 -07001155 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1156 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
locke-lunarg61870c22020-06-09 14:51:50 -06001157 void RecordCountBuffer(AccessContext &context, const ResourceUsageTag &tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001158
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001159 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1160 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001161
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001162 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1163 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001164
1165 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001166 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001167 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001168 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001169
1170 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001171 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001172 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001173 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001174
1175 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001176 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001177 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001178 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001179
1180 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001181 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001182 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001183 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001184
locke-lunargff255f92020-05-13 18:53:52 -06001185 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1186 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1187 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001188 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1189 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001190 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001191 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1192 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001193 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001194 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1195 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001196 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001197 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1198 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001199 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001200 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1201 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001202 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001203 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1204 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001205 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001206
locke-lunargff255f92020-05-13 18:53:52 -06001207 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1208 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1209 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001210 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1211 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001212 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001213 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1214 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001215 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001216 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1217 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001218 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001219 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1220 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001221 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001222 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1223 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001224 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001225 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1226 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001227 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001228
1229 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1230 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001231 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001232 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1233 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001234 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001235
1236 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1237 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001238 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001239 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1240 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001241 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001242
1243 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1244 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001245 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001246 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1247 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001248 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001249
1250 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001251 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001252 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001253 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001254
1255 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1256 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001257 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001258
locke-lunarge1a67022020-04-29 00:15:36 -06001259 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1260 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001261 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001262
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001263 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
1264 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001265
locke-lunarge1a67022020-04-29 00:15:36 -06001266 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001267 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001268 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001269 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001270
1271 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001272 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001273 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001274 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001275
1276 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1277 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1278
1279 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1280 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1281
1282 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1283 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1284 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1285 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1286 uint32_t imageMemoryBarrierCount,
1287 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1288 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1289 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1290 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1291 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1292 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001293 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1294 VkDeviceSize dstOffset, uint32_t marker) const override;
1295 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1296 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001297};