blob: 17bd9f18dbdb073c4c7181d09695b98af21f7727 [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
John Zulaufab7756b2020-12-29 16:10:16 -07002 * Copyright (c) 2019-2021 Valve Corporation
3 * Copyright (c) 2019-2021 LunarG, Inc.
John Zulauf9cb530d2019-09-30 14:14:10 -06004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: John Zulauf <jzulauf@lunarg.com>
John Zulaufab7756b2020-12-29 16:10:16 -070018 * Author: Locke Lin <locke@lunarg.com>
19 * Author: Jeremy Gebben <jeremyg@lunarg.com>
John Zulauf9cb530d2019-09-30 14:14:10 -060020 */
21
22#pragma once
23
John Zulauf7635de32020-05-29 17:14:15 -060024#include <limits>
John Zulauf9cb530d2019-09-30 14:14:10 -060025#include <memory>
John Zulauf9cb530d2019-09-30 14:14:10 -060026#include <vulkan/vulkan.h>
27
28#include "synchronization_validation_types.h"
29#include "state_tracker.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060030#include "cmd_buffer_state.h"
31#include "render_pass_state.h"
John Zulauf9cb530d2019-09-30 14:14:10 -060032
John Zulaufd5115702021-01-18 12:34:33 -070033class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070034class CommandBufferAccessContext;
John Zulaufe7f6a5e2021-01-16 14:31:18 -070035using CommandBufferAccessContextShared = std::shared_ptr<CommandBufferAccessContext>;
John Zulauf64ffe552021-02-06 10:25:07 -070036class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070037class ResourceAccessState;
38class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060039
John Zulaufd0ec59f2021-03-13 14:25:08 -070040using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
41using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
42
John Zulauf2f952d22020-02-10 11:34:51 -070043enum SyncHazard {
44 NONE = 0,
45 READ_AFTER_WRITE,
46 WRITE_AFTER_READ,
47 WRITE_AFTER_WRITE,
48 READ_RACING_WRITE,
49 WRITE_RACING_WRITE,
50 WRITE_RACING_READ,
51};
John Zulauf9cb530d2019-09-30 14:14:10 -060052
John Zulauf8e3c3e92021-01-06 11:19:36 -070053enum class SyncOrdering : uint8_t {
54 kNonAttachment = 0,
55 kColorAttachment = 1,
56 kDepthStencilAttachment = 2,
57 kRaster = 3,
58 kNumOrderings = 4,
59};
60
John Zulauf9cb530d2019-09-30 14:14:10 -060061// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
62struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070063 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060064 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
65 }
John Zulauf1507ee42020-05-18 11:33:09 -060066 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
67 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
68 }
John Zulauf9cb530d2019-09-30 14:14:10 -060069
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070070 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060071 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
72
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070073 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
74 return (stage_access_bit & syncStageAccessWriteMask).any();
75 }
76 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
77 return (stage_access_mask & syncStageAccessWriteMask).any();
78 }
John Zulauf9cb530d2019-09-30 14:14:10 -060079 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070080 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060081 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
82 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070083 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
84 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
85 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
86 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060087 return stage_scope & AccessScopeByAccess(accesses);
88 }
89};
90
John Zulauffaea0ee2021-01-14 14:01:32 -070091// The resource tag is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -060092struct ResourceUsageRecord {
93 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070094 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070095 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070096 constexpr static uint32_t kMaxCount = std::numeric_limits<Count>::max();
Jeremy Gebben4bb73502020-12-14 11:17:50 -070097
John Zulauffaea0ee2021-01-14 14:01:32 -070098 TagIndex index = 0U; // the index of the command within the command buffer itself (primary or secondary)
99 CMD_TYPE command = CMD_NONE;
100 Count seq_num = 0U;
101 Count sub_command = 0U;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700102
John Zulauf14940722021-04-12 15:19:02 -0600103 ResourceUsageRecord() = default;
104 ResourceUsageRecord(TagIndex index_, Count seq_num_, Count sub_command_, CMD_TYPE command_)
John Zulauffaea0ee2021-01-14 14:01:32 -0700105 : index(index_), command(command_), seq_num(seq_num_), sub_command(sub_command_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600106};
107
John Zulauf14940722021-04-12 15:19:02 -0600108using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600109using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600110
John Zulauf9cb530d2019-09-30 14:14:10 -0600111struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600112 std::unique_ptr<const ResourceAccessState> access_state;
113 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600114 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600115 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600116 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600117 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600118 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf9cb530d2019-09-30 14:14:10 -0600119};
120
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700121struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700122 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
123 VkPipelineStageFlags2KHR
124 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
125 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 -0700126 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
127
128 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
129
Jeremy Gebben40a22942020-12-22 14:22:06 -0700130 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
131 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700132};
133
John Zulauf3d84f1b2020-03-09 13:33:25 -0600134struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700135 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600136 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700137 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600138 SyncStageAccessFlags dst_access_scope;
139 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700140 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600141 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700142
143 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
144
145 template <typename Barrier>
146 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
147
148 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700149 // template constructor for sync2 barriers
150 template <typename Barrier>
151 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700152
John Zulaufa0a98292020-09-18 09:30:10 -0600153 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700154 // Note that after merge, only the exec_scope and access_scope fields are fully valid
155 // TODO: Do we need to update any of the other fields? Merging has limited application.
156 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600157 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700158 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600159 dst_access_scope |= other.dst_access_scope;
160 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600161};
John Zulauf69133422020-05-20 14:55:53 -0600162
John Zulauf43cc7462020-12-03 12:33:12 -0700163enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
164
John Zulauf4a6105a2020-11-17 15:11:05 -0700165struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700166 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700167 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700168 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
169 EventPointer event;
170 CMD_TYPE last_command; // Only Event commands are valid here.
171 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700172 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700173 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700174 ResourceUsageTag first_scope_tag;
John Zulaufd5115702021-01-18 12:34:33 -0700175 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700176 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700177 template <typename EventPointerType>
178 SyncEventState(EventPointerType &&event_state)
179 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700180 last_command(CMD_NONE),
181 unsynchronized_set(CMD_NONE),
182 barriers(0U),
183 scope(),
184 first_scope_tag(),
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600185 destroyed((event_state.get() == nullptr) || event_state->Destroyed()) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700186 SyncEventState() : SyncEventState(EventPointer()) {}
187 void ResetFirstScope();
188 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700189 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700190 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700191};
John Zulaufd5115702021-01-18 12:34:33 -0700192using SyncEventStateShared = std::shared_ptr<SyncEventState>;
193using SyncEventStateConstShared = std::shared_ptr<const SyncEventState>;
John Zulauf669dfd52021-01-27 17:15:28 -0700194class SyncEventsContext {
195 public:
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700196 using Map = layer_data::unordered_map<const EVENT_STATE *, SyncEventStateShared>;
John Zulauf669dfd52021-01-27 17:15:28 -0700197 using iterator = Map::iterator;
198 using const_iterator = Map::const_iterator;
199
200 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
201 const auto find_it = map_.find(event_state.get());
202 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700203 if (!event_state.get()) return nullptr;
204
John Zulauf669dfd52021-01-27 17:15:28 -0700205 const auto *event_plain_ptr = event_state.get();
206 auto sync_state = SyncEventStateShared(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700207 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700208 return insert_pair.first->second.get();
209 }
210 return find_it->second.get();
211 }
212
213 const SyncEventState *Get(const EVENT_STATE *event_state) const {
214 const auto find_it = map_.find(event_state);
215 if (find_it == map_.end()) {
216 return nullptr;
217 }
218 return find_it->second.get();
219 }
John Zulauf6ce24372021-01-30 05:56:25 -0700220 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700221
John Zulauf8eda1562021-04-13 17:06:41 -0600222 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst);
223
John Zulauf669dfd52021-01-27 17:15:28 -0700224 // stl style naming for range-for support
225 inline iterator begin() { return map_.begin(); }
226 inline const_iterator begin() const { return map_.begin(); }
227 inline iterator end() { return map_.end(); }
228 inline const_iterator end() const { return map_.end(); }
229
230 void Destroy(const EVENT_STATE *event_state) {
231 auto sync_it = map_.find(event_state);
232 if (sync_it != map_.end()) {
233 sync_it->second->destroyed = true;
234 map_.erase(sync_it);
235 }
236 }
237 void Clear() { map_.clear(); }
238
239 private:
240 Map map_;
241};
John Zulauf4a6105a2020-11-17 15:11:05 -0700242
John Zulauf69133422020-05-20 14:55:53 -0600243// To represent ordering guarantees such as rasterization and store
John Zulauf3d84f1b2020-03-09 13:33:25 -0600244
John Zulauf9cb530d2019-09-30 14:14:10 -0600245class ResourceAccessState : public SyncStageAccess {
246 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700247 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700248 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700249 SyncStageAccessFlags access_scope;
250 OrderingBarrier() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700251 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700252 OrderingBarrier &operator=(const OrderingBarrier &) = default;
253 };
254 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
255
John Zulauffaea0ee2021-01-14 14:01:32 -0700256 struct FirstAccess {
257 ResourceUsageTag tag;
258 SyncStageAccessIndex usage_index;
259 SyncOrdering ordering_rule;
John Zulauf14940722021-04-12 15:19:02 -0600260 FirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
John Zulauffaea0ee2021-01-14 14:01:32 -0700261 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
262 FirstAccess(const FirstAccess &other) = default;
263 FirstAccess(FirstAccess &&other) = default;
264 FirstAccess &operator=(const FirstAccess &rhs) = default;
265 FirstAccess &operator=(FirstAccess &&rhs) = default;
266
267 bool operator==(const FirstAccess &rhs) const {
268 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
269 }
270 };
271 using FirstAccesses = small_vector<FirstAccess, 3>;
272
John Zulauf9cb530d2019-09-30 14:14:10 -0600273 // Mutliple read operations can be simlutaneously (and independently) synchronized,
274 // given the only the second execution scope creates a dependency chain, we have to track each,
275 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
276 // and applicable one for hazard detection
277 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700278 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600279 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600280 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700281 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600282 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700283 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
284 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600285 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700286 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600287 ResourceUsageTag tag_)
John Zulaufab7756b2020-12-29 16:10:16 -0700288 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600289 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600290 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600291 return same;
292 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700293 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700294 // If the read stage is not in the src sync scope
295 // *AND* not execution chained with an existing sync barrier (that's the or)
296 // then the barrier access is unsafe (R/W after R)
297 return (src_exec_scope & (stage | barriers)) == 0;
298 }
299
John Zulaufe5da6e52020-03-18 15:32:18 -0600300 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700301 inline void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600302 ResourceUsageTag tag_) {
John Zulauf4285ee92020-09-23 10:20:52 -0600303 stage = stage_;
304 access = access_;
305 barriers = barriers_;
306 tag = tag_;
John Zulauf89311b42020-09-29 16:28:47 -0600307 pending_dep_chain = 0; // If this is a new read, we aren't applying a barrier set.
John Zulauf4285ee92020-09-23 10:20:52 -0600308 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600309 };
310
311 public:
312 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700313 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const SyncOrdering &ordering_rule) const;
John Zulaufae842002021-04-15 18:20:55 -0600314 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
315
316 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
317 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
318 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600319
Jeremy Gebben40a22942020-12-22 14:22:06 -0700320 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700321 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700322 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600323 const SyncStageAccessFlags &source_access_scope, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600324
John Zulauf14940722021-04-12 15:19:02 -0600325 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
326 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600327 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600328 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600329 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, ResourceUsageTag tag);
John Zulauf89311b42020-09-29 16:28:47 -0600330 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600331 void ApplyBarrier(ResourceUsageTag scope_tag, const SyncBarrier &barrier, bool layout_transition);
332 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufae842002021-04-15 18:20:55 -0600333 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600334
335 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600336 : write_barriers(~SyncStageAccessFlags(0)),
337 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600338 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600339 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600340 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600341 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600342 read_execution_barriers(0),
343 pending_write_dep_chain(0),
344 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700345 pending_write_barriers(0),
346 first_accesses_(),
347 first_read_stages_(0U) {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600348
John Zulaufb02c1eb2020-10-06 16:33:36 -0600349 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700350 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600351 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600352 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600353 bool operator==(const ResourceAccessState &rhs) const {
354 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700355 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
356 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700357 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600358 return same;
359 }
360 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700361 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600362 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700363 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700364 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
365 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600366
John Zulauf9cb530d2019-09-30 14:14:10 -0600367 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700368 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700369 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700370 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
371 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600372 // If the previous write is *not* a layout transition
373 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700374 // *AND* the current barrier is not in the dependency chain
375 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
376 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600377 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
378 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700379 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700380 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700381 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
382 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700383 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700384 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600385 }
John Zulaufd14743a2020-07-03 09:42:39 -0600386
Jeremy Gebben40a22942020-12-22 14:22:06 -0700387 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600388 return stage_mask != (stage_mask & barriers);
389 }
390
Jeremy Gebben40a22942020-12-22 14:22:06 -0700391 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600392 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700393 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700394 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700395
John Zulauf14940722021-04-12 15:19:02 -0600396 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauffaea0ee2021-01-14 14:01:32 -0700397
John Zulauf8e3c3e92021-01-06 11:19:36 -0700398 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
399 return kOrderingRules[static_cast<size_t>(ordering_enum)];
400 }
John Zulaufd14743a2020-07-03 09:42:39 -0600401
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700402 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600403
John Zulauf9cb530d2019-09-30 14:14:10 -0600404 // With reads, each must be "safe" relative to it's prior write, so we need only
405 // save the most recent write operation (as anything *transitively* unsafe would arleady
406 // be included
407 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700408 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600409 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600410 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600411
John Zulauff51fbb62020-10-02 14:43:24 -0600412 // TODO Input Attachment cleanup for multiple reads in a given stage
413 // Tracks whether the fragment shader read is input attachment read
414 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600415
Jeremy Gebben40a22942020-12-22 14:22:06 -0700416 VkPipelineStageFlags2KHR last_read_stages;
417 VkPipelineStageFlags2KHR read_execution_barriers;
Artem Bolgar09b01542021-06-01 23:49:14 -0700418 small_vector<ReadState, 3, uint32_t> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600419
420 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700421 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600422 bool pending_layout_transition;
423 SyncStageAccessFlags pending_write_barriers;
John Zulauffaea0ee2021-01-14 14:01:32 -0700424 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700425 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700426
427 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600428};
John Zulauf22aefed2021-03-11 18:14:35 -0700429using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
430using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600431
John Zulauf16adfc92020-04-08 10:28:33 -0600432using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700433using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700434using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600435using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600436
John Zulaufd0ec59f2021-03-13 14:25:08 -0700437class AttachmentViewGen {
438 public:
439 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
440 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
441 AttachmentViewGen(const AttachmentViewGen &other) = default;
442 AttachmentViewGen(AttachmentViewGen &&other) = default;
443 AccessAddressType GetAddressType() const;
444 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
445 const ImageRangeGen *GetRangeGen(Gen type) const;
446 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
447 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
448
449 private:
450 using RangeGenStore = layer_data::optional<ImageRangeGen>;
451 const IMAGE_VIEW_STATE *view_ = nullptr;
452 VkImageAspectFlags view_mask_ = 0U;
453 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
454};
455
456using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
457
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700458using SyncMemoryBarrier = SyncBarrier;
459struct SyncBufferMemoryBarrier {
460 using Buffer = std::shared_ptr<const BUFFER_STATE>;
461 Buffer buffer;
462 SyncBarrier barrier;
463 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700464 bool IsLayoutTransition() const { return false; }
465 const ResourceAccessRange &Range() const { return range; };
466 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700467 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
468 : buffer(buffer_), barrier(barrier_), range(range_) {}
469 SyncBufferMemoryBarrier() = default;
470};
471
472struct SyncImageMemoryBarrier {
473 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600474
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700475 Image image;
476 uint32_t index;
477 SyncBarrier barrier;
478 VkImageLayout old_layout;
479 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600480 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700481
482 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600483 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700484 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700485 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
486 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
487 : image(image_),
488 index(index_),
489 barrier(barrier_),
490 old_layout(old_layout_),
491 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600492 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700493 SyncImageMemoryBarrier() = default;
494};
495
496class SyncOpBase {
497 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700498 SyncOpBase() : cmd_(CMD_NONE) {}
499 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600500 virtual ~SyncOpBase() = default;
501
sfricke-samsung85584a72021-09-30 21:43:38 -0700502 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700503 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600504 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
505 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
506 CommandBufferAccessContext *active_context) const = 0;
507 virtual void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
508 CommandBufferAccessContext *active_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700509
510 protected:
511 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700512};
513
John Zulaufd5115702021-01-18 12:34:33 -0700514class SyncOpBarriers : public SyncOpBase {
515 protected:
516 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600517 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700518 AccessContext *context);
519 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600520 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700521 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700522
John Zulauf36ef9282021-02-02 11:47:24 -0700523 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700524 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
525 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
526 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
527 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700528 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
529 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700530
John Zulauf8eda1562021-04-13 17:06:41 -0600531 ~SyncOpBarriers() override = default;
532
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700533 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700534 struct BarrierSet {
535 VkDependencyFlags dependency_flags;
536 SyncExecScope src_exec_scope;
537 SyncExecScope dst_exec_scope;
538 std::vector<SyncMemoryBarrier> memory_barriers;
539 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
540 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
541 bool single_exec_scope;
542 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
543 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
544 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
545 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
546 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
547 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
548 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
549 const VkImageMemoryBarrier *pImageMemoryBarriers);
550 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
551 const VkMemoryBarrier2KHR *barriers);
552 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
553 uint32_t barrier_count, const VkBufferMemoryBarrier2KHR *barriers);
554 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
555 uint32_t barrier_count, const VkImageMemoryBarrier2KHR *barriers);
556 };
557 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700558};
559
John Zulaufd5115702021-01-18 12:34:33 -0700560class SyncOpPipelineBarrier : public SyncOpBarriers {
561 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700562 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
563 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
564 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700565 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
566 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700567 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
568 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600569 ~SyncOpPipelineBarrier() override = default;
570
John Zulaufd5115702021-01-18 12:34:33 -0700571 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600572 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
573 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
574 CommandBufferAccessContext *active_context) const override;
575 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
576 CommandBufferAccessContext *active_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700577};
578
579class SyncOpWaitEvents : public SyncOpBarriers {
580 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700581 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
582 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
583 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700584 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
585 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700586
587 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
588 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600589 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700590
John Zulaufd5115702021-01-18 12:34:33 -0700591 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600592 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
593 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
594 CommandBufferAccessContext *active_context) const override;
595 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
596 CommandBufferAccessContext *active_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700597
598 protected:
599 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
600 // 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 -0700601 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
602 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700603};
604
John Zulauf6ce24372021-01-30 05:56:25 -0700605class SyncOpResetEvent : public SyncOpBase {
606 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700607 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700608 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600609 ~SyncOpResetEvent() override = default;
610
John Zulauf6ce24372021-01-30 05:56:25 -0700611 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600612 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
613 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
614 CommandBufferAccessContext *active_context) const override;
615 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
616 CommandBufferAccessContext *active_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700617
618 private:
619 std::shared_ptr<const EVENT_STATE> event_;
620 SyncExecScope exec_scope_;
621};
622
623class SyncOpSetEvent : public SyncOpBase {
624 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700625 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700626 VkPipelineStageFlags2KHR stageMask);
627 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
628 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600629 ~SyncOpSetEvent() override = default;
630
John Zulauf6ce24372021-01-30 05:56:25 -0700631 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600632 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
633 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
634 CommandBufferAccessContext *active_context) const override;
635 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
636 CommandBufferAccessContext *active_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700637
638 private:
639 std::shared_ptr<const EVENT_STATE> event_;
640 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700641 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
642 std::shared_ptr<safe_VkDependencyInfoKHR> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700643};
John Zulauf64ffe552021-02-06 10:25:07 -0700644
645class SyncOpBeginRenderPass : public SyncOpBase {
646 public:
647 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700648 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600649 ~SyncOpBeginRenderPass() override = default;
650
John Zulauf64ffe552021-02-06 10:25:07 -0700651 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600652 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
653 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
654 CommandBufferAccessContext *active_context) const override;
655 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
656 CommandBufferAccessContext *active_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700657
658 protected:
659 safe_VkRenderPassBeginInfo renderpass_begin_info_;
660 safe_VkSubpassBeginInfo subpass_begin_info_;
661 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
662 std::vector<const IMAGE_VIEW_STATE *> attachments_;
663 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
664};
665
666class SyncOpNextSubpass : public SyncOpBase {
667 public:
668 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700669 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600670 ~SyncOpNextSubpass() override = default;
671
John Zulauf64ffe552021-02-06 10:25:07 -0700672 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600673 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
674 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
675 CommandBufferAccessContext *active_context) const override;
676 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
677 CommandBufferAccessContext *active_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700678
679 protected:
680 safe_VkSubpassBeginInfo subpass_begin_info_;
681 safe_VkSubpassEndInfo subpass_end_info_;
682};
683
684class SyncOpEndRenderPass : public SyncOpBase {
685 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700686 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600687 ~SyncOpEndRenderPass() override = default;
688
John Zulauf64ffe552021-02-06 10:25:07 -0700689 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600690 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
691 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
692 CommandBufferAccessContext *active_context) const override;
693 void ReplayRecord(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
694 CommandBufferAccessContext *active_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700695
696 protected:
697 safe_VkSubpassEndInfo subpass_end_info_;
698};
699
John Zulauf540266b2020-04-06 18:54:53 -0600700class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700701 public:
John Zulauf69133422020-05-20 14:55:53 -0600702 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600703 kDetectPrevious = 1U << 0,
704 kDetectAsync = 1U << 1,
705 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600706 };
John Zulauf43cc7462020-12-03 12:33:12 -0700707 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600708
John Zulauf3d84f1b2020-03-09 13:33:25 -0600709 struct TrackBack {
John Zulaufa0a98292020-09-18 09:30:10 -0600710 std::vector<SyncBarrier> barriers;
John Zulauf1a224292020-06-30 14:52:13 -0600711 const AccessContext *context;
John Zulaufbaea94f2020-09-15 17:55:16 -0600712 TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_,
John Zulaufa0a98292020-09-18 09:30:10 -0600713 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
714 : barriers(), context(context_) {
715 barriers.reserve(subpass_dependencies_.size());
716 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
717 assert(dependency);
718 barriers.emplace_back(queue_flags_, *dependency);
719 }
720 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600721 TrackBack &operator=(const TrackBack &) = default;
722 TrackBack() = default;
723 };
John Zulauf5c5e88d2019-12-26 11:22:02 -0700724
John Zulauf355e49b2020-04-24 15:11:15 -0600725 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600726 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600727 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
728 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600729 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700730 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
731 DetectOptions options) const;
732 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600733 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
734 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600735 template <typename Detector>
736 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
737 DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600738 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf110413c2021-03-20 05:38:38 -0600739 const VkImageSubresourceRange &subresource_range) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700740 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
741 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
742
John Zulauf69133422020-05-20 14:55:53 -0600743 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700744 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600745 const VkOffset3D &offset, const VkExtent3D &extent) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700746 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700747 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700748 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
749 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700750 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
751 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700752 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700753 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700754 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700755 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700756 const SyncStageAccessFlags &src_stage_accesses,
757 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700758 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700759 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600760
John Zulaufb02c1eb2020-10-06 16:33:36 -0600761 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600762 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600763
John Zulaufae842002021-04-15 18:20:55 -0600764 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context) const;
765
John Zulaufe5da6e52020-03-18 15:32:18 -0600766 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600767 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600768 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600769 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600770 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700771 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600772 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700773 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600774 for (auto &map : access_state_maps_) {
775 map.clear();
776 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600777 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600778
779 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
780 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600781 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
782 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700783 template <typename BarrierAction>
784 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
785 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700786 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700787 const ResourceAccessState *infill_state,
788 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700789 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600790 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700791 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
792 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600793 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700794 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600795 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
796 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600797
John Zulauf8e3c3e92021-01-06 11:19:36 -0700798 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600799 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700800 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600801 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
802 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600803 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600804 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700805 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600806 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700807 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600808 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600809 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700810 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600811 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700812 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600813 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600814
John Zulauf540266b2020-04-06 18:54:53 -0600815 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600816
John Zulaufd0ec59f2021-03-13 14:25:08 -0700817 template <typename Action, typename RangeGen>
818 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600819 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700820 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600821 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700822 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700823 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600824
John Zulauf540266b2020-04-06 18:54:53 -0600825 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600826 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600827
828 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600829 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600830
John Zulauf43cc7462020-12-03 12:33:12 -0700831 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
832 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
833 return access_state_maps_[static_cast<size_t>(type)];
834 }
835 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
836 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
837 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
838 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600839 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
840 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700841 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600842 } else {
843 assert(subpass < prev_by_subpass_.size());
844 return prev_by_subpass_[subpass];
845 }
846 }
John Zulauf16adfc92020-04-08 10:28:33 -0600847
John Zulauf64ffe552021-02-06 10:25:07 -0700848 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700849 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
850 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700851 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700852 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
853 const char *func_name) const;
854 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
855
856 const RENDER_PASS_STATE &rp_state,
857
858 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
859 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700860 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700861 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700862 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600863
John Zulauf14940722021-04-12 15:19:02 -0600864 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700865 template <typename Action>
866 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700867
John Zulauf3d84f1b2020-03-09 13:33:25 -0600868 private:
869 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700870 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600871 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600872 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700873 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600874 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700875 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700876 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600877 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600878
879 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600880 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600881 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700882 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700883 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600884 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700885 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600886};
887
John Zulauf355e49b2020-04-24 15:11:15 -0600888class RenderPassAccessContext {
889 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700890 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
891 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700892 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
893 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
894 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600895
John Zulauf64ffe552021-02-06 10:25:07 -0700896 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
897 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -0600898 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700899 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
900 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
901 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600902
John Zulauf14940722021-04-12 15:19:02 -0600903 void RecordLayoutTransitions(ResourceUsageTag tag);
904 void RecordLoadOperations(ResourceUsageTag tag);
905 void RecordBeginRenderPass(ResourceUsageTag tag);
906 void RecordNextSubpass(ResourceUsageTag prev_subpass_tag, ResourceUsageTag next_subpass_tag);
907 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600908
John Zulauf540266b2020-04-06 18:54:53 -0600909 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
910 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600911 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
912 uint32_t GetCurrentSubpass() const { return current_subpass_; }
913 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700914 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -0600915
916 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600917 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700918 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600919 uint32_t current_subpass_;
920 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700921 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600922};
923
John Zulauf64ffe552021-02-06 10:25:07 -0700924// Command execution context is the base class for command buffer and queue contexts
925// Preventing unintented leakage of subclass specific state, storing enough information
926// for message logging.
927// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
928class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600929 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700930 CommandExecutionContext() : sync_state_(nullptr) {}
931 CommandExecutionContext(SyncValidator *sync_validator) : sync_state_(sync_validator) {}
932 virtual ~CommandExecutionContext() = default;
933 const SyncValidator &GetSyncState() const {
934 assert(sync_state_);
935 return *sync_state_;
936 }
937 SyncValidator &GetSyncState() {
938 assert(sync_state_);
939 return *sync_state_;
940 }
941 virtual std::string FormatUsage(const HazardResult &hazard) const = 0;
942
943 protected:
944 SyncValidator *sync_state_;
945};
946
947class CommandBufferAccessContext : public CommandExecutionContext {
948 public:
John Zulauf8eda1562021-04-13 17:06:41 -0600949 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
950 struct SyncOpEntry {
951 ResourceUsageTag tag;
952 SyncOpPointer sync_op;
953 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
954 SyncOpEntry() = default;
955 SyncOpEntry(const SyncOpEntry &other) = default;
956 };
957
John Zulauf64ffe552021-02-06 10:25:07 -0700958 CommandBufferAccessContext(SyncValidator *sync_validator = nullptr)
959 : CommandExecutionContext(sync_validator),
John Zulauf14940722021-04-12 15:19:02 -0600960 access_log_(),
John Zulauf8eda1562021-04-13 17:06:41 -0600961 sync_ops_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700962 command_number_(0),
963 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600964 reset_count_(0),
965 render_pass_contexts_(),
966 cb_access_context_(),
967 current_context_(&cb_access_context_),
John Zulauf3d84f1b2020-03-09 13:33:25 -0600968 current_renderpass_context_(),
969 cb_state_(),
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700970 queue_flags_(),
John Zulauf669dfd52021-01-27 17:15:28 -0700971 events_context_(),
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700972 destroyed_(false) {}
John Zulauf355e49b2020-04-24 15:11:15 -0600973 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -0700974 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600975 cb_state_ = cb_state;
976 queue_flags_ = queue_flags;
977 }
John Zulauf64ffe552021-02-06 10:25:07 -0700978 ~CommandBufferAccessContext() override = default;
979 CommandExecutionContext &GetExecutionContext() { return *this; }
980 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -0700981
982 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -0600983 access_log_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -0600984 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600985 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -0700986 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -0600987 reset_count_++;
988 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600989 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600990 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600991 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -0700992 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -0700993 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700994 void MarkDestroyed() { destroyed_ = true; }
995 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -0700996
John Zulauf64ffe552021-02-06 10:25:07 -0700997 std::string FormatUsage(const HazardResult &hazard) const override;
John Zulauf540266b2020-04-06 18:54:53 -0600998 AccessContext *GetCurrentAccessContext() { return current_context_; }
John Zulauf669dfd52021-01-27 17:15:28 -0700999 SyncEventsContext *GetCurrentEventsContext() { return &events_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001000 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf540266b2020-04-06 18:54:53 -06001001 const AccessContext *GetCurrentAccessContext() const { return current_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001002 const SyncEventsContext *GetCurrentEventsContext() const { return &events_context_; }
1003 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
1004 void RecordBeginRenderPass(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
John Zulauf14940722021-04-12 15:19:02 -06001005 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, ResourceUsageTag tag);
Jeremy Gebben9893daf2021-01-04 10:40:50 -07001006 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -07001007
locke-lunarg61870c22020-06-09 14:51:50 -06001008 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001009 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001010 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001011 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001012 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001013 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001014 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001015 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf8eda1562021-04-13 17:06:41 -06001016 void RecordNextSubpass(ResourceUsageTag prev_tag, ResourceUsageTag next_tag);
1017 void RecordEndRenderPass(ResourceUsageTag tag);
John Zulauf4a6105a2020-11-17 15:11:05 -07001018 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001019
John Zulaufae842002021-04-15 18:20:55 -06001020 bool ValidateFirstUse(const CommandBufferAccessContext &active_context, AccessContext *access_context,
1021 SyncEventsContext *events_context, const char *func_name, uint32_t index) const;
1022
John Zulauf3d84f1b2020-03-09 13:33:25 -06001023 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1024 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001025
1026 inline ResourceUsageTag NextSubcommandTag(CMD_TYPE command) {
John Zulauf14940722021-04-12 15:19:02 -06001027 ResourceUsageTag next = access_log_.size();
1028 access_log_.emplace_back(next, command_number_, ++subcommand_number_, command);
John Zulauffaea0ee2021-01-14 14:01:32 -07001029 return next;
1030 }
1031
John Zulauf355e49b2020-04-24 15:11:15 -06001032 inline ResourceUsageTag NextCommandTag(CMD_TYPE command) {
John Zulauf355e49b2020-04-24 15:11:15 -06001033 command_number_++;
John Zulauffaea0ee2021-01-14 14:01:32 -07001034 subcommand_number_ = 0;
John Zulauf14940722021-04-12 15:19:02 -06001035 ResourceUsageTag next = access_log_.size();
Jeremy Gebben6ea9d9e2020-12-11 09:41:01 -07001036 // The lowest bit is a sub-command number used to separate operations at the end of the previous renderpass
1037 // from the start of the new one in VkCmdNextRenderpass().
John Zulauf14940722021-04-12 15:19:02 -06001038 access_log_.emplace_back(next, command_number_, subcommand_number_, command);
John Zulauf355e49b2020-04-24 15:11:15 -06001039 return next;
1040 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001041
John Zulauffaea0ee2021-01-14 14:01:32 -07001042 const CMD_BUFFER_STATE &GetCBState() const {
1043 assert(cb_state_);
1044 return *(cb_state_.get());
1045 }
1046 CMD_BUFFER_STATE &GetCBState() {
1047 assert(cb_state_);
1048 return *(cb_state_.get());
1049 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001050
John Zulauf8eda1562021-04-13 17:06:41 -06001051 void AddSyncOp(ResourceUsageTag tag, SyncOpPointer &&sync_op) { sync_ops_.emplace_back(tag, std::move(sync_op)); }
1052
John Zulauf3d84f1b2020-03-09 13:33:25 -06001053 private:
John Zulauf14940722021-04-12 15:19:02 -06001054 std::vector<ResourceUsageRecord> access_log_;
John Zulauf8eda1562021-04-13 17:06:41 -06001055 std::vector<SyncOpEntry> sync_ops_;
John Zulauf355e49b2020-04-24 15:11:15 -06001056 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001057 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001058 uint32_t reset_count_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001059 std::vector<RenderPassAccessContext> render_pass_contexts_;
John Zulauf355e49b2020-04-24 15:11:15 -06001060 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001061 AccessContext *current_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001062 RenderPassAccessContext *current_renderpass_context_;
1063 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
John Zulauf355e49b2020-04-24 15:11:15 -06001064
John Zulauf3d84f1b2020-03-09 13:33:25 -06001065 VkQueueFlags queue_flags_;
John Zulauf669dfd52021-01-27 17:15:28 -07001066 SyncEventsContext events_context_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001067 bool destroyed_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001068};
1069
1070class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1071 public:
1072 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
1073 using StateTracker = ValidationStateTracker;
1074
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001075 layer_data::unordered_map<VkCommandBuffer, CommandBufferAccessContextShared> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001076
1077 CommandBufferAccessContextShared GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
John Zulauf9cb530d2019-09-30 14:14:10 -06001078 auto found_it = cb_access_state.find(command_buffer);
1079 if (found_it == cb_access_state.end()) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001080 if (!do_insert) return CommandBufferAccessContextShared();
John Zulauf9cb530d2019-09-30 14:14:10 -06001081 // If we don't have one, make it.
John Zulauf3d84f1b2020-03-09 13:33:25 -06001082 auto cb_state = GetShared<CMD_BUFFER_STATE>(command_buffer);
1083 assert(cb_state.get());
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06001084 auto queue_flags = cb_state->GetQueueFlags();
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001085 std::shared_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001086 auto insert_pair = cb_access_state.emplace(command_buffer, std::move(context));
John Zulauf9cb530d2019-09-30 14:14:10 -06001087 found_it = insert_pair.first;
1088 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001089 return found_it->second;
John Zulauf9cb530d2019-09-30 14:14:10 -06001090 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001091
John Zulauf3d84f1b2020-03-09 13:33:25 -06001092 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001093 return GetAccessContextImpl(command_buffer, true).get(); // true -> do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001094 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001095 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001096 return GetAccessContextImpl(command_buffer, false).get(); // false -> don't do_insert on not found
1097 }
1098
1099 CommandBufferAccessContextShared GetAccessContextShared(VkCommandBuffer command_buffer) {
1100 return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
1101 }
1102 CommandBufferAccessContextShared GetAccessContextSharedNoInsert(VkCommandBuffer command_buffer) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001103 return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001104 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001105
1106 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
John Zulauf9cb530d2019-09-30 14:14:10 -06001107 const auto found_it = cb_access_state.find(command_buffer);
1108 if (found_it == cb_access_state.end()) {
1109 return nullptr;
1110 }
1111 return found_it->second.get();
1112 }
1113
John Zulaufd1f85d42020-04-15 12:23:15 -06001114 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1115 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001116 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001117 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001118 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001119 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1120 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001121 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001122
1123 void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001124 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001125
John Zulauf355e49b2020-04-24 15:11:15 -06001126 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001127 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001128
1129 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001130 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001131
1132 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001133 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001134
1135 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001136 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001137
John Zulauf9cb530d2019-09-30 14:14:10 -06001138 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001139 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001140
1141 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001142 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001143
John Zulauf4a6105a2020-11-17 15:11:05 -07001144 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001145 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001146
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001147 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001148
John Zulauf5c5e88d2019-12-26 11:22:02 -07001149 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1150 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001151 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001152
1153 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001154 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001155
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001156 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001157
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001158 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001159
John Zulauf9cb530d2019-09-30 14:14:10 -06001160 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1161 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1162 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1163 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1164 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001165 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001166
1167 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1168 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1169 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1170 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001171 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001172
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001173 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1174 const VkDependencyInfoKHR *pDependencyInfo) const override;
1175 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
1176
John Zulauf3d84f1b2020-03-09 13:33:25 -06001177 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001178 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001179
1180 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001181 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001182 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001183 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001184 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001185 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001186
Mike Schuchardt2df08912020-12-15 16:28:09 -08001187 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001188 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001189 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001190 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1191 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1192 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1193 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001194
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001195 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001196 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001197 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001198 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001199 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001200
sfricke-samsung85584a72021-09-30 21:43:38 -07001201 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001202 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001203 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1204 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001205
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001206 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1207 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1208 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001209
1210 template <typename BufferImageCopyRegionType>
1211 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1212 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1213 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001214 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1215 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001216 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001217 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001218 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001219
Jeff Leger178b1e52020-10-05 12:22:23 -04001220 template <typename BufferImageCopyRegionType>
1221 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1222 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1223 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001224 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001225 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001226 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001227 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001228
Jeff Leger178b1e52020-10-05 12:22:23 -04001229 template <typename BufferImageCopyRegionType>
1230 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1231 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1232 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001233 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001234 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001235 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001236 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001237
Jeff Leger178b1e52020-10-05 12:22:23 -04001238 template <typename BufferImageCopyRegionType>
1239 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1240 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1241 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001242 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001243 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001244 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001245 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001246
1247 template <typename RegionType>
1248 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1249 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1250 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001251
1252 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1253 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001254 const VkImageBlit *pRegions, VkFilter filter) const override;
1255 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001256
Jeff Leger178b1e52020-10-05 12:22:23 -04001257 template <typename RegionType>
1258 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1259 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1260 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001261 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1262 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001263 VkFilter filter) override;
1264 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001265
John Zulauffaea0ee2021-01-14 14:01:32 -07001266 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1267 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1268 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001269 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001270 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1271 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001272
John Zulauffaea0ee2021-01-14 14:01:32 -07001273 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1274 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001275 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001276
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001277 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1278 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001279
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001280 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1281 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001282
1283 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001284 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001285 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001286 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001287
1288 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001289 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001290 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001291 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001292
1293 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001294 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001295 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001296 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001297
1298 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001299 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001300 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001301 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001302
locke-lunargff255f92020-05-13 18:53:52 -06001303 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1304 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1305 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001306 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1307 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001308 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001309 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1310 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001311 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1312 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001313 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001314 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1315 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001316 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001317 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1318 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001319 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001320 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1321 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001322 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001323 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1324 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001325 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001326
locke-lunargff255f92020-05-13 18:53:52 -06001327 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1328 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1329 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001330 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1331 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001332 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001333 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1334 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1335 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001336 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1337 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001338 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001339 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1340 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001341 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001342 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1343 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001344 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001345 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1346 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001347 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001348 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1349 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001350 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001351
1352 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1353 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001354 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001355 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1356 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001357 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001358
1359 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1360 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001361 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001362 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1363 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001364 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001365
1366 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1367 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001368 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001369 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1370 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001371 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001372
1373 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001374 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001375 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001376 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001377
1378 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1379 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001380 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001381
locke-lunarge1a67022020-04-29 00:15:36 -06001382 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1383 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001384 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001385
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001386 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
1387 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001388
locke-lunarge1a67022020-04-29 00:15:36 -06001389 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001390 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001391 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001392 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001393
1394 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001395 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001396 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001397 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001398
1399 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1400 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1401
John Zulauf4edde622021-02-15 08:54:50 -07001402 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1403 const VkDependencyInfoKHR *pDependencyInfo) const override;
1404 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1405 const VkDependencyInfoKHR *pDependencyInfo) override;
1406
John Zulauf49beb112020-11-04 16:06:31 -07001407 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1408 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1409
John Zulauf4edde622021-02-15 08:54:50 -07001410 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1411 VkPipelineStageFlags2KHR stageMask) const override;
1412 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
1413
John Zulauf49beb112020-11-04 16:06:31 -07001414 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1415 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1416 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1417 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1418 uint32_t imageMemoryBarrierCount,
1419 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1420 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1421 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1422 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1423 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1424 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001425 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1426 const VkDependencyInfoKHR *pDependencyInfos) const override;
1427 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1428 const VkDependencyInfoKHR *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001429 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1430 VkDeviceSize dstOffset, uint32_t marker) const override;
1431 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1432 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001433 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1434 const VkCommandBuffer *pCommandBuffers) const override;
1435 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1436 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001437};