blob: c10fa78d790fc3e69f40b05dec1712a2b66da725 [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 Zulauf8a7b03d2022-09-20 11:41:19 -060026#include <set>
John Zulauf9cb530d2019-09-30 14:14:10 -060027#include <vulkan/vulkan.h>
28
29#include "synchronization_validation_types.h"
30#include "state_tracker.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060031#include "cmd_buffer_state.h"
32#include "render_pass_state.h"
John Zulauf9cb530d2019-09-30 14:14:10 -060033
John Zulaufd5115702021-01-18 12:34:33 -070034class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070035class CommandBufferAccessContext;
John Zulauf64ffe552021-02-06 10:25:07 -070036class CommandExecutionContext;
John Zulaufecf4ac52022-06-06 10:08:42 -060037class QueueBatchContext;
John Zulaufa8700a52022-08-18 16:22:08 -060038struct QueueSubmitCmdState;
John Zulaufdab327f2022-07-08 12:02:05 -060039class RenderPassAccessContext;
John Zulaufd5115702021-01-18 12:34:33 -070040class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060041struct ResourceFirstAccess;
John Zulaufe0757ba2022-06-10 16:51:45 -060042class SyncEventsContext;
43struct SyncEventState;
John Zulaufd5115702021-01-18 12:34:33 -070044class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060045
John Zulaufd0ec59f2021-03-13 14:25:08 -070046using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
47using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
48
John Zulaufecf4ac52022-06-06 10:08:42 -060049using QueueId = uint32_t;
50
John Zulauf2f952d22020-02-10 11:34:51 -070051enum SyncHazard {
52 NONE = 0,
53 READ_AFTER_WRITE,
54 WRITE_AFTER_READ,
55 WRITE_AFTER_WRITE,
56 READ_RACING_WRITE,
57 WRITE_RACING_WRITE,
58 WRITE_RACING_READ,
59};
John Zulauf9cb530d2019-09-30 14:14:10 -060060
John Zulauf8e3c3e92021-01-06 11:19:36 -070061enum class SyncOrdering : uint8_t {
62 kNonAttachment = 0,
63 kColorAttachment = 1,
64 kDepthStencilAttachment = 2,
65 kRaster = 3,
66 kNumOrderings = 4,
67};
68
John Zulauf9cb530d2019-09-30 14:14:10 -060069// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
70struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070071 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060072 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
73 }
John Zulauf1507ee42020-05-18 11:33:09 -060074 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
75 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
76 }
John Zulauf9cb530d2019-09-30 14:14:10 -060077
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070078 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060079 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
80
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070081 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
82 return (stage_access_bit & syncStageAccessWriteMask).any();
83 }
84 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
85 return (stage_access_mask & syncStageAccessWriteMask).any();
86 }
John Zulauf9cb530d2019-09-30 14:14:10 -060087 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070088 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060089 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
90 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070091 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
92 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
93 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
94 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060095 return stage_scope & AccessScopeByAccess(accesses);
96 }
97};
98
John Zulauf14940722021-04-12 15:19:02 -060099struct ResourceUsageRecord {
John Zulauf41a9c7c2021-12-07 15:59:53 -0700100 enum class SubcommandType { kNone, kSubpassTransition, kLoadOp, kStoreOp, kResolveOp, kIndex };
101
John Zulauf14940722021-04-12 15:19:02 -0600102 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -0700103 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -0700104 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -0600105 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -0700106 CMD_TYPE command = CMD_NONE;
107 Count seq_num = 0U;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700108 SubcommandType sub_command_type = SubcommandType::kNone;
John Zulauffaea0ee2021-01-14 14:01:32 -0700109 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600110
111 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
112 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600113 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 -0600114 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700115
John Zulauf14940722021-04-12 15:19:02 -0600116 ResourceUsageRecord() = default;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700117 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, SubcommandType sub_type_, Count sub_command_,
118 const CMD_BUFFER_STATE *cb_state_, Count reset_count_)
119 : command(command_),
120 seq_num(seq_num_),
121 sub_command_type(sub_type_),
122 sub_command(sub_command_),
123 cb_state(cb_state_),
124 reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600125};
126
John Zulauf3c2a0b32021-07-14 11:14:52 -0600127// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600128using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulauf8a7b03d2022-09-20 11:41:19 -0600129using ResourceUsageTagSet = std::set<ResourceUsageTag>;
John Zulaufae842002021-04-15 18:20:55 -0600130using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600131
John Zulauf9cb530d2019-09-30 14:14:10 -0600132struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600133 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600134 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600135 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600136 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600137 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600138 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600139 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600140 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600141 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulaufe0757ba2022-06-10 16:51:45 -0600142 bool IsHazard() const { return NONE != hazard; }
John Zulauf9cb530d2019-09-30 14:14:10 -0600143};
144
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700145struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700146 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
147 VkPipelineStageFlags2KHR
148 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
149 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 -0700150 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
151
152 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
153
John Zulauf06f6f1e2022-04-19 15:28:11 -0600154 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask,
155 const VkPipelineStageFlags2KHR disabled_feature_mask = 0);
Jeremy Gebben40a22942020-12-22 14:22:06 -0700156 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700157};
158
John Zulauf3d84f1b2020-03-09 13:33:25 -0600159struct SyncBarrier {
John Zulaufecf4ac52022-06-06 10:08:42 -0600160 struct AllAccess {};
John Zulaufc523bf62021-02-16 08:20:34 -0700161 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600162 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700163 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600164 SyncStageAccessFlags dst_access_scope;
165 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700166 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600167 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700168
169 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufecf4ac52022-06-06 10:08:42 -0600170 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst, const AllAccess &);
John Zulauf06f6f1e2022-04-19 15:28:11 -0600171 SyncBarrier(const SyncExecScope &src_exec, const SyncStageAccessFlags &src_access, const SyncExecScope &dst_exec,
172 const SyncStageAccessFlags &dst_access)
173 : 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 -0700174
175 template <typename Barrier>
176 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
177
178 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700179 // template constructor for sync2 barriers
180 template <typename Barrier>
181 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700182
John Zulaufa0a98292020-09-18 09:30:10 -0600183 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700184 // Note that after merge, only the exec_scope and access_scope fields are fully valid
185 // TODO: Do we need to update any of the other fields? Merging has limited application.
186 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600187 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700188 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600189 dst_access_scope |= other.dst_access_scope;
190 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600191};
John Zulauf69133422020-05-20 14:55:53 -0600192
John Zulauf43cc7462020-12-03 12:33:12 -0700193enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
194
John Zulaufecf4ac52022-06-06 10:08:42 -0600195struct SemaphoreScope : SyncExecScope {
196 SemaphoreScope(QueueId qid, const SyncExecScope &exec_scope) : SyncExecScope(exec_scope), queue(qid) {}
197 SemaphoreScope() = default;
198 QueueId queue;
199};
200
201class SignaledSemaphores {
202 public:
203 // Is the record of a signaled semaphore, deleted when unsignaled
204 struct Signal {
205 Signal() = delete;
206 Signal(const Signal &other) = default;
207 Signal(Signal &&other) = default;
208 Signal &operator=(const Signal &other) = default;
209 Signal &operator=(Signal &&other) = default;
210 Signal(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state_, const std::shared_ptr<QueueBatchContext> &batch_,
211 const SyncExecScope &exec_scope_);
212
213 std::shared_ptr<const SEMAPHORE_STATE> sem_state;
214 std::shared_ptr<QueueBatchContext> batch;
215 // Use the SyncExecScope::valid_accesses for first access scope
216 SemaphoreScope first_scope;
217 // TODO add timeline semaphore support.
218 };
219 using SignalMap = layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>>;
220 using iterator = SignalMap::iterator;
John Zulaufe0757ba2022-06-10 16:51:45 -0600221 using const_iterator = SignalMap::const_iterator;
222 using mapped_type = SignalMap::mapped_type;
John Zulaufecf4ac52022-06-06 10:08:42 -0600223 iterator begin() { return signaled_.begin(); }
John Zulaufe0757ba2022-06-10 16:51:45 -0600224 const_iterator begin() const { return signaled_.begin(); }
John Zulaufecf4ac52022-06-06 10:08:42 -0600225 iterator end() { return signaled_.end(); }
John Zulaufe0757ba2022-06-10 16:51:45 -0600226 const_iterator end() const { return signaled_.end(); }
John Zulaufecf4ac52022-06-06 10:08:42 -0600227
228 bool SignalSemaphore(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state, const std::shared_ptr<QueueBatchContext> &batch,
229 const VkSemaphoreSubmitInfo &signal_info);
230 std::shared_ptr<const Signal> Unsignal(VkSemaphore);
231 void Import(VkSemaphore sem, std::shared_ptr<Signal> &&move_from);
232 void Reset();
233 SignaledSemaphores() : prev_(nullptr) {}
234 SignaledSemaphores(const SignaledSemaphores &prev) : prev_(&prev) {}
235
236 private:
237 std::shared_ptr<const Signal> GetPrev(VkSemaphore sem) const;
238 layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>> signaled_;
239 const SignaledSemaphores *prev_; // Allowing this type to act as a writable overlay
240};
241
John Zulauf4fa68462021-04-26 21:04:22 -0600242struct ResourceFirstAccess {
243 ResourceUsageTag tag;
244 SyncStageAccessIndex usage_index;
245 SyncOrdering ordering_rule;
246 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
247 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
248 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
249 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
250 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
251 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
252 bool operator==(const ResourceFirstAccess &rhs) const {
253 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
254 }
255};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600256
John Zulauf1d5f9c12022-05-13 14:51:08 -0600257using QueueId = uint32_t;
John Zulauf9cb530d2019-09-30 14:14:10 -0600258class ResourceAccessState : public SyncStageAccess {
259 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700260 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700261 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700262 SyncStageAccessFlags access_scope;
263 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700264 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700265 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700266 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600267 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
268 exec_scope |= rhs.exec_scope;
269 access_scope |= rhs.access_scope;
270 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700271 }
John Zulauf8a7b03d2022-09-20 11:41:19 -0600272 bool operator==(const OrderingBarrier &rhs) const {
273 return (exec_scope == rhs.exec_scope) && (access_scope == rhs.access_scope);
274 }
John Zulauffaea0ee2021-01-14 14:01:32 -0700275 };
John Zulauf4fa68462021-04-26 21:04:22 -0600276 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
277 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700278
John Zulauf8a7b03d2022-09-20 11:41:19 -0600279 public:
John Zulauf9cb530d2019-09-30 14:14:10 -0600280 // Mutliple read operations can be simlutaneously (and independently) synchronized,
281 // given the only the second execution scope creates a dependency chain, we have to track each,
282 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
283 // and applicable one for hazard detection
284 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700285 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600286 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600287 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700288 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf1d5f9c12022-05-13 14:51:08 -0600289 VkPipelineStageFlags2KHR sync_stages; // reads known to have happened after this
John Zulauf9cb530d2019-09-30 14:14:10 -0600290 ResourceUsageTag tag;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600291 QueueId queue;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700292 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
293 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600294 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700295 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf1d5f9c12022-05-13 14:51:08 -0600296 ResourceUsageTag tag_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600297 bool operator==(const ReadState &rhs) const {
John Zulauf8a7b03d2022-09-20 11:41:19 -0600298 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) &&
299 (sync_stages == rhs.sync_stages) && (tag == rhs.tag) && (queue == rhs.queue) &&
300 (pending_dep_chain == rhs.pending_dep_chain);
John Zulaufe5da6e52020-03-18 15:32:18 -0600301 return same;
302 }
John Zulauf8a7b03d2022-09-20 11:41:19 -0600303 void Normalize() { pending_dep_chain = VK_PIPELINE_STAGE_2_NONE; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700304 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700305 // If the read stage is not in the src sync scope
306 // *AND* not execution chained with an existing sync barrier (that's the or)
307 // then the barrier access is unsafe (R/W after R)
308 return (src_exec_scope & (stage | barriers)) == 0;
309 }
John Zulaufe0757ba2022-06-10 16:51:45 -0600310 bool IsReadBarrierHazard(QueueId barrier_queue, VkPipelineStageFlags2KHR src_exec_scope) const {
311 // If the read stage is not in the src sync scope
312 // *AND* not execution chained with an existing sync barrier (that's the or)
313 // then the barrier access is unsafe (R/W after R)
314 VkPipelineStageFlags2 queue_ordered_stage = (queue == barrier_queue) ? stage : VK_PIPELINE_STAGE_2_NONE;
315 return (src_exec_scope & (queue_ordered_stage | barriers)) == 0;
316 }
John Zulauf4a6105a2020-11-17 15:11:05 -0700317
John Zulaufe5da6e52020-03-18 15:32:18 -0600318 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
John Zulaufee984022022-04-13 16:39:50 -0600319 void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
320 ResourceUsageTag tag_);
John Zulaufb7578302022-05-19 13:50:18 -0600321 bool ReadInScopeOrChain(VkPipelineStageFlags2 exec_scope) const { return (exec_scope & (stage | barriers)) != 0; }
John Zulauf00119522022-05-23 19:07:42 -0600322 bool ReadInQueueScopeOrChain(QueueId queue, VkPipelineStageFlags2 exec_scope) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600323 bool ReadInEventScope(VkPipelineStageFlags2 exec_scope, QueueId scope_queue, ResourceUsageTag scope_tag) const {
John Zulaufb7578302022-05-19 13:50:18 -0600324 // If this read is the same one we included in the set event and in scope, then apply the execution barrier...
325 // NOTE: That's not really correct... this read stage might *not* have been included in the setevent, and the barriers
326 // representing the chain might have changed since then (that would be an odd usage), so as a first approximation
327 // we'll assume the barriers *haven't* been changed since (if the tag hasn't), and while this could be a false
328 // positive in the case of Set; SomeBarrier; Wait; we'll live with it until we can add more state to the first scope
329 // capture (the specific write and read stages that *were* in scope at the moment of SetEvents.
John Zulaufe0757ba2022-06-10 16:51:45 -0600330 return (tag < scope_tag) && ReadInQueueScopeOrChain(scope_queue, exec_scope);
John Zulaufb7578302022-05-19 13:50:18 -0600331 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600332 };
333
John Zulauf9cb530d2019-09-30 14:14:10 -0600334 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulaufec943ec2022-06-29 07:52:56 -0600335 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, QueueId queue_id) const;
336 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering, QueueId queue_id) const;
337 HazardResult DetectHazard(const ResourceAccessState &recorded_use, QueueId queue_id, const ResourceUsageRange &tag_range) const;
John Zulaufae842002021-04-15 18:20:55 -0600338
339 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
340 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
341 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600342
John Zulaufec943ec2022-06-29 07:52:56 -0600343 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, QueueId queue_id, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700344 const SyncStageAccessFlags &source_access_scope) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600345 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, const ResourceAccessState &scope_state,
346 VkPipelineStageFlags2KHR source_exec_scope, const SyncStageAccessFlags &source_access_scope,
347 QueueId event_queue, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600348
John Zulauf14940722021-04-12 15:19:02 -0600349 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
350 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf1d5f9c12022-05-13 14:51:08 -0600351 void ClearWrite();
352 void ClearRead();
John Zulauf8a7b03d2022-09-20 11:41:19 -0600353 void ClearPending();
354 void ClearFirstUse();
John Zulauf5f13a792020-03-10 07:31:21 -0600355 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600356 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulaufbb890452021-12-14 11:30:18 -0700357 void ApplyBarriersImmediate(const std::vector<SyncBarrier> &barriers);
John Zulaufb7578302022-05-19 13:50:18 -0600358 template <typename ScopeOps>
359 void ApplyBarrier(ScopeOps &&scope, const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600360 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufecf4ac52022-06-06 10:08:42 -0600361 void ApplySemaphore(const SemaphoreScope &signal, const SemaphoreScope wait);
John Zulauf1d5f9c12022-05-13 14:51:08 -0600362
363 struct QueueTagPredicate {
364 QueueId queue;
365 ResourceUsageTag tag;
John Zulauf3da08bb2022-08-01 17:56:56 -0600366 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600367 };
368
369 struct QueuePredicate {
370 QueueId queue;
371 QueuePredicate(QueueId queue_) : queue(queue_) {}
John Zulauf3da08bb2022-08-01 17:56:56 -0600372 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600373 };
374 struct TagPredicate {
375 ResourceUsageTag tag;
John Zulauf3da08bb2022-08-01 17:56:56 -0600376 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600377 };
378
379 template <typename Pred>
380 bool ApplyQueueTagWait(Pred &&);
John Zulaufae842002021-04-15 18:20:55 -0600381 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600382
John Zulauf1d5f9c12022-05-13 14:51:08 -0600383 void OffsetTag(ResourceUsageTag offset);
384 ResourceAccessState();
John Zulauf9cb530d2019-09-30 14:14:10 -0600385
John Zulaufb02c1eb2020-10-06 16:33:36 -0600386 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700387 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600388 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600389 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600390 bool operator==(const ResourceAccessState &rhs) const {
John Zulauf8a7b03d2022-09-20 11:41:19 -0600391 const bool write_same = (read_execution_barriers == rhs.read_execution_barriers) &&
392 (input_attachment_read == rhs.input_attachment_read) && (write_barriers == rhs.write_barriers) &&
393 (write_dependency_chain == rhs.write_dependency_chain) && (last_write == rhs.last_write) &&
394 (write_tag == rhs.write_tag) && (write_queue == rhs.write_queue);
395
396 const bool read_write_same = write_same && (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages);
397
398 const bool same = read_write_same && (first_accesses_ == rhs.first_accesses_) &&
399 (first_read_stages_ == rhs.first_read_stages_) &&
400 (first_write_layout_ordering_ == rhs.first_write_layout_ordering_);
401
John Zulaufe5da6e52020-03-18 15:32:18 -0600402 return same;
403 }
404 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700405 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600406 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700407 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700408 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
409 }
John Zulauf1d5f9c12022-05-13 14:51:08 -0600410 void SetQueueId(QueueId id);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600411
John Zulauf00119522022-05-23 19:07:42 -0600412 bool WriteInChain(VkPipelineStageFlags2KHR src_exec_scope) const;
413 bool WriteInScope(const SyncStageAccessFlags &src_access_scope) const;
John Zulaufec943ec2022-06-29 07:52:56 -0600414 bool WriteBarrierInScope(const SyncStageAccessFlags &src_access_scope) const;
415 bool WriteInChainedScope(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const;
John Zulaufb7578302022-05-19 13:50:18 -0600416 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const;
John Zulauf00119522022-05-23 19:07:42 -0600417 bool WriteInQueueSourceScopeOrChain(QueueId queue, VkPipelineStageFlags2KHR src_exec_scope,
418 SyncStageAccessFlags src_access_scope) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600419 bool WriteInEventScope(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope,
420 QueueId scope_queue, ResourceUsageTag scope_tag) const;
John Zulaufb7578302022-05-19 13:50:18 -0600421
422 struct UntaggedScopeOps {
423 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
424 return access.WriteInSourceScopeOrChain(barrier.src_exec_scope.exec_scope, barrier.src_access_scope);
425 }
426 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
427 return read_state.ReadInScopeOrChain(barrier.src_exec_scope.exec_scope);
428 }
429 };
John Zulauf00119522022-05-23 19:07:42 -0600430
431 struct QueueScopeOps {
432 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
433 return access.WriteInQueueSourceScopeOrChain(queue, barrier.src_exec_scope.exec_scope, barrier.src_access_scope);
434 }
435 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
436 return read_state.ReadInQueueScopeOrChain(queue, barrier.src_exec_scope.exec_scope);
437 }
438 QueueScopeOps(QueueId scope_queue) : queue(scope_queue) {}
439 QueueId queue;
440 };
441
John Zulaufb7578302022-05-19 13:50:18 -0600442 struct EventScopeOps {
443 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
John Zulaufe0757ba2022-06-10 16:51:45 -0600444 return access.WriteInEventScope(barrier.src_exec_scope.exec_scope, barrier.src_access_scope, scope_queue, scope_tag);
John Zulaufb7578302022-05-19 13:50:18 -0600445 }
446 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
John Zulaufe0757ba2022-06-10 16:51:45 -0600447 return read_state.ReadInEventScope(barrier.src_exec_scope.exec_scope, scope_queue, scope_tag);
John Zulaufb7578302022-05-19 13:50:18 -0600448 }
John Zulaufe0757ba2022-06-10 16:51:45 -0600449 EventScopeOps(QueueId qid, ResourceUsageTag event_tag) : scope_queue(qid), scope_tag(event_tag) {}
450 QueueId scope_queue;
John Zulaufb7578302022-05-19 13:50:18 -0600451 ResourceUsageTag scope_tag;
452 };
453
John Zulauf8a7b03d2022-09-20 11:41:19 -0600454 void Normalize();
455 void GatherReferencedTags(ResourceUsageTagSet &used) const;
456
John Zulauf9cb530d2019-09-30 14:14:10 -0600457 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700458 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700459 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700460 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
John Zulaufec943ec2022-06-29 07:52:56 -0600461
John Zulauf7ad6a1d2022-09-02 11:46:33 -0600462 // Apply ordering scope to write hazard detection
463 bool IsOrderedWriteHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
464 // Must be neither in the access scope, nor in the chained access scope
465 return !WriteInScope(src_access_scope) && !WriteInChainedScope(src_exec_scope, src_access_scope);
John Zulaufec943ec2022-06-29 07:52:56 -0600466 }
467
468 bool IsWriteBarrierHazard(QueueId queue_id, VkPipelineStageFlags2KHR src_exec_scope,
469 const SyncStageAccessFlags &src_access_scope) const {
John Zulauf7ad6a1d2022-09-02 11:46:33 -0600470 // Special rules for sequential ILT's
John Zulaufa4bc6992022-08-29 14:37:20 -0600471 if (last_write == SYNC_IMAGE_LAYOUT_TRANSITION_BIT) {
John Zulauf7ad6a1d2022-09-02 11:46:33 -0600472 if (queue_id == write_queue) {
473 // In queue, they are implicitly ordered
474 return false;
475 } else {
476 // In dep chain means that the ILT is *available*
477 return !WriteInChain(src_exec_scope);
478 }
John Zulaufa4bc6992022-08-29 14:37:20 -0600479 }
John Zulauf7ad6a1d2022-09-02 11:46:33 -0600480 // Otherwise treat as an ordinary write hazard check with ordering rules.
481 return IsOrderedWriteHazard(src_exec_scope, src_access_scope);
John Zulauf4a6105a2020-11-17 15:11:05 -0700482 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700483 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700484 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
485 }
John Zulaufd14743a2020-07-03 09:42:39 -0600486
Jeremy Gebben40a22942020-12-22 14:22:06 -0700487 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600488 return stage_mask != (stage_mask & barriers);
489 }
490
Jeremy Gebben40a22942020-12-22 14:22:06 -0700491 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600492 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700493 }
John Zulaufec943ec2022-06-29 07:52:56 -0600494 VkPipelineStageFlags2 GetOrderedStages(QueueId queue_id, const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700495
John Zulauf14940722021-04-12 15:19:02 -0600496 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600497 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700498
John Zulauf8e3c3e92021-01-06 11:19:36 -0700499 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
500 return kOrderingRules[static_cast<size_t>(ordering_enum)];
501 }
John Zulaufd14743a2020-07-03 09:42:39 -0600502
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700503 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600504
John Zulauf9cb530d2019-09-30 14:14:10 -0600505 // With reads, each must be "safe" relative to it's prior write, so we need only
506 // save the most recent write operation (as anything *transitively* unsafe would arleady
507 // be included
508 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700509 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600510 ResourceUsageTag write_tag;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600511 QueueId write_queue;
John Zulauf355e49b2020-04-24 15:11:15 -0600512 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600513
John Zulauff51fbb62020-10-02 14:43:24 -0600514 // TODO Input Attachment cleanup for multiple reads in a given stage
515 // Tracks whether the fragment shader read is input attachment read
516 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600517
Jeremy Gebben40a22942020-12-22 14:22:06 -0700518 VkPipelineStageFlags2KHR last_read_stages;
519 VkPipelineStageFlags2KHR read_execution_barriers;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600520 using ReadStates = small_vector<ReadState, 3, uint32_t>;
521 ReadStates last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600522
523 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700524 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600525 bool pending_layout_transition;
526 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600527 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700528 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700529 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600530 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700531
532 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600533};
John Zulauf22aefed2021-03-11 18:14:35 -0700534using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
535using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600536
John Zulaufe0757ba2022-06-10 16:51:45 -0600537using ResourceAddress = VkDeviceSize;
538using ResourceAccessRangeMap = sparse_container::range_map<ResourceAddress, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700539using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700540using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600541using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600542
John Zulauf3da08bb2022-08-01 17:56:56 -0600543struct FenceSyncState {
544 std::shared_ptr<const FENCE_STATE> fence;
545 ResourceUsageTag tag;
546 QueueId queue_id;
547 FenceSyncState();
548 FenceSyncState(const FenceSyncState &other) = default;
549 FenceSyncState(FenceSyncState &&other) = default;
550 FenceSyncState &operator=(const FenceSyncState &other) = default;
551 FenceSyncState &operator=(FenceSyncState &&other) = default;
552
553 FenceSyncState(const std::shared_ptr<const FENCE_STATE> &fence_, ResourceUsageTag tag_, QueueId queue_id_)
554 : fence(fence_), tag(tag_), queue_id(queue_id_) {}
555};
556
John Zulaufd0ec59f2021-03-13 14:25:08 -0700557class AttachmentViewGen {
558 public:
559 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
560 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
561 AttachmentViewGen(const AttachmentViewGen &other) = default;
562 AttachmentViewGen(AttachmentViewGen &&other) = default;
563 AccessAddressType GetAddressType() const;
564 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
565 const ImageRangeGen *GetRangeGen(Gen type) const;
566 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
567 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
568
569 private:
570 using RangeGenStore = layer_data::optional<ImageRangeGen>;
571 const IMAGE_VIEW_STATE *view_ = nullptr;
572 VkImageAspectFlags view_mask_ = 0U;
573 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
574};
575
576using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
577
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700578using SyncMemoryBarrier = SyncBarrier;
579struct SyncBufferMemoryBarrier {
580 using Buffer = std::shared_ptr<const BUFFER_STATE>;
581 Buffer buffer;
582 SyncBarrier barrier;
583 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700584 bool IsLayoutTransition() const { return false; }
585 const ResourceAccessRange &Range() const { return range; };
586 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700587 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
588 : buffer(buffer_), barrier(barrier_), range(range_) {}
589 SyncBufferMemoryBarrier() = default;
590};
591
592struct SyncImageMemoryBarrier {
593 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600594
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700595 Image image;
596 uint32_t index;
597 SyncBarrier barrier;
598 VkImageLayout old_layout;
599 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600600 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700601
602 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600603 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700604 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700605 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
606 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
607 : image(image_),
608 index(index_),
609 barrier(barrier_),
610 old_layout(old_layout_),
611 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600612 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700613 SyncImageMemoryBarrier() = default;
614};
615
John Zulaufbb890452021-12-14 11:30:18 -0700616template <typename SubpassNode>
617struct SubpassBarrierTrackback {
618 std::vector<SyncBarrier> barriers;
619 const SubpassNode *source_subpass = nullptr;
620 SubpassBarrierTrackback() = default;
621 SubpassBarrierTrackback(const SubpassBarrierTrackback &) = default;
622 SubpassBarrierTrackback(const SubpassNode *source_subpass_, VkQueueFlags queue_flags_,
623 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
624 : barriers(), source_subpass(source_subpass_) {
625 barriers.reserve(subpass_dependencies_.size());
626 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
627 assert(dependency);
628 barriers.emplace_back(queue_flags_, *dependency);
629 }
630 }
John Zulauf06f6f1e2022-04-19 15:28:11 -0600631 SubpassBarrierTrackback(const SubpassNode *source_subpass_, const SyncBarrier &barrier_)
632 : barriers(1, barrier_), source_subpass(source_subpass_) {}
John Zulaufbb890452021-12-14 11:30:18 -0700633 SubpassBarrierTrackback &operator=(const SubpassBarrierTrackback &) = default;
634};
635
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700636class SyncOpBase {
637 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900638 SyncOpBase() : cmd_type_(CMD_NONE) {}
639 SyncOpBase(CMD_TYPE cmd_type) : cmd_type_(cmd_type) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600640 virtual ~SyncOpBase() = default;
641
sjfricke0bea06e2022-06-05 09:22:26 +0900642 const char *CmdName() const { return CommandTypeString(cmd_type_); }
John Zulaufbb890452021-12-14 11:30:18 -0700643
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700644 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulaufdab327f2022-07-08 12:02:05 -0600645 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600646 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600647 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const = 0;
648 virtual void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700649
650 protected:
John Zulaufbb890452021-12-14 11:30:18 -0700651 // Only non-null and valid for SyncOps within a render pass instance WIP -- think about how to manage for non RPI calls within
652 // RPI and 2ndarys...
John Zulaufbb890452021-12-14 11:30:18 -0700653 uint32_t subpass_ = VK_SUBPASS_EXTERNAL;
sjfricke0bea06e2022-06-05 09:22:26 +0900654 CMD_TYPE cmd_type_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700655};
656
John Zulaufd5115702021-01-18 12:34:33 -0700657class SyncOpBarriers : public SyncOpBase {
658 protected:
659 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600660 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700661 AccessContext *context);
662 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600663 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700664 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700665
sjfricke0bea06e2022-06-05 09:22:26 +0900666 SyncOpBarriers(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700667 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
668 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
669 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
670 const VkImageMemoryBarrier *pImageMemoryBarriers);
sjfricke0bea06e2022-06-05 09:22:26 +0900671 SyncOpBarriers(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
John Zulauf4edde622021-02-15 08:54:50 -0700672 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700673
John Zulauf8eda1562021-04-13 17:06:41 -0600674 ~SyncOpBarriers() override = default;
675
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700676 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700677 struct BarrierSet {
678 VkDependencyFlags dependency_flags;
679 SyncExecScope src_exec_scope;
680 SyncExecScope dst_exec_scope;
681 std::vector<SyncMemoryBarrier> memory_barriers;
682 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
683 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
684 bool single_exec_scope;
685 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
686 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
687 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
688 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
689 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
690 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
691 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
692 const VkImageMemoryBarrier *pImageMemoryBarriers);
693 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700694 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700695 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700696 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700697 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700698 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700699 };
700 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700701};
702
John Zulaufd5115702021-01-18 12:34:33 -0700703class SyncOpPipelineBarrier : public SyncOpBarriers {
704 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900705 SyncOpPipelineBarrier(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags,
John Zulauf36ef9282021-02-02 11:47:24 -0700706 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
707 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700708 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
709 const VkImageMemoryBarrier *pImageMemoryBarriers);
sjfricke0bea06e2022-06-05 09:22:26 +0900710 SyncOpPipelineBarrier(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags,
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700711 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600712 ~SyncOpPipelineBarrier() override = default;
713
John Zulaufd5115702021-01-18 12:34:33 -0700714 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600715 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600716 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600717 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
718 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700719};
720
721class SyncOpWaitEvents : public SyncOpBarriers {
722 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900723 SyncOpWaitEvents(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
John Zulauf36ef9282021-02-02 11:47:24 -0700724 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
725 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700726 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
727 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700728
sjfricke0bea06e2022-06-05 09:22:26 +0900729 SyncOpWaitEvents(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
John Zulauf4edde622021-02-15 08:54:50 -0700730 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600731 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700732
John Zulaufd5115702021-01-18 12:34:33 -0700733 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600734 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600735 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600736 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
737 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700738
739 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600740 static const char *const kIgnored;
John Zulaufbb890452021-12-14 11:30:18 -0700741 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700742 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
743 // 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 -0700744 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
745 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700746};
747
John Zulauf6ce24372021-01-30 05:56:25 -0700748class SyncOpResetEvent : public SyncOpBase {
749 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900750 SyncOpResetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700751 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600752 ~SyncOpResetEvent() override = default;
753
John Zulauf6ce24372021-01-30 05:56:25 -0700754 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600755 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600756 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600757 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
758 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700759
760 private:
John Zulaufbb890452021-12-14 11:30:18 -0700761 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700762 std::shared_ptr<const EVENT_STATE> event_;
763 SyncExecScope exec_scope_;
764};
765
766class SyncOpSetEvent : public SyncOpBase {
767 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900768 SyncOpSetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulaufe0757ba2022-06-10 16:51:45 -0600769 VkPipelineStageFlags2KHR stageMask, const AccessContext *access_context);
sjfricke0bea06e2022-06-05 09:22:26 +0900770 SyncOpSetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulaufe0757ba2022-06-10 16:51:45 -0600771 const VkDependencyInfoKHR &dep_info, const AccessContext *access_context);
John Zulauf8eda1562021-04-13 17:06:41 -0600772 ~SyncOpSetEvent() override = default;
773
John Zulauf6ce24372021-01-30 05:56:25 -0700774 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600775 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600776 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600777 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
778 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700779
780 private:
John Zulaufbb890452021-12-14 11:30:18 -0700781 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600782 void DoRecord(QueueId queue_id, ResourceUsageTag recorded_tag, const std::shared_ptr<const AccessContext> &access_context,
783 SyncEventsContext *events_context) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700784 std::shared_ptr<const EVENT_STATE> event_;
John Zulaufe0757ba2022-06-10 16:51:45 -0600785 // The Access context of the command buffer at record set event time.
786 std::shared_ptr<const AccessContext> recorded_context_;
John Zulauf6ce24372021-01-30 05:56:25 -0700787 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700788 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600789 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700790};
John Zulauf64ffe552021-02-06 10:25:07 -0700791
792class SyncOpBeginRenderPass : public SyncOpBase {
793 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900794 SyncOpBeginRenderPass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700795 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600796 ~SyncOpBeginRenderPass() override = default;
797
John Zulauf64ffe552021-02-06 10:25:07 -0700798 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600799 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600800 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600801 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
802 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600803 const RenderPassAccessContext *GetRenderPassAccessContext() const { return rp_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700804
805 protected:
806 safe_VkRenderPassBeginInfo renderpass_begin_info_;
807 safe_VkSubpassBeginInfo subpass_begin_info_;
808 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
809 std::vector<const IMAGE_VIEW_STATE *> attachments_;
810 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
John Zulaufdab327f2022-07-08 12:02:05 -0600811 const RenderPassAccessContext *rp_context_;
John Zulauf64ffe552021-02-06 10:25:07 -0700812};
813
814class SyncOpNextSubpass : public SyncOpBase {
815 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900816 SyncOpNextSubpass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700817 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600818 ~SyncOpNextSubpass() override = default;
819
John Zulauf64ffe552021-02-06 10:25:07 -0700820 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600821 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600822 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600823 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
824 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700825
826 protected:
827 safe_VkSubpassBeginInfo subpass_begin_info_;
828 safe_VkSubpassEndInfo subpass_end_info_;
829};
830
831class SyncOpEndRenderPass : public SyncOpBase {
832 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900833 SyncOpEndRenderPass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600834 ~SyncOpEndRenderPass() override = default;
835
John Zulauf64ffe552021-02-06 10:25:07 -0700836 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600837 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600838 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600839 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
840 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700841
842 protected:
843 safe_VkSubpassEndInfo subpass_end_info_;
844};
845
John Zulauf540266b2020-04-06 18:54:53 -0600846class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700847 public:
John Zulauf69133422020-05-20 14:55:53 -0600848 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600849 kDetectPrevious = 1U << 0,
850 kDetectAsync = 1U << 1,
851 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600852 };
John Zulauf1d5f9c12022-05-13 14:51:08 -0600853 struct AddressRange {
854 AccessAddressType type;
855 ResourceAccessRange range;
856 AddressRange() = default; // the explicit constructor below isn't needed in 20, but would delete the default.
857 AddressRange(AccessAddressType type_, ResourceAccessRange range_) : type(type_), range(range_) {}
858 };
John Zulauf43cc7462020-12-03 12:33:12 -0700859 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600860
John Zulaufbb890452021-12-14 11:30:18 -0700861 using TrackBack = SubpassBarrierTrackback<AccessContext>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700862
John Zulauf355e49b2020-04-24 15:11:15 -0600863 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600864 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200865 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
866 bool is_depth_sliced) const;
John Zulauf69133422020-05-20 14:55:53 -0600867 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700868 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
869 DetectOptions options) const;
870 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600871 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200872 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced,
873 DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600874 template <typename Detector>
875 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200876 bool is_depth_sliced, DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600877 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200878 const VkImageSubresourceRange &subresource_range, bool is_depth_sliced) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700879 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
880 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
881
John Zulauf69133422020-05-20 14:55:53 -0600882 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700883 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200884 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600885 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
886 VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope,
887 QueueId queue_id, const SyncEventState &sync_event, DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700888 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
889 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700890 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700891 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700892 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700893 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700894 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600895
John Zulaufb02c1eb2020-10-06 16:33:36 -0600896 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600897 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600898
John Zulauf0223f142022-07-06 09:05:39 -0600899 HazardResult DetectFirstUseHazard(QueueId queue_id, const ResourceUsageRange &tag_range,
900 const AccessContext &access_context) const;
John Zulaufae842002021-04-15 18:20:55 -0600901
John Zulaufe5da6e52020-03-18 15:32:18 -0600902 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600903 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600904 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600905 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600906 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700907 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600908 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700909 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600910 for (auto &map : access_state_maps_) {
911 map.clear();
912 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600913 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600914
915 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
916 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600917 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
918 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700919 template <typename BarrierAction>
920 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
921 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700922 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700923 const ResourceAccessState *infill_state,
924 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700925 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600926 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700927 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
928 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600929 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700930 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600931 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
932 bool recur_to_infill = true) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600933 template <typename ResolveOp>
934 void ResolveFromContext(ResolveOp &&resolve_op, const AccessContext &from_context,
935 const ResourceAccessState *infill_state = nullptr, bool recur_to_infill = false);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600936
John Zulauf8e3c3e92021-01-06 11:19:36 -0700937 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600938 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700939 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600940 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
941 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600942 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600943 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700944 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600945 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700946 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600947 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600948 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700949 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600950 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700951 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600952 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600953
John Zulauf540266b2020-04-06 18:54:53 -0600954 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600955
John Zulauf4fa68462021-04-26 21:04:22 -0600956 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700957 template <typename Action, typename RangeGen>
958 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600959 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700960 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600961 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700962 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700963 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600964
John Zulauf1d5f9c12022-05-13 14:51:08 -0600965 void DeleteAccess(const AddressRange &address);
John Zulauf540266b2020-04-06 18:54:53 -0600966 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600967 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600968
969 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600970 AccessContext(const AccessContext &copy_from) = default;
John Zulauf8a7b03d2022-09-20 11:41:19 -0600971 void Trim();
972 void AddReferencedTags(ResourceUsageTagSet &referenced) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600973
John Zulauf43cc7462020-12-03 12:33:12 -0700974 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
975 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
976 return access_state_maps_[static_cast<size_t>(type)];
977 }
John Zulauf355e49b2020-04-24 15:11:15 -0600978 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
979 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700980 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600981 } else {
982 assert(subpass < prev_by_subpass_.size());
983 return prev_by_subpass_[subpass];
984 }
985 }
John Zulauf16adfc92020-04-08 10:28:33 -0600986
John Zulauf64ffe552021-02-06 10:25:07 -0700987 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700988 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900989 CMD_TYPE cmd_type) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700990 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700991 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900992 CMD_TYPE cmd_type) const;
993 bool ValidateStoreOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700994 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900995 CMD_TYPE cmd_type) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700996 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
sjfricke0bea06e2022-06-05 09:22:26 +0900997 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views, CMD_TYPE cmd_type,
998 uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600999
John Zulauf14940722021-04-12 15:19:02 -06001000 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -07001001 template <typename Action>
1002 void ForAll(Action &&action);
John Zulauff26fca92022-08-15 11:53:34 -06001003 template <typename Action>
1004 void ConstForAll(Action &&action) const;
John Zulauf3da08bb2022-08-01 17:56:56 -06001005 template <typename Predicate>
1006 void EraseIf(Predicate &&pred);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001007
John Zulaufecf4ac52022-06-06 10:08:42 -06001008 // For use during queue submit building up the QueueBatchContext AccessContext for validation, otherwise clear.
John Zulauf06f6f1e2022-04-19 15:28:11 -06001009 void AddAsyncContext(const AccessContext *context);
1010 // For use during queue submit to avoid stale pointers;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001011 void ClearAsyncContext(const AccessContext *context) { async_.clear(); }
1012
John Zulauf3d84f1b2020-03-09 13:33:25 -06001013 private:
1014 template <typename Detector>
John Zulaufe0757ba2022-06-10 16:51:45 -06001015 HazardResult DetectHazard(AccessAddressType type, Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -06001016 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001017 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -07001018 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -06001019 template <typename Detector>
John Zulaufe0757ba2022-06-10 16:51:45 -06001020 HazardResult DetectPreviousHazard(AccessAddressType type, Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -07001021 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -06001022 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -06001023
1024 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001025 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -06001026 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001027 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -07001028 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -06001029 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001030 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001031};
1032
John Zulaufe0757ba2022-06-10 16:51:45 -06001033struct SyncEventState {
1034 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2, MissingSetEvent };
1035 using EventPointer = std::shared_ptr<const EVENT_STATE>;
1036 using ScopeMap = ResourceAccessRangeMap;
1037 EventPointer event;
1038 CMD_TYPE last_command; // Only Event commands are valid here.
1039 ResourceUsageTag last_command_tag; // Needed to filter replay validation
1040 CMD_TYPE unsynchronized_set;
1041 VkPipelineStageFlags2KHR barriers;
1042 SyncExecScope scope;
1043 ResourceUsageTag first_scope_tag;
1044 bool destroyed;
1045 std::shared_ptr<const AccessContext> first_scope;
1046
1047 SyncEventState()
1048 : event(),
1049 last_command(CMD_NONE),
1050 last_command_tag(0),
1051 unsynchronized_set(CMD_NONE),
1052 barriers(0U),
1053 scope(),
1054 first_scope_tag(),
1055 destroyed(true) {}
1056
1057 SyncEventState(const SyncEventState &) = default;
1058 SyncEventState(SyncEventState &&) = default;
1059
1060 SyncEventState(const SyncEventState::EventPointer &event_state) : SyncEventState() {
1061 event = event_state;
1062 destroyed = (event.get() == nullptr) || event_state->Destroyed();
1063 }
1064
1065 void ResetFirstScope();
1066 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope->GetAccessStateMap(address_type); }
1067 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd_type, VkPipelineStageFlags2KHR srcStageMask) const;
1068 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001069 void AddReferencedTags(ResourceUsageTagSet &referenced) const;
John Zulaufe0757ba2022-06-10 16:51:45 -06001070};
1071
1072class SyncEventsContext {
1073 public:
1074 using Map = layer_data::unordered_map<const EVENT_STATE *, std::shared_ptr<SyncEventState>>;
1075 using iterator = Map::iterator;
1076 using const_iterator = Map::const_iterator;
1077
1078 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
1079 const auto find_it = map_.find(event_state.get());
1080 if (find_it == map_.end()) {
1081 if (!event_state.get()) return nullptr;
1082
1083 const auto *event_plain_ptr = event_state.get();
1084 auto sync_state = std::make_shared<SyncEventState>(event_state);
1085 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
1086 return insert_pair.first->second.get();
1087 }
1088 return find_it->second.get();
1089 }
1090
1091 const SyncEventState *Get(const EVENT_STATE *event_state) const {
1092 const auto find_it = map_.find(event_state);
1093 if (find_it == map_.end()) {
1094 return nullptr;
1095 }
1096 return find_it->second.get();
1097 }
1098 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
1099
1100 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst, ResourceUsageTag tag);
1101 void ApplyTaggedWait(VkQueueFlags queue_flags, ResourceUsageTag tag);
1102
John Zulaufe0757ba2022-06-10 16:51:45 -06001103 void Destroy(const EVENT_STATE *event_state) {
1104 auto sync_it = map_.find(event_state);
1105 if (sync_it != map_.end()) {
1106 sync_it->second->destroyed = true;
1107 map_.erase(sync_it);
1108 }
1109 }
1110 void Clear() { map_.clear(); }
1111
1112 SyncEventsContext &DeepCopy(const SyncEventsContext &from);
John Zulauf8a7b03d2022-09-20 11:41:19 -06001113 void AddReferencedTags(ResourceUsageTagSet &referenced) const;
John Zulaufe0757ba2022-06-10 16:51:45 -06001114
1115 private:
1116 Map map_;
1117};
1118
John Zulauf355e49b2020-04-24 15:11:15 -06001119class RenderPassAccessContext {
1120 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -07001121 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
1122 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -07001123 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
1124 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
1125 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -06001126
sjfricke0bea06e2022-06-05 09:22:26 +09001127 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd_buffer,
1128 CMD_TYPE cmd_type) const;
1129 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd_buffer, ResourceUsageTag tag);
1130 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
1131 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
1132 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001133
John Zulauf14940722021-04-12 15:19:02 -06001134 void RecordLayoutTransitions(ResourceUsageTag tag);
1135 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001136 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
1137 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
1138 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -06001139
John Zulauf540266b2020-04-06 18:54:53 -06001140 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
1141 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -06001142 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
1143 uint32_t GetCurrentSubpass() const { return current_subpass_; }
1144 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001145 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -06001146
1147 private:
John Zulauf355e49b2020-04-24 15:11:15 -06001148 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001149 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -06001150 uint32_t current_subpass_;
1151 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -07001152 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001153};
1154
John Zulauf64ffe552021-02-06 10:25:07 -07001155// Command execution context is the base class for command buffer and queue contexts
1156// Preventing unintented leakage of subclass specific state, storing enough information
1157// for message logging.
1158// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
1159class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001160 public:
John Zulauf3c788ef2022-02-22 12:12:30 -07001161 using AccessLog = std::vector<ResourceUsageRecord>;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001162 using CommandBufferSet = layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>>;
John Zulauf64ffe552021-02-06 10:25:07 -07001163 CommandExecutionContext() : sync_state_(nullptr) {}
John Zulauf3c788ef2022-02-22 12:12:30 -07001164 CommandExecutionContext(const SyncValidator *sync_validator) : sync_state_(sync_validator) {}
John Zulauf64ffe552021-02-06 10:25:07 -07001165 virtual ~CommandExecutionContext() = default;
John Zulaufbb890452021-12-14 11:30:18 -07001166 virtual AccessContext *GetCurrentAccessContext() = 0;
1167 virtual SyncEventsContext *GetCurrentEventsContext() = 0;
1168 virtual const AccessContext *GetCurrentAccessContext() const = 0;
1169 virtual const SyncEventsContext *GetCurrentEventsContext() const = 0;
John Zulauf00119522022-05-23 19:07:42 -06001170 virtual QueueId GetQueueId() const = 0;
John Zulaufbb890452021-12-14 11:30:18 -07001171
John Zulauf64ffe552021-02-06 10:25:07 -07001172 const SyncValidator &GetSyncState() const {
1173 assert(sync_state_);
1174 return *sync_state_;
1175 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001176
John Zulauf3c788ef2022-02-22 12:12:30 -07001177 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulauf06f6f1e2022-04-19 15:28:11 -06001178 std::string FormatHazard(const HazardResult &hazard) const;
1179
John Zulaufbb890452021-12-14 11:30:18 -07001180 virtual ResourceUsageTag GetTagLimit() const = 0;
1181 virtual VulkanTypedHandle Handle() const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -06001182 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
John Zulauf3c788ef2022-02-22 12:12:30 -07001183 virtual void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) = 0;
John Zulauf64ffe552021-02-06 10:25:07 -07001184
John Zulaufdab327f2022-07-08 12:02:05 -06001185 virtual HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) = 0;
1186 virtual void BeginRenderPassReplay(const SyncOpBeginRenderPass &begin_op, ResourceUsageTag tag) {
1187 assert("Must override if use by derived type is valid" == nullptr);
1188 }
1189 virtual void NextSubpassReplay() { assert("Must override if use by derived type is valid" == nullptr); }
1190 virtual void EndRenderPassReplay() { assert("Must override if use by derived type is valid" == nullptr); }
1191
John Zulauf0223f142022-07-06 09:05:39 -06001192 bool ValidForSyncOps() const;
1193
John Zulauf64ffe552021-02-06 10:25:07 -07001194 protected:
John Zulaufdab327f2022-07-08 12:02:05 -06001195 class ReplayGuard {
1196 public:
1197 ReplayGuard(CommandExecutionContext &exec_context, const CommandBufferAccessContext &recorded_context)
1198 : exec_context_(exec_context) {
1199 exec_context_.BeginCommandBufferReplay(recorded_context);
1200 }
1201 ~ReplayGuard() { exec_context_.EndCommandBufferReplay(); }
1202
1203 private:
1204 CommandExecutionContext &exec_context_;
1205 };
1206 friend ReplayGuard;
1207
John Zulauf3c788ef2022-02-22 12:12:30 -07001208 const SyncValidator *sync_state_;
John Zulaufdab327f2022-07-08 12:02:05 -06001209 const CommandBufferAccessContext *current_replay_;
1210
1211 private:
1212 // Only allow the replay guard to manage the begin/end
1213 void BeginCommandBufferReplay(const CommandBufferAccessContext &recorded) { current_replay_ = &recorded; }
1214 void EndCommandBufferReplay() { current_replay_ = nullptr; }
John Zulauf64ffe552021-02-06 10:25:07 -07001215};
1216
1217class CommandBufferAccessContext : public CommandExecutionContext {
1218 public:
John Zulauf8eda1562021-04-13 17:06:41 -06001219 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
1220 struct SyncOpEntry {
1221 ResourceUsageTag tag;
1222 SyncOpPointer sync_op;
1223 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
1224 SyncOpEntry() = default;
1225 SyncOpEntry(const SyncOpEntry &other) = default;
1226 };
1227
John Zulauf3c788ef2022-02-22 12:12:30 -07001228 CommandBufferAccessContext(const SyncValidator *sync_validator = nullptr)
John Zulauf64ffe552021-02-06 10:25:07 -07001229 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -06001230 cb_state_(),
1231 queue_flags_(),
1232 destroyed_(false),
John Zulauf8a7b03d2022-09-20 11:41:19 -06001233 access_log_(std::make_shared<AccessLog>()),
1234 cbs_referenced_(std::make_shared<CommandBufferSet>()),
John Zulauffaea0ee2021-01-14 14:01:32 -07001235 command_number_(0),
1236 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001237 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001238 cb_access_context_(),
1239 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001240 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001241 render_pass_contexts_(),
1242 current_renderpass_context_(),
1243 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001244 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001245 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001246 cb_state_ = cb_state;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001247 cbs_referenced_->insert(cb_state_);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001248 queue_flags_ = queue_flags;
1249 }
John Zulauf4fa68462021-04-26 21:04:22 -06001250
1251 struct AsProxyContext {};
1252 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1253
John Zulauf64ffe552021-02-06 10:25:07 -07001254 ~CommandBufferAccessContext() override = default;
1255 CommandExecutionContext &GetExecutionContext() { return *this; }
1256 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001257
1258 void Reset() {
John Zulauf8a7b03d2022-09-20 11:41:19 -06001259 access_log_ = std::make_shared<AccessLog>();
1260 cbs_referenced_ = std::make_shared<CommandBufferSet>();
1261 if (cb_state_) {
1262 cbs_referenced_->insert(cb_state_);
1263 }
John Zulauf8eda1562021-04-13 17:06:41 -06001264 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001265 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001266 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001267 reset_count_++;
1268 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001269 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001270 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001271 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001272 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001273 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001274 void MarkDestroyed() { destroyed_ = true; }
1275 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001276
John Zulauf4fa68462021-04-26 21:04:22 -06001277 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001278 std::string FormatUsage(const ResourceFirstAccess &access) const; // Only command buffers have "first usage"
John Zulaufbb890452021-12-14 11:30:18 -07001279 AccessContext *GetCurrentAccessContext() override { return current_context_; }
1280 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1281 const AccessContext *GetCurrentAccessContext() const override { return current_context_; }
1282 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
John Zulauf00119522022-05-23 19:07:42 -06001283 QueueId GetQueueId() const override;
John Zulaufbb890452021-12-14 11:30:18 -07001284
John Zulauf64ffe552021-02-06 10:25:07 -07001285 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001286 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
sjfricke0bea06e2022-06-05 09:22:26 +09001287 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd_type, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
John Zulauf41a9c7c2021-12-07 15:59:53 -07001288 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulaufd5115702021-01-18 12:34:33 -07001289
sjfricke0bea06e2022-06-05 09:22:26 +09001290 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001291 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001292 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001293 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001294 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001295 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001296 bool ValidateDrawSubpassAttachment(CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001297 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001298 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd_type);
1299 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd_type);
John Zulauf4a6105a2020-11-17 15:11:05 -07001300 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001301
John Zulauf0223f142022-07-06 09:05:39 -06001302 bool ValidateFirstUse(CommandExecutionContext &exec_context, const char *func_name, uint32_t index) const;
sjfricke0bea06e2022-06-05 09:22:26 +09001303 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context);
John Zulauf1d5f9c12022-05-13 14:51:08 -06001304 void ResolveExecutedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
John Zulauf4fa68462021-04-26 21:04:22 -06001305
John Zulaufdab327f2022-07-08 12:02:05 -06001306 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) override;
1307
John Zulauf3d84f1b2020-03-09 13:33:25 -06001308 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1309 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001310
John Zulauf41a9c7c2021-12-07 15:59:53 -07001311 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
John Zulauf8a7b03d2022-09-20 11:41:19 -06001312 ResourceUsageTag GetTagLimit() const override { return access_log_->size(); }
John Zulaufbb890452021-12-14 11:30:18 -07001313 VulkanTypedHandle Handle() const override {
1314 if (cb_state_) {
1315 return cb_state_->Handle();
1316 }
1317 return VulkanTypedHandle(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), kVulkanObjectTypeCommandBuffer);
1318 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001319
John Zulauf41a9c7c2021-12-07 15:59:53 -07001320 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1321 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1322 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001323
John Zulauf3c788ef2022-02-22 12:12:30 -07001324 std::shared_ptr<const CMD_BUFFER_STATE> GetCBStateShared() const { return cb_state_; }
1325
John Zulauffaea0ee2021-01-14 14:01:32 -07001326 const CMD_BUFFER_STATE &GetCBState() const {
1327 assert(cb_state_);
1328 return *(cb_state_.get());
1329 }
1330 CMD_BUFFER_STATE &GetCBState() {
1331 assert(cb_state_);
1332 return *(cb_state_.get());
1333 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001334
John Zulauf1bf30522021-09-03 15:39:06 -06001335 template <class T, class... Args>
1336 void RecordSyncOp(Args &&...args) {
1337 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1338 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
John Zulaufbb890452021-12-14 11:30:18 -07001339 RecordSyncOp(std::move(sync_op)); // Call the non-template version
John Zulauf1bf30522021-09-03 15:39:06 -06001340 }
John Zulauf8a7b03d2022-09-20 11:41:19 -06001341 const AccessLog &GetAccessLog() const { return *access_log_; }
1342 std::shared_ptr<AccessLog> GetAccessLogShared() const { return access_log_; }
1343 std::shared_ptr<CommandBufferSet> GetCBReferencesShared() const { return cbs_referenced_; }
John Zulauf3c788ef2022-02-22 12:12:30 -07001344 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001345 const std::vector<SyncOpEntry> &GetSyncOps() const { return sync_ops_; };
John Zulauf8eda1562021-04-13 17:06:41 -06001346
John Zulauf3d84f1b2020-03-09 13:33:25 -06001347 private:
John Zulaufbb890452021-12-14 11:30:18 -07001348 // As this is passing around a shared pointer to record, move to avoid needless atomics.
1349 void RecordSyncOp(SyncOpPointer &&sync_op);
John Zulauf4fa68462021-04-26 21:04:22 -06001350 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1351 VkQueueFlags queue_flags_;
1352 bool destroyed_;
1353
John Zulauf8a7b03d2022-09-20 11:41:19 -06001354 std::shared_ptr<AccessLog> access_log_;
1355 std::shared_ptr<CommandBufferSet> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001356 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001357 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001358 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001359
John Zulauf355e49b2020-04-24 15:11:15 -06001360 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001361 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001362 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001363
1364 // Don't need the following for an active proxy cb context
John Zulaufab84f242022-08-04 18:38:40 -06001365 std::vector<std::unique_ptr<RenderPassAccessContext>> render_pass_contexts_;
John Zulauf4fa68462021-04-26 21:04:22 -06001366 RenderPassAccessContext *current_renderpass_context_;
1367 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001368};
1369
John Zulauf697c0e12022-04-19 16:31:12 -06001370class QueueSyncState;
1371
John Zulauf8a7b03d2022-09-20 11:41:19 -06001372// Store references to ResourceUsageRecords with global tag range within a batch
1373class BatchAccessLog {
John Zulauf697c0e12022-04-19 16:31:12 -06001374 public:
1375 struct BatchRecord {
1376 BatchRecord() = default;
1377 BatchRecord(const BatchRecord &other) = default;
1378 BatchRecord(BatchRecord &&other) = default;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001379 BatchRecord(const QueueSyncState &q, uint64_t submit, uint32_t batch)
1380 : queue(&q), submit_index(submit), batch_index(batch), cb_index(0), bias(0) {}
John Zulauf697c0e12022-04-19 16:31:12 -06001381 BatchRecord &operator=(const BatchRecord &other) = default;
1382 const QueueSyncState *queue;
1383 uint64_t submit_index;
1384 uint32_t batch_index;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001385 uint32_t cb_index;
1386 ResourceUsageTag bias;
John Zulauf697c0e12022-04-19 16:31:12 -06001387 };
1388
1389 struct AccessRecord {
1390 const BatchRecord *batch;
1391 const ResourceUsageRecord *record;
1392 bool IsValid() const { return batch && record; }
1393 };
1394
John Zulauf8a7b03d2022-09-20 11:41:19 -06001395 struct CBSubmitLog {
John Zulauf697c0e12022-04-19 16:31:12 -06001396 public:
John Zulauf8a7b03d2022-09-20 11:41:19 -06001397 CBSubmitLog() = default;
1398 CBSubmitLog(const CBSubmitLog &batch) = default;
1399 CBSubmitLog(CBSubmitLog &&other) = default;
1400 CBSubmitLog &operator=(const CBSubmitLog &other) = default;
1401 CBSubmitLog &operator=(CBSubmitLog &&other) = default;
1402 CBSubmitLog(const BatchRecord &batch, const CommandBufferAccessContext &cb)
1403 : batch_(batch), cbs_(cb.GetCBReferencesShared()), log_(cb.GetAccessLogShared()) {}
John Zulauf697c0e12022-04-19 16:31:12 -06001404
John Zulauf8a7b03d2022-09-20 11:41:19 -06001405 size_t Size() const { return log_->size(); }
John Zulauf697c0e12022-04-19 16:31:12 -06001406 const BatchRecord &GetBatch() const { return batch_; }
John Zulauf8a7b03d2022-09-20 11:41:19 -06001407 AccessRecord operator[](ResourceUsageTag tag) const;
John Zulauf697c0e12022-04-19 16:31:12 -06001408
1409 private:
1410 BatchRecord batch_;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001411 std::shared_ptr<CommandExecutionContext::CommandBufferSet> cbs_;
1412 std::shared_ptr<CommandExecutionContext::AccessLog> log_;
John Zulauf697c0e12022-04-19 16:31:12 -06001413 };
1414
John Zulauf8a7b03d2022-09-20 11:41:19 -06001415 ResourceUsageTag Import(const BatchRecord &batch, const CommandBufferAccessContext &cb_access);
1416 void Import(const BatchAccessLog &other);
John Zulauf697c0e12022-04-19 16:31:12 -06001417
John Zulauf8a7b03d2022-09-20 11:41:19 -06001418 void Trim(const ResourceUsageTagSet &used);
1419 // AccessRecord lookup is based on global tags
John Zulauf697c0e12022-04-19 16:31:12 -06001420 AccessRecord operator[](ResourceUsageTag tag) const;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001421 BatchAccessLog() {}
John Zulauf697c0e12022-04-19 16:31:12 -06001422
1423 private:
John Zulauf8a7b03d2022-09-20 11:41:19 -06001424 using CBSubmitLogRangeMap = sparse_container::range_map<ResourceUsageTag, CBSubmitLog>;
1425 CBSubmitLogRangeMap log_map_;
John Zulauf697c0e12022-04-19 16:31:12 -06001426};
1427
John Zulauf697c0e12022-04-19 16:31:12 -06001428class QueueBatchContext : public CommandExecutionContext {
1429 public:
John Zulaufdab327f2022-07-08 12:02:05 -06001430 struct RenderPassReplayState {
1431 // A minimal subset of the functionality present in the RenderPassAccessContext. Since the accesses are recorded in the
1432 // first_use information of the recorded access contexts, s.t. all we need to support is the barrier/resolve operations
1433 RenderPassReplayState() { Reset(); }
1434 AccessContext *Begin(VkQueueFlags queue_flags, const SyncOpBeginRenderPass &begin_op_,
1435 const AccessContext &external_context);
1436 AccessContext *Next();
1437 void End(AccessContext &external_context);
1438
1439 const SyncOpBeginRenderPass *begin_op = nullptr;
1440 const AccessContext *replay_context = nullptr;
1441 uint32_t subpass = VK_SUBPASS_EXTERNAL;
1442 std::vector<AccessContext> subpass_contexts;
1443 void Reset() {
1444 begin_op = nullptr;
1445 replay_context = nullptr;
1446 subpass = VK_SUBPASS_EXTERNAL;
1447 subpass_contexts.clear();
1448 }
1449 operator bool() const { return begin_op != nullptr; }
1450 };
1451
John Zulauf1d5f9c12022-05-13 14:51:08 -06001452 using ConstBatchSet = layer_data::unordered_set<std::shared_ptr<const QueueBatchContext>>;
1453 using BatchSet = layer_data::unordered_set<std::shared_ptr<QueueBatchContext>>;
1454 static constexpr bool TruePred(const std::shared_ptr<const QueueBatchContext> &) { return true; }
John Zulauf697c0e12022-04-19 16:31:12 -06001455 struct CmdBufferEntry {
1456 uint32_t index = 0;
1457 std::shared_ptr<const CommandBufferAccessContext> cb;
1458 CmdBufferEntry(uint32_t index_, std::shared_ptr<const CommandBufferAccessContext> &&cb_)
1459 : index(index_), cb(std::move(cb_)) {}
1460 };
John Zulauf1d5f9c12022-05-13 14:51:08 -06001461
John Zulauf697c0e12022-04-19 16:31:12 -06001462 using CommandBuffers = std::vector<CmdBufferEntry>;
1463
John Zulauf8a7b03d2022-09-20 11:41:19 -06001464 QueueBatchContext(const SyncValidator &sync_state, const QueueSyncState &queue_state, uint64_t submit_index,
1465 uint32_t batch_index);
John Zulaufa8700a52022-08-18 16:22:08 -06001466 QueueBatchContext() = delete;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001467 void Trim();
John Zulaufa8700a52022-08-18 16:22:08 -06001468
John Zulauf697c0e12022-04-19 16:31:12 -06001469 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulaufdab327f2022-07-08 12:02:05 -06001470 AccessContext *GetCurrentAccessContext() override { return current_access_context_; }
1471 const AccessContext *GetCurrentAccessContext() const override { return current_access_context_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001472 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1473 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1474 const QueueSyncState *GetQueueSyncState() const { return queue_state_; }
1475 VkQueueFlags GetQueueFlags() const;
John Zulauf00119522022-05-23 19:07:42 -06001476 QueueId GetQueueId() const override;
John Zulauf697c0e12022-04-19 16:31:12 -06001477
John Zulauf8a7b03d2022-09-20 11:41:19 -06001478 void SetupBatchTags();
John Zulaufe0757ba2022-06-10 16:51:45 -06001479 void ResetEventsContext() { events_context_.Clear(); }
John Zulauf8a7b03d2022-09-20 11:41:19 -06001480 ResourceUsageTag GetTagLimit() const override { return batch_.bias; }
John Zulauf697c0e12022-04-19 16:31:12 -06001481 // begin is the tag bias / .size() is the number of total records that should eventually be in access_log_
1482 ResourceUsageRange GetTagRange() const { return tag_range_; }
1483 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
1484
1485 void SetTagBias(ResourceUsageTag);
John Zulaufa8700a52022-08-18 16:22:08 -06001486 void SetupAccessContext(const std::shared_ptr<const QueueBatchContext> &prev, const VkSubmitInfo2 &submit_info,
1487 SignaledSemaphores &signaled_semaphores);
1488 void SetupCommandBufferInfo(const VkSubmitInfo2 &submit_info);
John Zulauf697c0e12022-04-19 16:31:12 -06001489
John Zulaufa8700a52022-08-18 16:22:08 -06001490 bool DoQueueSubmitValidate(const SyncValidator &sync_state, QueueSubmitCmdState &cmd_state, const VkSubmitInfo2 &submit_info);
John Zulaufcb7e1672022-05-04 13:46:08 -06001491
John Zulauf1d5f9c12022-05-13 14:51:08 -06001492 void ResolveSubmittedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
1493
John Zulauf697c0e12022-04-19 16:31:12 -06001494 VulkanTypedHandle Handle() const override;
1495
John Zulauf1d5f9c12022-05-13 14:51:08 -06001496 void ApplyTaggedWait(QueueId queue_id, ResourceUsageTag tag);
1497 void ApplyDeviceWait();
1498
John Zulaufdab327f2022-07-08 12:02:05 -06001499 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) override;
1500 void BeginRenderPassReplay(const SyncOpBeginRenderPass &begin_op, ResourceUsageTag tag) override;
1501 void NextSubpassReplay() override;
1502 void EndRenderPassReplay() override;
1503
John Zulauf697c0e12022-04-19 16:31:12 -06001504 private:
John Zulaufecf4ac52022-06-06 10:08:42 -06001505 std::shared_ptr<QueueBatchContext> ResolveOneWaitSemaphore(VkSemaphore sem, VkPipelineStageFlags2 wait_mask,
1506 SignaledSemaphores &signaled);
John Zulauf697c0e12022-04-19 16:31:12 -06001507
1508 const QueueSyncState *queue_state_ = nullptr;
1509 ResourceUsageRange tag_range_ = ResourceUsageRange(0, 0); // Range of tags referenced by cbs_referenced
1510
1511 AccessContext access_context_;
John Zulaufdab327f2022-07-08 12:02:05 -06001512 AccessContext *current_access_context_;
John Zulauf697c0e12022-04-19 16:31:12 -06001513 SyncEventsContext events_context_;
John Zulauf8a7b03d2022-09-20 11:41:19 -06001514 BatchAccessLog batch_log_;
1515 BatchAccessLog::BatchRecord batch_;
John Zulauf697c0e12022-04-19 16:31:12 -06001516
1517 // Clear these after validation and import
1518 CommandBuffers command_buffers_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001519 ConstBatchSet async_batches_;
John Zulaufdab327f2022-07-08 12:02:05 -06001520 RenderPassReplayState rp_replay_;
John Zulauf697c0e12022-04-19 16:31:12 -06001521};
John Zulaufbbda4572022-04-19 16:20:45 -06001522
1523class QueueSyncState {
1524 public:
John Zulauf1d5f9c12022-05-13 14:51:08 -06001525 constexpr static QueueId kQueueIdBase = QueueId(0);
1526 constexpr static QueueId kQueueIdInvalid = ~kQueueIdBase;
1527 QueueSyncState(const std::shared_ptr<QUEUE_STATE> &queue_state, VkQueueFlags queue_flags, QueueId id)
1528 : submit_index_(0), queue_state_(queue_state), last_batch_(), queue_flags_(queue_flags), id_(id) {}
John Zulaufbbda4572022-04-19 16:20:45 -06001529
1530 VulkanTypedHandle Handle() const {
1531 if (queue_state_) {
1532 return queue_state_->Handle();
1533 }
1534 return VulkanTypedHandle(static_cast<VkQueue>(VK_NULL_HANDLE), kVulkanObjectTypeQueue);
1535 }
1536 std::shared_ptr<const QueueBatchContext> LastBatch() const { return last_batch_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001537 std::shared_ptr<QueueBatchContext> LastBatch() { return last_batch_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001538 void SetLastBatch(std::shared_ptr<QueueBatchContext> &&last);
John Zulaufbbda4572022-04-19 16:20:45 -06001539 QUEUE_STATE *GetQueueState() { return queue_state_.get(); }
1540 const QUEUE_STATE *GetQueueState() const { return queue_state_.get(); }
1541 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001542 QueueId GetQueueId() const { return id_; }
John Zulaufbbda4572022-04-19 16:20:45 -06001543
John Zulauf697c0e12022-04-19 16:31:12 -06001544 uint64_t ReserveSubmitId() const; // Method is const but updates mutable sumbit_index atomically.
1545
John Zulaufbbda4572022-04-19 16:20:45 -06001546 private:
1547 mutable std::atomic<uint64_t> submit_index_;
1548 std::shared_ptr<QUEUE_STATE> queue_state_;
1549 std::shared_ptr<QueueBatchContext> last_batch_;
1550 const VkQueueFlags queue_flags_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001551 QueueId id_;
John Zulaufbbda4572022-04-19 16:20:45 -06001552};
1553
John Zulaufa8700a52022-08-18 16:22:08 -06001554// The converter needs to be more complex than simply an array of VkSubmitInfo2 structures.
1555// In order to convert from Info->Info2, arrays of VkSemaphoreSubmitInfo and VkCommandBufferSubmitInfo
1556// structures must be created for the pWaitSemaphoreInfos, pCommandBufferInfos, and pSignalSemaphoreInfos
1557// which comprise the converted VkSubmitInfo information. The created VkSubmitInfo2 structure then references the storage
1558// of the arrays, which must have a lifespan longer than the conversion, s.t. the ensuing valdation/record operations
1559// can reference them. The resulting VkSubmitInfo2 is then copied into an additional which takes the place of the pSubmits
1560// parameter.
1561struct SubmitInfoConverter {
1562 struct BatchStore {
1563 BatchStore(const VkSubmitInfo &info);
1564
1565 static VkSemaphoreSubmitInfo WaitSemaphore(const VkSubmitInfo &info, uint32_t index);
1566 static VkCommandBufferSubmitInfo CommandBuffer(const VkSubmitInfo &info, uint32_t index);
1567 static VkSemaphoreSubmitInfo SignalSemaphore(const VkSubmitInfo &info, uint32_t index);
1568
1569 std::vector<VkSemaphoreSubmitInfo> waits;
1570 std::vector<VkCommandBufferSubmitInfo> cbs;
1571 std::vector<VkSemaphoreSubmitInfo> signals;
1572 VkSubmitInfo2 info2;
1573 };
1574
1575 SubmitInfoConverter(uint32_t count, const VkSubmitInfo *infos);
1576
1577 std::vector<BatchStore> info_store;
1578 std::vector<VkSubmitInfo2> info2s;
1579};
1580
John Zulauf9cb530d2019-09-30 14:14:10 -06001581class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1582 public:
John Zulauf9cb530d2019-09-30 14:14:10 -06001583 using StateTracker = ValidationStateTracker;
John Zulaufea943c52022-02-22 11:05:17 -07001584 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
John Zulauf888bb9d2022-05-20 16:13:00 -06001585 virtual ~SyncValidator() { ResetCommandBufferCallbacks(); };
John Zulauf9cb530d2019-09-30 14:14:10 -06001586
John Zulauf697c0e12022-04-19 16:31:12 -06001587 // Global tag range for submitted command buffers resource usage logs
John Zulauf8a7b03d2022-09-20 11:41:19 -06001588 // Started the global tag count at 1 s.t. zero are invalid and ResourceUsageTag normalization can just zero them.
1589 mutable std::atomic<ResourceUsageTag> tag_limit_{1}; // This is reserved in Validation phase, thus mutable and atomic
John Zulauf697c0e12022-04-19 16:31:12 -06001590 ResourceUsageRange ReserveGlobalTagRange(size_t tag_count) const; // Note that the tag_limit_ is mutable this has side effects
John Zulauf697c0e12022-04-19 16:31:12 -06001591
John Zulaufea943c52022-02-22 11:05:17 -07001592 layer_data::unordered_map<VkCommandBuffer, std::shared_ptr<CommandBufferAccessContext>> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001593
John Zulauf1d5f9c12022-05-13 14:51:08 -06001594 using QueueSyncStatesMap = layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>>;
John Zulaufbbda4572022-04-19 16:20:45 -06001595 layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>> queue_sync_states_;
John Zulaufcb7e1672022-05-04 13:46:08 -06001596 SignaledSemaphores signaled_semaphores_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001597
John Zulauf3da08bb2022-08-01 17:56:56 -06001598 using SignaledFences = layer_data::unordered_map<VkFence, FenceSyncState>;
1599 using SignaledFence = SignaledFences::value_type;
1600 SignaledFences waitable_fences_;
1601
1602 void ApplyTaggedWait(QueueId queue_id, ResourceUsageTag tag);
1603
1604 void UpdateFenceWaitInfo(VkFence fence, QueueId queue_id, ResourceUsageTag tag);
1605 void WaitForFence(VkFence fence);
1606
John Zulaufbbda4572022-04-19 16:20:45 -06001607 const QueueSyncState *GetQueueSyncState(VkQueue queue) const;
1608 QueueSyncState *GetQueueSyncState(VkQueue queue);
1609 std::shared_ptr<const QueueSyncState> GetQueueSyncStateShared(VkQueue queue) const;
1610 std::shared_ptr<QueueSyncState> GetQueueSyncStateShared(VkQueue queue);
1611
John Zulaufe0757ba2022-06-10 16:51:45 -06001612 QueueBatchContext::BatchSet GetQueueBatchSnapshot();
1613
John Zulauf1d5f9c12022-05-13 14:51:08 -06001614 template <typename Predicate>
1615 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot(Predicate &&pred) const;
1616 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot() const {
1617 return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred);
1618 };
1619
1620 template <typename Predicate>
1621 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot(Predicate &&pred);
1622 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot() { return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred); };
John Zulaufbbda4572022-04-19 16:20:45 -06001623
1624 std::shared_ptr<CommandBufferAccessContext> AccessContextFactory(VkCommandBuffer command_buffer);
John Zulaufea943c52022-02-22 11:05:17 -07001625 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer);
1626 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer);
1627 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const;
1628 std::shared_ptr<CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer);
1629 std::shared_ptr<const CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001630
John Zulaufd1f85d42020-04-15 12:23:15 -06001631 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1632 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001633 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sjfricke0bea06e2022-06-05 09:22:26 +09001634 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd_type);
John Zulauf64ffe552021-02-06 10:25:07 -07001635 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001636 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
sjfricke0bea06e2022-06-05 09:22:26 +09001637 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type);
John Zulauf33fc1d52020-07-17 11:01:10 -06001638 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001639
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001640 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001641
John Zulauf355e49b2020-04-24 15:11:15 -06001642 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sjfricke0bea06e2022-06-05 09:22:26 +09001643 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd_type) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001644
1645 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001646 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001647
1648 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001649 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001650
1651 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001652 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001653
John Zulauf9cb530d2019-09-30 14:14:10 -06001654 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001655 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001656
1657 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001658 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001659
John Zulauf4a6105a2020-11-17 15:11:05 -07001660 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001661 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001662 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1663 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001664
Tony-LunarGef035472021-11-02 10:23:33 -06001665 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001666 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001667 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001668
John Zulauf5c5e88d2019-12-26 11:22:02 -07001669 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1670 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001671 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001672
1673 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001674 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001675
Tony-LunarGb61514a2021-11-02 12:36:51 -06001676 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001677 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001678 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001679
Tony-LunarGb61514a2021-11-02 12:36:51 -06001680 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001681 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001682 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001683
John Zulauf9cb530d2019-09-30 14:14:10 -06001684 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1685 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1686 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1687 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1688 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001689 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001690
1691 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1692 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1693 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1694 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001695 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001696
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001697 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1698 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001699 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001700 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001701 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001702
John Zulauf3d84f1b2020-03-09 13:33:25 -06001703 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001704 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001705
1706 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001707 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001708 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001709 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001710 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001711 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001712
Mike Schuchardt2df08912020-12-15 16:28:09 -08001713 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sjfricke0bea06e2022-06-05 09:22:26 +09001714 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001715 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001716 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1717 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1718 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1719 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001720
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001721 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001722 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001723 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001724 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001725 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001726
sjfricke0bea06e2022-06-05 09:22:26 +09001727 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001728 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001729 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1730 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001731
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001732 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1733 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1734 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001735
sfricke-samsung71f04e32022-03-16 01:21:21 -05001736 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001737 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001738 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001739 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001740 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1741 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001742 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001743 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001744 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001745 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1746 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001747
sfricke-samsung71f04e32022-03-16 01:21:21 -05001748 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001749 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001750 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001751 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001752 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001753 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001754 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001755 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001756 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1757 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001758
sfricke-samsung71f04e32022-03-16 01:21:21 -05001759 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001760 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001761 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001762 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001763 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001764 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001765 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001766 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001767 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1768 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001769
sfricke-samsung71f04e32022-03-16 01:21:21 -05001770 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001771 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001772 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001773 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001774 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001775 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001776 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001777 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1778 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001779
1780 template <typename RegionType>
1781 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1782 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
sjfricke0bea06e2022-06-05 09:22:26 +09001783 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001784
1785 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1786 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001787 const VkImageBlit *pRegions, VkFilter filter) const override;
1788 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001789 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001790
Jeff Leger178b1e52020-10-05 12:22:23 -04001791 template <typename RegionType>
1792 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1793 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1794 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001795 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1796 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001797 VkFilter filter) override;
1798 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001799 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001800
John Zulauffaea0ee2021-01-14 14:01:32 -07001801 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1802 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1803 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
sjfricke0bea06e2022-06-05 09:22:26 +09001804 CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001805 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1806 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001807
John Zulauffaea0ee2021-01-14 14:01:32 -07001808 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
sjfricke0bea06e2022-06-05 09:22:26 +09001809 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001810 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001811
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001812 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1813 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001814
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001815 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1816 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001817
1818 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001819 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001820 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001821 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001822
1823 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001824 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001825 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001826 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001827
1828 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001829 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001830 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001831 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001832
1833 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001834 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001835 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001836 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001837
locke-lunargff255f92020-05-13 18:53:52 -06001838 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1839 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
sjfricke0bea06e2022-06-05 09:22:26 +09001840 CMD_TYPE cmd_type) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001841 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1842 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001843 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001844 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1845 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001846 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1847 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001848 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001849 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1850 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001851 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001852 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1853 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001854 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001855 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1856 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001857 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001858 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1859 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001860 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001861
locke-lunargff255f92020-05-13 18:53:52 -06001862 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1863 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sjfricke0bea06e2022-06-05 09:22:26 +09001864 uint32_t stride, CMD_TYPE cmd_type) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001865 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1866 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001867 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001868 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1869 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1870 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001871 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1872 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001873 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001874 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1875 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001876 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001877 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1878 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001879 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001880 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1881 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001882 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001883 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1884 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001885 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001886
1887 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1888 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001889 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001890 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1891 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001892 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001893
1894 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1895 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001896 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001897 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1898 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001899 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001900
1901 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1902 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001903 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001904 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1905 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001906 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001907
1908 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001909 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001910 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001911 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001912
1913 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1914 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001915 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001916
locke-lunarge1a67022020-04-29 00:15:36 -06001917 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1918 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001919 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001920
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001921 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001922 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1923 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001924 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001925 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1926 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001927
locke-lunarge1a67022020-04-29 00:15:36 -06001928 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001929 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001930 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001931 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001932
1933 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001934 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001935 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001936 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001937
1938 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1939 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1940
John Zulauf4edde622021-02-15 08:54:50 -07001941 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1942 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001943 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1944 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001945 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1946 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001947 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001948
John Zulauf49beb112020-11-04 16:06:31 -07001949 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1950 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1951
John Zulauf4edde622021-02-15 08:54:50 -07001952 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1953 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001954 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1955 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001956 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001957 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001958
John Zulauf49beb112020-11-04 16:06:31 -07001959 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1960 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1961 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1962 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1963 uint32_t imageMemoryBarrierCount,
1964 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1965 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1966 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1967 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1968 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1969 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001970 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1971 const VkDependencyInfoKHR *pDependencyInfos) const override;
1972 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1973 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001974 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1975 const VkDependencyInfo *pDependencyInfos) const override;
1976 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1977 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001978 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1979 VkDeviceSize dstOffset, uint32_t marker) const override;
1980 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1981 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001982 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1983 const VkCommandBuffer *pCommandBuffers) const override;
1984 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1985 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001986 void PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) override;
1987 void PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) override;
John Zulaufa8700a52022-08-18 16:22:08 -06001988 bool ValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 *pSubmits, VkFence fence,
1989 const char *func_name) const;
John Zulaufbbda4572022-04-19 16:20:45 -06001990 bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1991 VkFence fence) const override;
John Zulaufa8700a52022-08-18 16:22:08 -06001992 void RecordQueueSubmit(VkQueue queue, VkFence fence, VkResult result);
John Zulaufbbda4572022-04-19 16:20:45 -06001993 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence,
1994 VkResult result) override;
1995 bool PreCallValidateQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1996 VkFence fence) const override;
1997 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence,
1998 VkResult result) override;
John Zulaufa8700a52022-08-18 16:22:08 -06001999 bool PreCallValidateQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
2000 VkFence fence) const override;
2001 void PostCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence,
2002 VkResult result) override;
John Zulauf3da08bb2022-08-01 17:56:56 -06002003 void PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) override;
2004 void PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2005 uint64_t timeout, VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06002006};