blob: 2f48743557d4e6b7044506e756db6a7b5b3d9b32 [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
Tony-LunarG4c253372022-01-18 13:51:07 -07002 * Copyright (c) 2019-2022 Valve Corporation
3 * Copyright (c) 2019-2022 LunarG, Inc.
John Zulauf9cb530d2019-09-30 14:14:10 -06004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: John Zulauf <jzulauf@lunarg.com>
John Zulaufab7756b2020-12-29 16:10:16 -070018 * Author: Locke Lin <locke@lunarg.com>
19 * Author: Jeremy Gebben <jeremyg@lunarg.com>
John Zulauf9cb530d2019-09-30 14:14:10 -060020 */
21
22#pragma once
23
John Zulauf7635de32020-05-29 17:14:15 -060024#include <limits>
John Zulauf9cb530d2019-09-30 14:14:10 -060025#include <memory>
John Zulauf9cb530d2019-09-30 14:14:10 -060026#include <vulkan/vulkan.h>
27
28#include "synchronization_validation_types.h"
29#include "state_tracker.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060030#include "cmd_buffer_state.h"
31#include "render_pass_state.h"
John Zulauf9cb530d2019-09-30 14:14:10 -060032
John Zulaufd5115702021-01-18 12:34:33 -070033class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070034class CommandBufferAccessContext;
John Zulauf64ffe552021-02-06 10:25:07 -070035class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070036class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060037struct ResourceFirstAccess;
John Zulaufd5115702021-01-18 12:34:33 -070038class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060039
John Zulaufd0ec59f2021-03-13 14:25:08 -070040using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
41using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
42
John Zulauf2f952d22020-02-10 11:34:51 -070043enum SyncHazard {
44 NONE = 0,
45 READ_AFTER_WRITE,
46 WRITE_AFTER_READ,
47 WRITE_AFTER_WRITE,
48 READ_RACING_WRITE,
49 WRITE_RACING_WRITE,
50 WRITE_RACING_READ,
51};
John Zulauf9cb530d2019-09-30 14:14:10 -060052
John Zulauf8e3c3e92021-01-06 11:19:36 -070053enum class SyncOrdering : uint8_t {
54 kNonAttachment = 0,
55 kColorAttachment = 1,
56 kDepthStencilAttachment = 2,
57 kRaster = 3,
58 kNumOrderings = 4,
59};
60
John Zulauf9cb530d2019-09-30 14:14:10 -060061// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
62struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070063 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060064 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
65 }
John Zulauf1507ee42020-05-18 11:33:09 -060066 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
67 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
68 }
John Zulauf9cb530d2019-09-30 14:14:10 -060069
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070070 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060071 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
72
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070073 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
74 return (stage_access_bit & syncStageAccessWriteMask).any();
75 }
76 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
77 return (stage_access_mask & syncStageAccessWriteMask).any();
78 }
John Zulauf9cb530d2019-09-30 14:14:10 -060079 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070080 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060081 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
82 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070083 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
84 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
85 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
86 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060087 return stage_scope & AccessScopeByAccess(accesses);
88 }
89};
90
John Zulauf14940722021-04-12 15:19:02 -060091struct ResourceUsageRecord {
John Zulauf41a9c7c2021-12-07 15:59:53 -070092 enum class SubcommandType { kNone, kSubpassTransition, kLoadOp, kStoreOp, kResolveOp, kIndex };
93
John Zulauf14940722021-04-12 15:19:02 -060094 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070095 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070096 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -060097 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070098 CMD_TYPE command = CMD_NONE;
99 Count seq_num = 0U;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700100 SubcommandType sub_command_type = SubcommandType::kNone;
John Zulauffaea0ee2021-01-14 14:01:32 -0700101 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600102
103 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
104 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600105 const CMD_BUFFER_STATE *cb_state = nullptr; // plain pointer as a shared pointer is held by the context storing this record
John Zulauf3c2a0b32021-07-14 11:14:52 -0600106 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700107
John Zulauf14940722021-04-12 15:19:02 -0600108 ResourceUsageRecord() = default;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700109 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, SubcommandType sub_type_, Count sub_command_,
110 const CMD_BUFFER_STATE *cb_state_, Count reset_count_)
111 : command(command_),
112 seq_num(seq_num_),
113 sub_command_type(sub_type_),
114 sub_command(sub_command_),
115 cb_state(cb_state_),
116 reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600117};
118
John Zulauf3c2a0b32021-07-14 11:14:52 -0600119// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600120using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600121using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600122
John Zulauf9cb530d2019-09-30 14:14:10 -0600123struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600124 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600125 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600126 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600127 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600128 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600129 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600130 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600131 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600132 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulauf9cb530d2019-09-30 14:14:10 -0600133};
134
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700135struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700136 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
137 VkPipelineStageFlags2KHR
138 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
139 VkPipelineStageFlags2KHR exec_scope; // all earlier or later stages that would be affected by a barrier using this scope.
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700140 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
141
142 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
143
John Zulauf06f6f1e2022-04-19 15:28:11 -0600144 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask,
145 const VkPipelineStageFlags2KHR disabled_feature_mask = 0);
Jeremy Gebben40a22942020-12-22 14:22:06 -0700146 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700147};
148
John Zulauf3d84f1b2020-03-09 13:33:25 -0600149struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700150 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600151 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700152 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600153 SyncStageAccessFlags dst_access_scope;
154 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700155 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600156 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700157
158 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
John Zulauf06f6f1e2022-04-19 15:28:11 -0600159 SyncBarrier(const SyncExecScope &src_exec, const SyncStageAccessFlags &src_access, const SyncExecScope &dst_exec,
160 const SyncStageAccessFlags &dst_access)
161 : src_exec_scope(src_exec), src_access_scope(src_access), dst_exec_scope(dst_exec), dst_access_scope(dst_access) {}
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700162
163 template <typename Barrier>
164 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
165
166 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700167 // template constructor for sync2 barriers
168 template <typename Barrier>
169 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700170
John Zulaufa0a98292020-09-18 09:30:10 -0600171 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700172 // Note that after merge, only the exec_scope and access_scope fields are fully valid
173 // TODO: Do we need to update any of the other fields? Merging has limited application.
174 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600175 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700176 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600177 dst_access_scope |= other.dst_access_scope;
178 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600179};
John Zulauf69133422020-05-20 14:55:53 -0600180
John Zulauf43cc7462020-12-03 12:33:12 -0700181enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
182
John Zulauf4a6105a2020-11-17 15:11:05 -0700183struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700184 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700185 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700186 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
187 EventPointer event;
188 CMD_TYPE last_command; // Only Event commands are valid here.
John Zulauf610e28c2021-08-03 17:46:23 -0600189 ResourceUsageTag last_command_tag; // Needed to filter replay validation
John Zulauf4a6105a2020-11-17 15:11:05 -0700190 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700191 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700192 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700193 ResourceUsageTag first_scope_tag;
John Zulauf78b1f892021-09-20 15:02:09 -0600194 bool first_scope_set;
John Zulaufd5115702021-01-18 12:34:33 -0700195 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700196 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700197 template <typename EventPointerType>
198 SyncEventState(EventPointerType &&event_state)
199 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700200 last_command(CMD_NONE),
John Zulauf610e28c2021-08-03 17:46:23 -0600201 last_command_tag(0),
John Zulaufd5115702021-01-18 12:34:33 -0700202 unsynchronized_set(CMD_NONE),
203 barriers(0U),
204 scope(),
205 first_scope_tag(),
John Zulauf78b1f892021-09-20 15:02:09 -0600206 first_scope_set(false),
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600207 destroyed((event_state.get() == nullptr) || event_state->Destroyed()) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700208 SyncEventState() : SyncEventState(EventPointer()) {}
209 void ResetFirstScope();
210 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700211 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700212 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700213};
John Zulaufea943c52022-02-22 11:05:17 -0700214
John Zulauf669dfd52021-01-27 17:15:28 -0700215class SyncEventsContext {
216 public:
John Zulaufea943c52022-02-22 11:05:17 -0700217 using Map = layer_data::unordered_map<const EVENT_STATE *, std::shared_ptr<SyncEventState>>;
John Zulauf669dfd52021-01-27 17:15:28 -0700218 using iterator = Map::iterator;
219 using const_iterator = Map::const_iterator;
220
221 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
222 const auto find_it = map_.find(event_state.get());
223 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700224 if (!event_state.get()) return nullptr;
225
John Zulauf669dfd52021-01-27 17:15:28 -0700226 const auto *event_plain_ptr = event_state.get();
John Zulaufea943c52022-02-22 11:05:17 -0700227 auto sync_state = std::shared_ptr<SyncEventState>(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700228 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700229 return insert_pair.first->second.get();
230 }
231 return find_it->second.get();
232 }
233
234 const SyncEventState *Get(const EVENT_STATE *event_state) const {
235 const auto find_it = map_.find(event_state);
236 if (find_it == map_.end()) {
237 return nullptr;
238 }
239 return find_it->second.get();
240 }
John Zulauf6ce24372021-01-30 05:56:25 -0700241 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700242
John Zulauf8eda1562021-04-13 17:06:41 -0600243 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst);
244
John Zulauf669dfd52021-01-27 17:15:28 -0700245 // stl style naming for range-for support
246 inline iterator begin() { return map_.begin(); }
247 inline const_iterator begin() const { return map_.begin(); }
248 inline iterator end() { return map_.end(); }
249 inline const_iterator end() const { return map_.end(); }
250
251 void Destroy(const EVENT_STATE *event_state) {
252 auto sync_it = map_.find(event_state);
253 if (sync_it != map_.end()) {
254 sync_it->second->destroyed = true;
255 map_.erase(sync_it);
256 }
257 }
258 void Clear() { map_.clear(); }
259
260 private:
261 Map map_;
262};
John Zulauf4a6105a2020-11-17 15:11:05 -0700263
John Zulauf4fa68462021-04-26 21:04:22 -0600264struct ResourceFirstAccess {
265 ResourceUsageTag tag;
266 SyncStageAccessIndex usage_index;
267 SyncOrdering ordering_rule;
268 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
269 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
270 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
271 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
272 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
273 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
274 bool operator==(const ResourceFirstAccess &rhs) const {
275 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
276 }
277};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600278
John Zulauf1d5f9c12022-05-13 14:51:08 -0600279using QueueId = uint32_t;
John Zulauf9cb530d2019-09-30 14:14:10 -0600280class ResourceAccessState : public SyncStageAccess {
281 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700282 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700283 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700284 SyncStageAccessFlags access_scope;
285 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700286 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700287 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700288 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600289 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
290 exec_scope |= rhs.exec_scope;
291 access_scope |= rhs.access_scope;
292 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700293 }
294 };
John Zulauf4fa68462021-04-26 21:04:22 -0600295 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
296 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700297
John Zulauf9cb530d2019-09-30 14:14:10 -0600298 // Mutliple read operations can be simlutaneously (and independently) synchronized,
299 // given the only the second execution scope creates a dependency chain, we have to track each,
300 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
301 // and applicable one for hazard detection
302 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700303 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600304 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600305 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700306 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf1d5f9c12022-05-13 14:51:08 -0600307 VkPipelineStageFlags2KHR sync_stages; // reads known to have happened after this
John Zulauf9cb530d2019-09-30 14:14:10 -0600308 ResourceUsageTag tag;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600309 QueueId queue;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700310 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
311 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600312 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700313 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf1d5f9c12022-05-13 14:51:08 -0600314 ResourceUsageTag tag_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600315 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600316 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600317 return same;
318 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700319 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700320 // If the read stage is not in the src sync scope
321 // *AND* not execution chained with an existing sync barrier (that's the or)
322 // then the barrier access is unsafe (R/W after R)
323 return (src_exec_scope & (stage | barriers)) == 0;
324 }
325
John Zulaufe5da6e52020-03-18 15:32:18 -0600326 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
John Zulaufee984022022-04-13 16:39:50 -0600327 void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
328 ResourceUsageTag tag_);
John Zulaufb7578302022-05-19 13:50:18 -0600329 bool ReadInScopeOrChain(VkPipelineStageFlags2 exec_scope) const { return (exec_scope & (stage | barriers)) != 0; }
John Zulauf00119522022-05-23 19:07:42 -0600330 bool ReadInQueueScopeOrChain(QueueId queue, VkPipelineStageFlags2 exec_scope) const;
John Zulaufb7578302022-05-19 13:50:18 -0600331 bool ReadInEventScope(VkPipelineStageFlags2 exec_scope, ResourceUsageTag scope_tag) const {
332 // If this read is the same one we included in the set event and in scope, then apply the execution barrier...
333 // NOTE: That's not really correct... this read stage might *not* have been included in the setevent, and the barriers
334 // representing the chain might have changed since then (that would be an odd usage), so as a first approximation
335 // we'll assume the barriers *haven't* been changed since (if the tag hasn't), and while this could be a false
336 // positive in the case of Set; SomeBarrier; Wait; we'll live with it until we can add more state to the first scope
337 // capture (the specific write and read stages that *were* in scope at the moment of SetEvents.
338 return (tag < scope_tag) && ReadInScopeOrChain(exec_scope);
339 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600340 };
341
342 public:
343 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf4fa68462021-04-26 21:04:22 -0600344 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule) const;
345 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering) const;
John Zulaufae842002021-04-15 18:20:55 -0600346 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
347
348 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
349 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
350 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600351
Jeremy Gebben40a22942020-12-22 14:22:06 -0700352 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700353 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700354 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600355 const SyncStageAccessFlags &source_access_scope, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600356
John Zulauf14940722021-04-12 15:19:02 -0600357 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
358 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf1d5f9c12022-05-13 14:51:08 -0600359 void ClearWrite();
360 void ClearRead();
John Zulauf5f13a792020-03-10 07:31:21 -0600361 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600362 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulaufbb890452021-12-14 11:30:18 -0700363 void ApplyBarriersImmediate(const std::vector<SyncBarrier> &barriers);
John Zulaufb7578302022-05-19 13:50:18 -0600364 template <typename ScopeOps>
365 void ApplyBarrier(ScopeOps &&scope, const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600366 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulauf1d5f9c12022-05-13 14:51:08 -0600367
368 struct QueueTagPredicate {
369 QueueId queue;
370 ResourceUsageTag tag;
371 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag);
372 };
373
374 struct QueuePredicate {
375 QueueId queue;
376 QueuePredicate(QueueId queue_) : queue(queue_) {}
377 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag);
378 };
379 struct TagPredicate {
380 ResourceUsageTag tag;
381 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag);
382 };
383
384 template <typename Pred>
385 bool ApplyQueueTagWait(Pred &&);
John Zulaufae842002021-04-15 18:20:55 -0600386 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600387
John Zulauf1d5f9c12022-05-13 14:51:08 -0600388 void OffsetTag(ResourceUsageTag offset);
389 ResourceAccessState();
John Zulauf9cb530d2019-09-30 14:14:10 -0600390
John Zulaufb02c1eb2020-10-06 16:33:36 -0600391 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700392 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600393 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600394 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600395 bool operator==(const ResourceAccessState &rhs) const {
396 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700397 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
398 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700399 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600400 return same;
401 }
402 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700403 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600404 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700405 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700406 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
407 }
John Zulauf1d5f9c12022-05-13 14:51:08 -0600408 void SetQueueId(QueueId id);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600409
John Zulauf00119522022-05-23 19:07:42 -0600410 bool WriteInChain(VkPipelineStageFlags2KHR src_exec_scope) const;
411 bool WriteInScope(const SyncStageAccessFlags &src_access_scope) const;
John Zulaufb7578302022-05-19 13:50:18 -0600412 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const;
John Zulauf00119522022-05-23 19:07:42 -0600413 bool WriteInQueueSourceScopeOrChain(QueueId queue, VkPipelineStageFlags2KHR src_exec_scope,
414 SyncStageAccessFlags src_access_scope) const;
John Zulaufb7578302022-05-19 13:50:18 -0600415 bool WriteInEventScope(const SyncStageAccessFlags &src_access_scope, ResourceUsageTag scope_tag) const;
416
417 struct UntaggedScopeOps {
418 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
419 return access.WriteInSourceScopeOrChain(barrier.src_exec_scope.exec_scope, barrier.src_access_scope);
420 }
421 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
422 return read_state.ReadInScopeOrChain(barrier.src_exec_scope.exec_scope);
423 }
424 };
John Zulauf00119522022-05-23 19:07:42 -0600425
426 struct QueueScopeOps {
427 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
428 return access.WriteInQueueSourceScopeOrChain(queue, barrier.src_exec_scope.exec_scope, barrier.src_access_scope);
429 }
430 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
431 return read_state.ReadInQueueScopeOrChain(queue, barrier.src_exec_scope.exec_scope);
432 }
433 QueueScopeOps(QueueId scope_queue) : queue(scope_queue) {}
434 QueueId queue;
435 };
436
John Zulaufb7578302022-05-19 13:50:18 -0600437 struct EventScopeOps {
438 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
439 return access.WriteInEventScope(barrier.src_access_scope, scope_tag);
440 }
441 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
442 return read_state.ReadInEventScope(barrier.src_exec_scope.exec_scope, scope_tag);
443 }
444 EventScopeOps(ResourceUsageTag event_tag) : scope_tag(event_tag) {}
445 ResourceUsageTag scope_tag;
446 };
447
John Zulauf9cb530d2019-09-30 14:14:10 -0600448 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700449 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700450 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700451 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
452 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600453 // If the previous write is *not* a layout transition
454 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700455 // *AND* the current barrier is not in the dependency chain
456 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
457 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600458 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
459 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700460 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700461 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700462 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
463 }
John Zulaufd14743a2020-07-03 09:42:39 -0600464
Jeremy Gebben40a22942020-12-22 14:22:06 -0700465 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600466 return stage_mask != (stage_mask & barriers);
467 }
468
Jeremy Gebben40a22942020-12-22 14:22:06 -0700469 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600470 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700471 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700472 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700473
John Zulauf14940722021-04-12 15:19:02 -0600474 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600475 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700476
John Zulauf8e3c3e92021-01-06 11:19:36 -0700477 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
478 return kOrderingRules[static_cast<size_t>(ordering_enum)];
479 }
John Zulaufd14743a2020-07-03 09:42:39 -0600480
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700481 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600482
John Zulauf9cb530d2019-09-30 14:14:10 -0600483 // With reads, each must be "safe" relative to it's prior write, so we need only
484 // save the most recent write operation (as anything *transitively* unsafe would arleady
485 // be included
486 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700487 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600488 ResourceUsageTag write_tag;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600489 QueueId write_queue;
John Zulauf355e49b2020-04-24 15:11:15 -0600490 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600491
John Zulauff51fbb62020-10-02 14:43:24 -0600492 // TODO Input Attachment cleanup for multiple reads in a given stage
493 // Tracks whether the fragment shader read is input attachment read
494 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600495
Jeremy Gebben40a22942020-12-22 14:22:06 -0700496 VkPipelineStageFlags2KHR last_read_stages;
497 VkPipelineStageFlags2KHR read_execution_barriers;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600498 using ReadStates = small_vector<ReadState, 3, uint32_t>;
499 ReadStates last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600500
501 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700502 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600503 bool pending_layout_transition;
504 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600505 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700506 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700507 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600508 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700509
510 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600511};
John Zulauf22aefed2021-03-11 18:14:35 -0700512using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
513using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600514
John Zulauf16adfc92020-04-08 10:28:33 -0600515using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700516using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700517using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600518using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600519
John Zulaufd0ec59f2021-03-13 14:25:08 -0700520class AttachmentViewGen {
521 public:
522 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
523 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
524 AttachmentViewGen(const AttachmentViewGen &other) = default;
525 AttachmentViewGen(AttachmentViewGen &&other) = default;
526 AccessAddressType GetAddressType() const;
527 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
528 const ImageRangeGen *GetRangeGen(Gen type) const;
529 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
530 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
531
532 private:
533 using RangeGenStore = layer_data::optional<ImageRangeGen>;
534 const IMAGE_VIEW_STATE *view_ = nullptr;
535 VkImageAspectFlags view_mask_ = 0U;
536 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
537};
538
539using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
540
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700541using SyncMemoryBarrier = SyncBarrier;
542struct SyncBufferMemoryBarrier {
543 using Buffer = std::shared_ptr<const BUFFER_STATE>;
544 Buffer buffer;
545 SyncBarrier barrier;
546 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700547 bool IsLayoutTransition() const { return false; }
548 const ResourceAccessRange &Range() const { return range; };
549 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700550 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
551 : buffer(buffer_), barrier(barrier_), range(range_) {}
552 SyncBufferMemoryBarrier() = default;
553};
554
555struct SyncImageMemoryBarrier {
556 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600557
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700558 Image image;
559 uint32_t index;
560 SyncBarrier barrier;
561 VkImageLayout old_layout;
562 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600563 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700564
565 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600566 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700567 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700568 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
569 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
570 : image(image_),
571 index(index_),
572 barrier(barrier_),
573 old_layout(old_layout_),
574 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600575 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700576 SyncImageMemoryBarrier() = default;
577};
578
John Zulaufbb890452021-12-14 11:30:18 -0700579template <typename SubpassNode>
580struct SubpassBarrierTrackback {
581 std::vector<SyncBarrier> barriers;
582 const SubpassNode *source_subpass = nullptr;
583 SubpassBarrierTrackback() = default;
584 SubpassBarrierTrackback(const SubpassBarrierTrackback &) = default;
585 SubpassBarrierTrackback(const SubpassNode *source_subpass_, VkQueueFlags queue_flags_,
586 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
587 : barriers(), source_subpass(source_subpass_) {
588 barriers.reserve(subpass_dependencies_.size());
589 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
590 assert(dependency);
591 barriers.emplace_back(queue_flags_, *dependency);
592 }
593 }
John Zulauf06f6f1e2022-04-19 15:28:11 -0600594 SubpassBarrierTrackback(const SubpassNode *source_subpass_, const SyncBarrier &barrier_)
595 : barriers(1, barrier_), source_subpass(source_subpass_) {}
John Zulaufbb890452021-12-14 11:30:18 -0700596 SubpassBarrierTrackback &operator=(const SubpassBarrierTrackback &) = default;
597};
598
599struct ReplayTrackbackBarriersAction {
600 struct TrackbackBarriers : public SubpassBarrierTrackback<ReplayTrackbackBarriersAction> {
601 using Base = SubpassBarrierTrackback<ReplayTrackbackBarriersAction>;
602 TrackbackBarriers(const ReplayTrackbackBarriersAction *source_subpass_, VkQueueFlags queue_flags_,
603 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_);
604 void operator()(ResourceAccessState *access) const;
605 };
606
607 ReplayTrackbackBarriersAction() = default;
608 ReplayTrackbackBarriersAction(VkQueueFlags queue_flags, const SubpassDependencyGraphNode &dependencies,
609 const std::vector<ReplayTrackbackBarriersAction> &contexts);
610
611 void operator()(ResourceAccessState *access) const;
612 std::vector<TrackbackBarriers> trackback_barriers;
613};
614
615struct ReplayRenderpassContext {
616 std::vector<ReplayTrackbackBarriersAction> subpass_contexts;
617};
618
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700619class SyncOpBase {
620 public:
John Zulaufbb890452021-12-14 11:30:18 -0700621 using ReplayContextPtr = std::shared_ptr<ReplayRenderpassContext>;
sfricke-samsung85584a72021-09-30 21:43:38 -0700622 SyncOpBase() : cmd_(CMD_NONE) {}
623 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600624 virtual ~SyncOpBase() = default;
625
sfricke-samsung85584a72021-09-30 21:43:38 -0700626 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufbb890452021-12-14 11:30:18 -0700627 const ReplayTrackbackBarriersAction *GetReplayTrackback() const;
628
629 void SetReplayContext(uint32_t subpass, ReplayContextPtr &&replay);
630
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700631 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600632 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
633 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700634 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const = 0;
John Zulauf00119522022-05-23 19:07:42 -0600635 virtual void ReplayRecord(QueueId queue_id, ResourceUsageTag tag, AccessContext *access_context,
636 SyncEventsContext *events_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700637
638 protected:
John Zulaufbb890452021-12-14 11:30:18 -0700639 // Only non-null and valid for SyncOps within a render pass instance WIP -- think about how to manage for non RPI calls within
640 // RPI and 2ndarys...
641 ReplayContextPtr replay_context_;
642 uint32_t subpass_ = VK_SUBPASS_EXTERNAL;
John Zulauf36ef9282021-02-02 11:47:24 -0700643 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700644};
645
John Zulaufd5115702021-01-18 12:34:33 -0700646class SyncOpBarriers : public SyncOpBase {
647 protected:
648 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600649 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700650 AccessContext *context);
651 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600652 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700653 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700654
John Zulauf36ef9282021-02-02 11:47:24 -0700655 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700656 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
657 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
658 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
659 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700660 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
661 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700662
John Zulauf8eda1562021-04-13 17:06:41 -0600663 ~SyncOpBarriers() override = default;
664
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700665 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700666 struct BarrierSet {
667 VkDependencyFlags dependency_flags;
668 SyncExecScope src_exec_scope;
669 SyncExecScope dst_exec_scope;
670 std::vector<SyncMemoryBarrier> memory_barriers;
671 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
672 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
673 bool single_exec_scope;
674 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
675 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
676 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
677 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
678 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
679 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
680 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
681 const VkImageMemoryBarrier *pImageMemoryBarriers);
682 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700683 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700684 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700685 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700686 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700687 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700688 };
689 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700690};
691
John Zulaufd5115702021-01-18 12:34:33 -0700692class SyncOpPipelineBarrier : public SyncOpBarriers {
693 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700694 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
695 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
696 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700697 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
698 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700699 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
700 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600701 ~SyncOpPipelineBarrier() override = default;
702
John Zulaufd5115702021-01-18 12:34:33 -0700703 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600704 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
705 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700706 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf00119522022-05-23 19:07:42 -0600707 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700708 SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700709};
710
711class SyncOpWaitEvents : public SyncOpBarriers {
712 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700713 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
714 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
715 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700716 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
717 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700718
719 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
720 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600721 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700722
John Zulaufd5115702021-01-18 12:34:33 -0700723 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600724 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
725 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700726 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf00119522022-05-23 19:07:42 -0600727 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700728 SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700729
730 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600731 static const char *const kIgnored;
John Zulaufbb890452021-12-14 11:30:18 -0700732 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700733 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
734 // 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 -0700735 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
736 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700737};
738
John Zulauf6ce24372021-01-30 05:56:25 -0700739class SyncOpResetEvent : public SyncOpBase {
740 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700741 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700742 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600743 ~SyncOpResetEvent() override = default;
744
John Zulauf6ce24372021-01-30 05:56:25 -0700745 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600746 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
747 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700748 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf00119522022-05-23 19:07:42 -0600749 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700750 SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700751
752 private:
John Zulaufbb890452021-12-14 11:30:18 -0700753 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700754 std::shared_ptr<const EVENT_STATE> event_;
755 SyncExecScope exec_scope_;
756};
757
758class SyncOpSetEvent : public SyncOpBase {
759 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700760 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700761 VkPipelineStageFlags2KHR stageMask);
762 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
763 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600764 ~SyncOpSetEvent() override = default;
765
John Zulauf6ce24372021-01-30 05:56:25 -0700766 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600767 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
768 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700769 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700770
771 private:
John Zulaufbb890452021-12-14 11:30:18 -0700772 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf00119522022-05-23 19:07:42 -0600773 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700774 SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700775 std::shared_ptr<const EVENT_STATE> event_;
776 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700777 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600778 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700779};
John Zulauf64ffe552021-02-06 10:25:07 -0700780
781class SyncOpBeginRenderPass : public SyncOpBase {
782 public:
783 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700784 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600785 ~SyncOpBeginRenderPass() override = default;
786
John Zulauf64ffe552021-02-06 10:25:07 -0700787 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600788 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
789 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700790 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf00119522022-05-23 19:07:42 -0600791 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700792 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700793
794 protected:
795 safe_VkRenderPassBeginInfo renderpass_begin_info_;
796 safe_VkSubpassBeginInfo subpass_begin_info_;
797 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
798 std::vector<const IMAGE_VIEW_STATE *> attachments_;
799 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
John Zulaufbb890452021-12-14 11:30:18 -0700800 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Shared across all subpasses for same renderpass instance
John Zulauf64ffe552021-02-06 10:25:07 -0700801};
802
803class SyncOpNextSubpass : public SyncOpBase {
804 public:
805 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700806 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600807 ~SyncOpNextSubpass() override = default;
808
John Zulauf64ffe552021-02-06 10:25:07 -0700809 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600810 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
811 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700812 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf00119522022-05-23 19:07:42 -0600813 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700814 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700815
816 protected:
817 safe_VkSubpassBeginInfo subpass_begin_info_;
818 safe_VkSubpassEndInfo subpass_end_info_;
John Zulaufbb890452021-12-14 11:30:18 -0700819 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Shared across all subpasses for same renderpass instance
John Zulauf64ffe552021-02-06 10:25:07 -0700820};
821
822class SyncOpEndRenderPass : public SyncOpBase {
823 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700824 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600825 ~SyncOpEndRenderPass() override = default;
826
John Zulauf64ffe552021-02-06 10:25:07 -0700827 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600828 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
829 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700830 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf00119522022-05-23 19:07:42 -0600831 void ReplayRecord(QueueId queue_id, ResourceUsageTag recorded_tag, AccessContext *access_context,
John Zulaufbb890452021-12-14 11:30:18 -0700832 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700833
834 protected:
835 safe_VkSubpassEndInfo subpass_end_info_;
836};
837
John Zulauf540266b2020-04-06 18:54:53 -0600838class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700839 public:
John Zulauf69133422020-05-20 14:55:53 -0600840 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600841 kDetectPrevious = 1U << 0,
842 kDetectAsync = 1U << 1,
843 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600844 };
John Zulauf1d5f9c12022-05-13 14:51:08 -0600845 struct AddressRange {
846 AccessAddressType type;
847 ResourceAccessRange range;
848 AddressRange() = default; // the explicit constructor below isn't needed in 20, but would delete the default.
849 AddressRange(AccessAddressType type_, ResourceAccessRange range_) : type(type_), range(range_) {}
850 };
John Zulauf43cc7462020-12-03 12:33:12 -0700851 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600852
John Zulaufbb890452021-12-14 11:30:18 -0700853 using TrackBack = SubpassBarrierTrackback<AccessContext>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700854
John Zulauf355e49b2020-04-24 15:11:15 -0600855 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600856 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200857 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
858 bool is_depth_sliced) const;
John Zulauf69133422020-05-20 14:55:53 -0600859 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700860 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
861 DetectOptions options) const;
862 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600863 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200864 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced,
865 DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600866 template <typename Detector>
867 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200868 bool is_depth_sliced, DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600869 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200870 const VkImageSubresourceRange &subresource_range, bool is_depth_sliced) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700871 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
872 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
873
John Zulauf69133422020-05-20 14:55:53 -0600874 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700875 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200876 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700877 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700878 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700879 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
880 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700881 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
882 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700883 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700884 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700885 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700886 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700887 const SyncStageAccessFlags &src_stage_accesses,
888 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700889 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700890 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600891
John Zulaufb02c1eb2020-10-06 16:33:36 -0600892 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600893 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600894
John Zulaufbb890452021-12-14 11:30:18 -0700895 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context,
896 const ReplayTrackbackBarriersAction *replay_barrier) const;
John Zulaufae842002021-04-15 18:20:55 -0600897
John Zulaufe5da6e52020-03-18 15:32:18 -0600898 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600899 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600900 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600901 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600902 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700903 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600904 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700905 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600906 for (auto &map : access_state_maps_) {
907 map.clear();
908 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600909 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600910
911 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
912 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600913 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
914 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700915 template <typename BarrierAction>
916 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
917 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700918 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700919 const ResourceAccessState *infill_state,
920 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700921 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600922 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700923 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
924 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600925 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700926 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600927 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
928 bool recur_to_infill = true) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600929 template <typename ResolveOp>
930 void ResolveFromContext(ResolveOp &&resolve_op, const AccessContext &from_context,
931 const ResourceAccessState *infill_state = nullptr, bool recur_to_infill = false);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600932
John Zulauf8e3c3e92021-01-06 11:19:36 -0700933 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600934 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700935 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600936 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
937 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600938 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600939 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700940 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600941 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700942 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600943 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600944 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700945 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600946 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700947 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600948 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600949
John Zulauf540266b2020-04-06 18:54:53 -0600950 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600951
John Zulauf4fa68462021-04-26 21:04:22 -0600952 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700953 template <typename Action, typename RangeGen>
954 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600955 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700956 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600957 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700958 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700959 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600960
John Zulauf1d5f9c12022-05-13 14:51:08 -0600961 void DeleteAccess(const AddressRange &address);
John Zulauf540266b2020-04-06 18:54:53 -0600962 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600963 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600964
965 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600966 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600967
John Zulauf43cc7462020-12-03 12:33:12 -0700968 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
969 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
970 return access_state_maps_[static_cast<size_t>(type)];
971 }
John Zulauf355e49b2020-04-24 15:11:15 -0600972 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
973 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700974 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600975 } else {
976 assert(subpass < prev_by_subpass_.size());
977 return prev_by_subpass_[subpass];
978 }
979 }
John Zulauf16adfc92020-04-08 10:28:33 -0600980
John Zulauf64ffe552021-02-06 10:25:07 -0700981 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700982 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
983 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700984 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700985 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
986 const char *func_name) const;
987 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
988
989 const RENDER_PASS_STATE &rp_state,
990
991 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
992 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700993 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700994 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700995 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600996
John Zulauf14940722021-04-12 15:19:02 -0600997 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700998 template <typename Action>
999 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001000
John Zulauf06f6f1e2022-04-19 15:28:11 -06001001 // For use during queue submit building up the QueueBatchContext AccessContext
1002 TrackBack *AddTrackBack(const AccessContext *context, const SyncBarrier &barrier);
1003 void AddAsyncContext(const AccessContext *context);
1004 // For use during queue submit to avoid stale pointers;
1005 void ClearTrackBacks() { prev_.clear(); }
1006 void ClearAsyncContext(const AccessContext *context) { async_.clear(); }
1007
John Zulauf3d84f1b2020-03-09 13:33:25 -06001008 private:
1009 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -07001010 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -06001011 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001012 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -07001013 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -06001014 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -07001015 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -07001016 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -06001017 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -06001018
1019 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001020 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -06001021 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001022 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -07001023 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -06001024 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001025 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001026};
1027
John Zulauf355e49b2020-04-24 15:11:15 -06001028class RenderPassAccessContext {
1029 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -07001030 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
1031 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -07001032 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
1033 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
1034 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -06001035
John Zulauf64ffe552021-02-06 10:25:07 -07001036 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
1037 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001038 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -07001039 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
1040 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
1041 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001042
John Zulauf14940722021-04-12 15:19:02 -06001043 void RecordLayoutTransitions(ResourceUsageTag tag);
1044 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001045 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
1046 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
1047 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -06001048
John Zulauf540266b2020-04-06 18:54:53 -06001049 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
1050 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -06001051 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
1052 uint32_t GetCurrentSubpass() const { return current_subpass_; }
1053 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001054 AccessContext *CreateStoreResolveProxy() const;
John Zulaufbb890452021-12-14 11:30:18 -07001055 std::shared_ptr<ReplayRenderpassContext> GetReplayContext() const { return replay_context_; }
John Zulauf355e49b2020-04-24 15:11:15 -06001056
1057 private:
John Zulauf355e49b2020-04-24 15:11:15 -06001058 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001059 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -06001060 uint32_t current_subpass_;
1061 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -07001062 AttachmentViewGenVector attachment_views_;
John Zulaufbb890452021-12-14 11:30:18 -07001063 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Each SyncOp for this renderpass instance will have a copy
John Zulauf3d84f1b2020-03-09 13:33:25 -06001064};
1065
John Zulauf64ffe552021-02-06 10:25:07 -07001066// Command execution context is the base class for command buffer and queue contexts
1067// Preventing unintented leakage of subclass specific state, storing enough information
1068// for message logging.
1069// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
1070class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001071 public:
John Zulauf3c788ef2022-02-22 12:12:30 -07001072 using AccessLog = std::vector<ResourceUsageRecord>;
John Zulauf64ffe552021-02-06 10:25:07 -07001073 CommandExecutionContext() : sync_state_(nullptr) {}
John Zulauf3c788ef2022-02-22 12:12:30 -07001074 CommandExecutionContext(const SyncValidator *sync_validator) : sync_state_(sync_validator) {}
John Zulauf64ffe552021-02-06 10:25:07 -07001075 virtual ~CommandExecutionContext() = default;
John Zulaufbb890452021-12-14 11:30:18 -07001076 virtual AccessContext *GetCurrentAccessContext() = 0;
1077 virtual SyncEventsContext *GetCurrentEventsContext() = 0;
1078 virtual const AccessContext *GetCurrentAccessContext() const = 0;
1079 virtual const SyncEventsContext *GetCurrentEventsContext() const = 0;
John Zulauf00119522022-05-23 19:07:42 -06001080 virtual QueueId GetQueueId() const = 0;
John Zulaufbb890452021-12-14 11:30:18 -07001081
John Zulauf64ffe552021-02-06 10:25:07 -07001082 const SyncValidator &GetSyncState() const {
1083 assert(sync_state_);
1084 return *sync_state_;
1085 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001086
John Zulauf3c788ef2022-02-22 12:12:30 -07001087 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulauf06f6f1e2022-04-19 15:28:11 -06001088 std::string FormatHazard(const HazardResult &hazard) const;
1089
John Zulaufbb890452021-12-14 11:30:18 -07001090 virtual ResourceUsageTag GetTagLimit() const = 0;
1091 virtual VulkanTypedHandle Handle() const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -06001092 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
John Zulauf3c788ef2022-02-22 12:12:30 -07001093 virtual void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) = 0;
John Zulauf64ffe552021-02-06 10:25:07 -07001094
1095 protected:
John Zulauf3c788ef2022-02-22 12:12:30 -07001096 const SyncValidator *sync_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001097};
1098
1099class CommandBufferAccessContext : public CommandExecutionContext {
1100 public:
John Zulauf8eda1562021-04-13 17:06:41 -06001101 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
1102 struct SyncOpEntry {
1103 ResourceUsageTag tag;
1104 SyncOpPointer sync_op;
1105 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
1106 SyncOpEntry() = default;
1107 SyncOpEntry(const SyncOpEntry &other) = default;
1108 };
1109
John Zulauf3c788ef2022-02-22 12:12:30 -07001110 CommandBufferAccessContext(const SyncValidator *sync_validator = nullptr)
John Zulauf64ffe552021-02-06 10:25:07 -07001111 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -06001112 cb_state_(),
1113 queue_flags_(),
1114 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -06001115 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -06001116 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -07001117 command_number_(0),
1118 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001119 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001120 cb_access_context_(),
1121 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001122 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001123 render_pass_contexts_(),
1124 current_renderpass_context_(),
1125 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001126 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001127 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001128 cb_state_ = cb_state;
1129 queue_flags_ = queue_flags;
1130 }
John Zulauf4fa68462021-04-26 21:04:22 -06001131
1132 struct AsProxyContext {};
1133 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1134
John Zulauf64ffe552021-02-06 10:25:07 -07001135 ~CommandBufferAccessContext() override = default;
1136 CommandExecutionContext &GetExecutionContext() { return *this; }
1137 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001138
1139 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001140 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001141 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001142 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001143 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001144 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001145 reset_count_++;
1146 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001147 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001148 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001149 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001150 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001151 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001152 void MarkDestroyed() { destroyed_ = true; }
1153 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001154
John Zulauf4fa68462021-04-26 21:04:22 -06001155 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001156 std::string FormatUsage(const ResourceFirstAccess &access) const; // Only command buffers have "first usage"
John Zulaufbb890452021-12-14 11:30:18 -07001157 AccessContext *GetCurrentAccessContext() override { return current_context_; }
1158 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1159 const AccessContext *GetCurrentAccessContext() const override { return current_context_; }
1160 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
John Zulauf00119522022-05-23 19:07:42 -06001161 QueueId GetQueueId() const override;
John Zulaufbb890452021-12-14 11:30:18 -07001162
John Zulauf64ffe552021-02-06 10:25:07 -07001163 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001164 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
John Zulauf41a9c7c2021-12-07 15:59:53 -07001165 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
1166 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulaufd5115702021-01-18 12:34:33 -07001167
locke-lunarg61870c22020-06-09 14:51:50 -06001168 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001169 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001170 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001171 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001172 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001173 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001174 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001175 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001176 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd);
1177 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd);
John Zulauf4a6105a2020-11-17 15:11:05 -07001178 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001179
John Zulaufbb890452021-12-14 11:30:18 -07001180 bool ValidateFirstUse(CommandExecutionContext *proxy_context, const char *func_name, uint32_t index) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001181 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context, CMD_TYPE cmd);
1182 void ResolveExecutedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
John Zulauf4fa68462021-04-26 21:04:22 -06001183
John Zulauf3d84f1b2020-03-09 13:33:25 -06001184 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1185 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001186
John Zulauf41a9c7c2021-12-07 15:59:53 -07001187 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
John Zulaufbb890452021-12-14 11:30:18 -07001188 ResourceUsageTag GetTagLimit() const override { return access_log_.size(); }
1189 VulkanTypedHandle Handle() const override {
1190 if (cb_state_) {
1191 return cb_state_->Handle();
1192 }
1193 return VulkanTypedHandle(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), kVulkanObjectTypeCommandBuffer);
1194 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001195
John Zulauf41a9c7c2021-12-07 15:59:53 -07001196 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1197 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1198 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001199
John Zulauf3c788ef2022-02-22 12:12:30 -07001200 std::shared_ptr<const CMD_BUFFER_STATE> GetCBStateShared() const { return cb_state_; }
1201
John Zulauffaea0ee2021-01-14 14:01:32 -07001202 const CMD_BUFFER_STATE &GetCBState() const {
1203 assert(cb_state_);
1204 return *(cb_state_.get());
1205 }
1206 CMD_BUFFER_STATE &GetCBState() {
1207 assert(cb_state_);
1208 return *(cb_state_.get());
1209 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001210
John Zulauf1bf30522021-09-03 15:39:06 -06001211 template <class T, class... Args>
1212 void RecordSyncOp(Args &&...args) {
1213 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1214 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
John Zulaufbb890452021-12-14 11:30:18 -07001215 RecordSyncOp(std::move(sync_op)); // Call the non-template version
John Zulauf1bf30522021-09-03 15:39:06 -06001216 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001217 const AccessLog &GetAccessLog() const { return access_log_; }
1218 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001219 const std::vector<SyncOpEntry> &GetSyncOps() const { return sync_ops_; };
John Zulauf8eda1562021-04-13 17:06:41 -06001220
John Zulauf3d84f1b2020-03-09 13:33:25 -06001221 private:
John Zulaufbb890452021-12-14 11:30:18 -07001222 // As this is passing around a shared pointer to record, move to avoid needless atomics.
1223 void RecordSyncOp(SyncOpPointer &&sync_op);
John Zulauf4fa68462021-04-26 21:04:22 -06001224 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1225 VkQueueFlags queue_flags_;
1226 bool destroyed_;
1227
John Zulauf3c788ef2022-02-22 12:12:30 -07001228 AccessLog access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001229 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001230 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001231 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001232 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001233
John Zulauf355e49b2020-04-24 15:11:15 -06001234 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001235 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001236 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001237
1238 // Don't need the following for an active proxy cb context
1239 std::vector<RenderPassAccessContext> render_pass_contexts_;
1240 RenderPassAccessContext *current_renderpass_context_;
1241 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001242};
1243
John Zulauf697c0e12022-04-19 16:31:12 -06001244class QueueSyncState;
1245
1246// Store the ResourceUsageRecords for the global tag range. The prev_ field allows for
1247// const Validation phase access from the cmd state "overlay" seamlessly.
1248class AccessLogger {
1249 public:
1250 struct BatchRecord {
1251 BatchRecord() = default;
1252 BatchRecord(const BatchRecord &other) = default;
1253 BatchRecord(BatchRecord &&other) = default;
1254 BatchRecord(const QueueSyncState *q, uint64_t submit, uint32_t batch)
1255 : queue(q), submit_index(submit), batch_index(batch) {}
1256 BatchRecord &operator=(const BatchRecord &other) = default;
1257 const QueueSyncState *queue;
1258 uint64_t submit_index;
1259 uint32_t batch_index;
1260 };
1261
1262 struct AccessRecord {
1263 const BatchRecord *batch;
1264 const ResourceUsageRecord *record;
1265 bool IsValid() const { return batch && record; }
1266 };
1267
1268 // BatchLog lookup is batch relative, thus the batch doesn't need to track it's offset
1269 class BatchLog {
1270 public:
1271 BatchLog() = default;
1272 BatchLog(const BatchLog &batch) = default;
1273 BatchLog(BatchLog &&other) = default;
1274 BatchLog &operator=(const BatchLog &other) = default;
1275 BatchLog &operator=(BatchLog &&other) = default;
1276 BatchLog(const BatchRecord &batch) : batch_(batch) {}
1277
1278 size_t Size() const { return log_.size(); }
1279 const BatchRecord &GetBatch() const { return batch_; }
1280 AccessRecord operator[](size_t index) const;
1281
1282 void Append(const CommandExecutionContext::AccessLog &other);
1283
1284 private:
1285 BatchRecord batch_;
1286 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
1287 CommandExecutionContext::AccessLog log_;
1288 };
1289
1290 using AccessLogRangeMap = sparse_container::range_map<ResourceUsageTag, BatchLog>;
1291
1292 AccessLogger(const AccessLogger *prev = nullptr) : prev_(prev) {}
1293 // AccessLogger lookup is based on global tags
1294 AccessRecord operator[](ResourceUsageTag tag) const;
1295 BatchLog *AddBatch(const QueueSyncState *queue_state, uint64_t submit_id, uint32_t batch_id, const ResourceUsageRange &range);
1296 void MergeMove(AccessLogger &&child);
1297 void Reset();
1298
1299 private:
1300 const AccessLogger *prev_;
1301 AccessLogRangeMap access_log_map_;
1302};
1303
1304class SemaphoreSyncState;
John Zulaufcb7e1672022-05-04 13:46:08 -06001305class SignaledSemaphores;
John Zulauf697c0e12022-04-19 16:31:12 -06001306// TODO need a map from fence to submbit batch id
1307class QueueBatchContext : public CommandExecutionContext {
1308 public:
John Zulauf1d5f9c12022-05-13 14:51:08 -06001309 using ConstBatchSet = layer_data::unordered_set<std::shared_ptr<const QueueBatchContext>>;
1310 using BatchSet = layer_data::unordered_set<std::shared_ptr<QueueBatchContext>>;
1311 static constexpr bool TruePred(const std::shared_ptr<const QueueBatchContext> &) { return true; }
John Zulauf697c0e12022-04-19 16:31:12 -06001312 struct CmdBufferEntry {
1313 uint32_t index = 0;
1314 std::shared_ptr<const CommandBufferAccessContext> cb;
1315 CmdBufferEntry(uint32_t index_, std::shared_ptr<const CommandBufferAccessContext> &&cb_)
1316 : index(index_), cb(std::move(cb_)) {}
1317 };
John Zulauf1d5f9c12022-05-13 14:51:08 -06001318
1319 // For Wait operations we have to
1320 struct QueueWormBase {
1321 std::vector<AccessContext::AddressRange> erase_list;
1322 bool erase_all = true;
1323 };
1324
1325 struct QueueWaitWorm : QueueWormBase {
1326 ResourceAccessState::QueuePredicate predicate;
1327 QueueWaitWorm(QueueId queue_, ResourceUsageTag tag_ = ResourceUsageRecord::kMaxIndex);
1328 void operator()(AccessAddressType address_type, ResourceAccessRangeMap::value_type &access);
1329 };
1330
John Zulauf697c0e12022-04-19 16:31:12 -06001331 using CommandBuffers = std::vector<CmdBufferEntry>;
1332
1333 std::string FormatUsage(ResourceUsageTag tag) const override;
1334 AccessContext *GetCurrentAccessContext() override { return &access_context_; }
1335 const AccessContext *GetCurrentAccessContext() const override { return &access_context_; }
1336 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1337 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1338 const QueueSyncState *GetQueueSyncState() const { return queue_state_; }
1339 VkQueueFlags GetQueueFlags() const;
John Zulauf00119522022-05-23 19:07:42 -06001340 QueueId GetQueueId() const override;
John Zulauf697c0e12022-04-19 16:31:12 -06001341
1342 void SetBatchLog(AccessLogger &loggger, uint64_t sumbit_id, uint32_t batch_id);
1343 void ResetAccessLog() {
1344 logger_ = nullptr;
1345 batch_log_ = nullptr;
1346 }
1347 ResourceUsageTag GetTagLimit() const override { return batch_log_->Size() + tag_range_.begin; }
1348 // begin is the tag bias / .size() is the number of total records that should eventually be in access_log_
1349 ResourceUsageRange GetTagRange() const { return tag_range_; }
1350 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
1351
1352 void SetTagBias(ResourceUsageTag);
1353 CommandBuffers::const_iterator begin() const { return command_buffers_.cbegin(); }
1354 CommandBuffers::const_iterator end() const { return command_buffers_.cend(); }
1355
John Zulaufcb7e1672022-05-04 13:46:08 -06001356 QueueBatchContext(const SyncValidator &sync_state, const QueueSyncState &queue_state);
John Zulauf697c0e12022-04-19 16:31:12 -06001357 QueueBatchContext() = delete;
1358
John Zulaufcb7e1672022-05-04 13:46:08 -06001359 template <typename BatchInfo>
1360 void Setup(const std::shared_ptr<const QueueBatchContext> &prev_batch, const BatchInfo &batch_info,
1361 SignaledSemaphores &signaled);
1362
John Zulauf1d5f9c12022-05-13 14:51:08 -06001363 void ResolveSubmittedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
1364
John Zulauf697c0e12022-04-19 16:31:12 -06001365 VulkanTypedHandle Handle() const override;
1366
1367 template <typename BatchInfo, typename Fn>
1368 static void ForEachWaitSemaphore(const BatchInfo &batch_info, Fn &&func);
1369
John Zulauf1d5f9c12022-05-13 14:51:08 -06001370 void ApplyTaggedWait(QueueId queue_id, ResourceUsageTag tag);
1371 void ApplyDeviceWait();
1372
John Zulauf697c0e12022-04-19 16:31:12 -06001373 private:
1374 using WaitBatchMap = layer_data::unordered_map<const QueueBatchContext *, AccessContext::TrackBack *>;
1375
1376 // The BatchInfo is either the Submit or Submit2 version with traits allowing generic acces
1377 template <typename BatchInfo>
1378 class SubmitInfoAccessor {};
1379 template <typename BatchInfo>
John Zulaufcb7e1672022-05-04 13:46:08 -06001380 void SetupAccessContext(const std::shared_ptr<const QueueBatchContext> &prev, const BatchInfo &batch_info,
1381 SignaledSemaphores &signaled_semaphores);
John Zulauf697c0e12022-04-19 16:31:12 -06001382 template <typename BatchInfo>
1383 void SetupCommandBufferInfo(const BatchInfo &batch_info);
1384
John Zulaufcb7e1672022-05-04 13:46:08 -06001385 void WaitOneSemaphore(VkSemaphore sem, VkPipelineStageFlags2 wait_mask, WaitBatchMap &batch_trackbacks,
1386 SignaledSemaphores &signaled);
John Zulauf697c0e12022-04-19 16:31:12 -06001387
1388 const QueueSyncState *queue_state_ = nullptr;
1389 ResourceUsageRange tag_range_ = ResourceUsageRange(0, 0); // Range of tags referenced by cbs_referenced
1390
1391 AccessContext access_context_;
1392 SyncEventsContext events_context_;
1393
1394 // Clear these after validation and import
1395 CommandBuffers command_buffers_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001396 ConstBatchSet async_batches_;
John Zulauf697c0e12022-04-19 16:31:12 -06001397 // When null use the global logger
1398 AccessLogger *logger_ = nullptr;
1399 AccessLogger::BatchLog *batch_log_ = nullptr;
1400};
John Zulaufbbda4572022-04-19 16:20:45 -06001401
1402class QueueSyncState {
1403 public:
John Zulauf1d5f9c12022-05-13 14:51:08 -06001404 constexpr static QueueId kQueueIdBase = QueueId(0);
1405 constexpr static QueueId kQueueIdInvalid = ~kQueueIdBase;
1406 QueueSyncState(const std::shared_ptr<QUEUE_STATE> &queue_state, VkQueueFlags queue_flags, QueueId id)
1407 : submit_index_(0), queue_state_(queue_state), last_batch_(), queue_flags_(queue_flags), id_(id) {}
John Zulaufbbda4572022-04-19 16:20:45 -06001408
1409 VulkanTypedHandle Handle() const {
1410 if (queue_state_) {
1411 return queue_state_->Handle();
1412 }
1413 return VulkanTypedHandle(static_cast<VkQueue>(VK_NULL_HANDLE), kVulkanObjectTypeQueue);
1414 }
1415 std::shared_ptr<const QueueBatchContext> LastBatch() const { return last_batch_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001416 std::shared_ptr<QueueBatchContext> LastBatch() { return last_batch_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001417 void SetLastBatch(std::shared_ptr<QueueBatchContext> &&last);
John Zulaufbbda4572022-04-19 16:20:45 -06001418 QUEUE_STATE *GetQueueState() { return queue_state_.get(); }
1419 const QUEUE_STATE *GetQueueState() const { return queue_state_.get(); }
1420 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001421 QueueId GetQueueId() const { return id_; }
John Zulaufbbda4572022-04-19 16:20:45 -06001422
John Zulauf697c0e12022-04-19 16:31:12 -06001423 uint64_t ReserveSubmitId() const; // Method is const but updates mutable sumbit_index atomically.
1424
John Zulaufbbda4572022-04-19 16:20:45 -06001425 private:
1426 mutable std::atomic<uint64_t> submit_index_;
1427 std::shared_ptr<QUEUE_STATE> queue_state_;
1428 std::shared_ptr<QueueBatchContext> last_batch_;
1429 const VkQueueFlags queue_flags_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001430 QueueId id_;
John Zulaufbbda4572022-04-19 16:20:45 -06001431};
1432
John Zulaufcb7e1672022-05-04 13:46:08 -06001433class SignaledSemaphores {
John Zulaufbbda4572022-04-19 16:20:45 -06001434 public:
John Zulaufcb7e1672022-05-04 13:46:08 -06001435 // Is the record of a signaled semaphore, deleted when unsignaled
1436 struct Signal {
1437 Signal() = delete;
1438 Signal(const Signal &other) = default;
1439 Signal(Signal &&other) = default;
1440 Signal &operator=(const Signal &other) = default;
1441 Signal &operator=(Signal &&other) = default;
1442 Signal(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state_, const std::shared_ptr<QueueBatchContext> &batch_,
1443 const SyncExecScope &exec_scope_)
1444 : sem_state(sem_state_), batch(batch_), exec_scope(exec_scope_) {
1445 // Illegal to create a signal from no batch and an invalid semaphore... caller must assure validity
1446 assert(batch);
1447 assert(sem_state);
1448 }
1449
1450 std::shared_ptr<const SEMAPHORE_STATE> sem_state;
1451 std::shared_ptr<QueueBatchContext> batch;
1452 // Use the SyncExecScope::valid_accesses for first access scope
1453 SyncExecScope exec_scope;
1454 // TODO add timeline semaphore support.
1455 };
1456 using SignalMap = layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>>;
1457 using iterator = SignalMap::iterator;
1458 iterator begin() { return signaled_.begin(); }
1459 iterator end() { return signaled_.end(); }
1460
1461 bool SignalSemaphore(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state, const std::shared_ptr<QueueBatchContext> &batch,
1462 const VkSemaphoreSubmitInfo &signal_info);
1463 std::shared_ptr<Signal> Unsignal(VkSemaphore);
1464 void Import(VkSemaphore sem, std::shared_ptr<Signal> &&move_from);
John Zulauf697c0e12022-04-19 16:31:12 -06001465 void Reset();
John Zulauf00119522022-05-23 19:07:42 -06001466 SignaledSemaphores() : prev_(nullptr) {}
1467 SignaledSemaphores(const SignaledSemaphores &prev) : prev_(&prev) {}
John Zulaufbbda4572022-04-19 16:20:45 -06001468
1469 private:
John Zulaufcb7e1672022-05-04 13:46:08 -06001470 std::shared_ptr<Signal> GetPrev(VkSemaphore sem) const;
1471 layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>> signaled_;
1472 const SignaledSemaphores *prev_; // Allowing this type to act as a writable overlay
John Zulaufbbda4572022-04-19 16:20:45 -06001473};
1474
John Zulauf9cb530d2019-09-30 14:14:10 -06001475class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1476 public:
John Zulauf9cb530d2019-09-30 14:14:10 -06001477 using StateTracker = ValidationStateTracker;
John Zulaufea943c52022-02-22 11:05:17 -07001478 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
John Zulauf888bb9d2022-05-20 16:13:00 -06001479 virtual ~SyncValidator() { ResetCommandBufferCallbacks(); };
John Zulauf9cb530d2019-09-30 14:14:10 -06001480
John Zulauf697c0e12022-04-19 16:31:12 -06001481 // Global tag range for submitted command buffers resource usage logs
1482 mutable std::atomic<ResourceUsageTag> tag_limit_{0}; // This is reserved in Validation phase, thus mutable and atomic
1483 ResourceUsageRange ReserveGlobalTagRange(size_t tag_count) const; // Note that the tag_limit_ is mutable this has side effects
1484 // This is a snapshot value only
John Zulauf697c0e12022-04-19 16:31:12 -06001485 AccessLogger global_access_log_;
1486
John Zulaufea943c52022-02-22 11:05:17 -07001487 layer_data::unordered_map<VkCommandBuffer, std::shared_ptr<CommandBufferAccessContext>> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001488
John Zulauf1d5f9c12022-05-13 14:51:08 -06001489 using QueueSyncStatesMap = layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>>;
John Zulaufbbda4572022-04-19 16:20:45 -06001490 layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>> queue_sync_states_;
John Zulaufcb7e1672022-05-04 13:46:08 -06001491 SignaledSemaphores signaled_semaphores_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001492
John Zulaufbbda4572022-04-19 16:20:45 -06001493 const QueueSyncState *GetQueueSyncState(VkQueue queue) const;
1494 QueueSyncState *GetQueueSyncState(VkQueue queue);
1495 std::shared_ptr<const QueueSyncState> GetQueueSyncStateShared(VkQueue queue) const;
1496 std::shared_ptr<QueueSyncState> GetQueueSyncStateShared(VkQueue queue);
1497
John Zulauf1d5f9c12022-05-13 14:51:08 -06001498 template <typename Predicate>
1499 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot(Predicate &&pred) const;
1500 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot() const {
1501 return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred);
1502 };
1503
1504 template <typename Predicate>
1505 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot(Predicate &&pred);
1506 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot() { return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred); };
John Zulaufbbda4572022-04-19 16:20:45 -06001507
1508 std::shared_ptr<CommandBufferAccessContext> AccessContextFactory(VkCommandBuffer command_buffer);
John Zulaufea943c52022-02-22 11:05:17 -07001509 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer);
1510 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer);
1511 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const;
1512 std::shared_ptr<CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer);
1513 std::shared_ptr<const CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001514
John Zulaufd1f85d42020-04-15 12:23:15 -06001515 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1516 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001517 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001518 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001519 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001520 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1521 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001522 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001523
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001524 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001525
John Zulauf355e49b2020-04-24 15:11:15 -06001526 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001527 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001528
1529 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001530 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001531
1532 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001533 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001534
1535 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001536 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001537
John Zulauf9cb530d2019-09-30 14:14:10 -06001538 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001539 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001540
1541 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001542 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001543
John Zulauf4a6105a2020-11-17 15:11:05 -07001544 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001545 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001546 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1547 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001548
Tony-LunarGef035472021-11-02 10:23:33 -06001549 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001550 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001551 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001552
John Zulauf5c5e88d2019-12-26 11:22:02 -07001553 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1554 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001555 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001556
1557 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001558 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001559
Tony-LunarGb61514a2021-11-02 12:36:51 -06001560 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001561 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001562 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001563
Tony-LunarGb61514a2021-11-02 12:36:51 -06001564 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001565 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001566 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001567
John Zulauf9cb530d2019-09-30 14:14:10 -06001568 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1569 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1570 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1571 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1572 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001573 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001574
1575 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1576 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1577 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1578 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001579 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001580
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001581 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1582 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001583 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001584 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001585 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001586
John Zulauf3d84f1b2020-03-09 13:33:25 -06001587 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001588 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001589
1590 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001591 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001592 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001593 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001594 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001595 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001596
Mike Schuchardt2df08912020-12-15 16:28:09 -08001597 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001598 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001599 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001600 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1601 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1602 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1603 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001604
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001605 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001606 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001607 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001608 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001609 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001610
sfricke-samsung85584a72021-09-30 21:43:38 -07001611 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001612 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001613 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1614 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001615
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001616 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1617 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1618 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001619
sfricke-samsung71f04e32022-03-16 01:21:21 -05001620 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001621 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001622 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001623 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001624 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1625 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001626 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001627 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001628 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001629 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1630 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001631
sfricke-samsung71f04e32022-03-16 01:21:21 -05001632 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001633 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001634 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001635 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001636 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001637 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001638 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001639 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001640 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1641 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001642
sfricke-samsung71f04e32022-03-16 01:21:21 -05001643 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001644 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001645 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001646 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001647 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001648 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001649 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001650 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001651 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1652 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001653
sfricke-samsung71f04e32022-03-16 01:21:21 -05001654 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001655 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001656 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001657 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001658 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001659 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001660 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001661 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1662 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001663
1664 template <typename RegionType>
1665 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1666 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1667 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001668
1669 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1670 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001671 const VkImageBlit *pRegions, VkFilter filter) const override;
1672 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001673 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001674
Jeff Leger178b1e52020-10-05 12:22:23 -04001675 template <typename RegionType>
1676 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1677 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1678 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001679 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1680 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001681 VkFilter filter) override;
1682 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001683 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001684
John Zulauffaea0ee2021-01-14 14:01:32 -07001685 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1686 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1687 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001688 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001689 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1690 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001691
John Zulauffaea0ee2021-01-14 14:01:32 -07001692 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1693 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001694 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001695
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001696 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1697 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001698
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001699 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1700 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001701
1702 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001703 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001704 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001705 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001706
1707 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001708 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001709 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001710 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001711
1712 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001713 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001714 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001715 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001716
1717 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001718 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001719 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001720 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001721
locke-lunargff255f92020-05-13 18:53:52 -06001722 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1723 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1724 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001725 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1726 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001727 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001728 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1729 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001730 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1731 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001732 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001733 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1734 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001735 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001736 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1737 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001738 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001739 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1740 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001741 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001742 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1743 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001744 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001745
locke-lunargff255f92020-05-13 18:53:52 -06001746 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1747 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1748 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001749 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1750 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001751 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001752 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1753 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1754 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001755 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1756 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001757 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001758 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1759 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001760 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001761 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1762 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001763 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001764 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1765 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001766 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001767 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1768 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001769 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001770
1771 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1772 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001773 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001774 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1775 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001776 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001777
1778 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1779 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001780 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001781 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1782 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001783 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001784
1785 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1786 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001787 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001788 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1789 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001790 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001791
1792 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001793 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001794 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001795 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001796
1797 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1798 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001799 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001800
locke-lunarge1a67022020-04-29 00:15:36 -06001801 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1802 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001803 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001804
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001805 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001806 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1807 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001808 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001809 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1810 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001811
locke-lunarge1a67022020-04-29 00:15:36 -06001812 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001813 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001814 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001815 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001816
1817 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001818 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001819 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001820 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001821
1822 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1823 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1824
John Zulauf4edde622021-02-15 08:54:50 -07001825 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1826 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001827 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1828 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001829 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1830 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001831 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001832
John Zulauf49beb112020-11-04 16:06:31 -07001833 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1834 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1835
John Zulauf4edde622021-02-15 08:54:50 -07001836 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1837 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001838 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1839 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001840 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001841 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001842
John Zulauf49beb112020-11-04 16:06:31 -07001843 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1844 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1845 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1846 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1847 uint32_t imageMemoryBarrierCount,
1848 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1849 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1850 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1851 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1852 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1853 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001854 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1855 const VkDependencyInfoKHR *pDependencyInfos) const override;
1856 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1857 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001858 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1859 const VkDependencyInfo *pDependencyInfos) const override;
1860 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1861 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001862 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1863 VkDeviceSize dstOffset, uint32_t marker) const override;
1864 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1865 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001866 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1867 const VkCommandBuffer *pCommandBuffers) const override;
1868 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1869 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001870 void PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) override;
1871 void PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) override;
John Zulaufbbda4572022-04-19 16:20:45 -06001872 bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1873 VkFence fence) const override;
1874 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence,
1875 VkResult result) override;
1876 bool PreCallValidateQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1877 VkFence fence) const override;
1878 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence,
1879 VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001880};