blob: f73545a8746f188f26077c0f3d5adbc6857210d0 [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
Tony-LunarG4c253372022-01-18 13:51:07 -07002 * Copyright (c) 2019-2022 Valve Corporation
3 * Copyright (c) 2019-2022 LunarG, Inc.
John Zulauf9cb530d2019-09-30 14:14:10 -06004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: John Zulauf <jzulauf@lunarg.com>
John Zulaufab7756b2020-12-29 16:10:16 -070018 * Author: Locke Lin <locke@lunarg.com>
19 * Author: Jeremy Gebben <jeremyg@lunarg.com>
John Zulauf9cb530d2019-09-30 14:14:10 -060020 */
21
22#pragma once
23
John Zulauf7635de32020-05-29 17:14:15 -060024#include <limits>
John Zulauf9cb530d2019-09-30 14:14:10 -060025#include <memory>
John Zulauf9cb530d2019-09-30 14:14:10 -060026#include <vulkan/vulkan.h>
27
28#include "synchronization_validation_types.h"
29#include "state_tracker.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060030#include "cmd_buffer_state.h"
31#include "render_pass_state.h"
John Zulauf9cb530d2019-09-30 14:14:10 -060032
John Zulaufd5115702021-01-18 12:34:33 -070033class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070034class CommandBufferAccessContext;
John Zulauf64ffe552021-02-06 10:25:07 -070035class CommandExecutionContext;
John Zulaufecf4ac52022-06-06 10:08:42 -060036class QueueBatchContext;
John Zulaufdab327f2022-07-08 12:02:05 -060037class RenderPassAccessContext;
John Zulaufd5115702021-01-18 12:34:33 -070038class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060039struct ResourceFirstAccess;
John Zulaufe0757ba2022-06-10 16:51:45 -060040class SyncEventsContext;
41struct SyncEventState;
John Zulaufd5115702021-01-18 12:34:33 -070042class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060043
John Zulaufd0ec59f2021-03-13 14:25:08 -070044using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
45using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
46
John Zulaufecf4ac52022-06-06 10:08:42 -060047using QueueId = uint32_t;
48
John Zulauf2f952d22020-02-10 11:34:51 -070049enum SyncHazard {
50 NONE = 0,
51 READ_AFTER_WRITE,
52 WRITE_AFTER_READ,
53 WRITE_AFTER_WRITE,
54 READ_RACING_WRITE,
55 WRITE_RACING_WRITE,
56 WRITE_RACING_READ,
57};
John Zulauf9cb530d2019-09-30 14:14:10 -060058
John Zulauf8e3c3e92021-01-06 11:19:36 -070059enum class SyncOrdering : uint8_t {
60 kNonAttachment = 0,
61 kColorAttachment = 1,
62 kDepthStencilAttachment = 2,
63 kRaster = 3,
64 kNumOrderings = 4,
65};
66
John Zulauf9cb530d2019-09-30 14:14:10 -060067// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
68struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070069 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060070 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
71 }
John Zulauf1507ee42020-05-18 11:33:09 -060072 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
73 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
74 }
John Zulauf9cb530d2019-09-30 14:14:10 -060075
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070076 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060077 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
78
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070079 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
80 return (stage_access_bit & syncStageAccessWriteMask).any();
81 }
82 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
83 return (stage_access_mask & syncStageAccessWriteMask).any();
84 }
John Zulauf9cb530d2019-09-30 14:14:10 -060085 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070086 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060087 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
88 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070089 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
90 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
91 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
92 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060093 return stage_scope & AccessScopeByAccess(accesses);
94 }
95};
96
John Zulauf14940722021-04-12 15:19:02 -060097struct ResourceUsageRecord {
John Zulauf41a9c7c2021-12-07 15:59:53 -070098 enum class SubcommandType { kNone, kSubpassTransition, kLoadOp, kStoreOp, kResolveOp, kIndex };
99
John Zulauf14940722021-04-12 15:19:02 -0600100 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -0700101 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -0700102 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -0600103 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -0700104 CMD_TYPE command = CMD_NONE;
105 Count seq_num = 0U;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700106 SubcommandType sub_command_type = SubcommandType::kNone;
John Zulauffaea0ee2021-01-14 14:01:32 -0700107 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600108
109 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
110 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600111 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 -0600112 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700113
John Zulauf14940722021-04-12 15:19:02 -0600114 ResourceUsageRecord() = default;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700115 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, SubcommandType sub_type_, Count sub_command_,
116 const CMD_BUFFER_STATE *cb_state_, Count reset_count_)
117 : command(command_),
118 seq_num(seq_num_),
119 sub_command_type(sub_type_),
120 sub_command(sub_command_),
121 cb_state(cb_state_),
122 reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600123};
124
John Zulauf3c2a0b32021-07-14 11:14:52 -0600125// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600126using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600127using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600128
John Zulauf9cb530d2019-09-30 14:14:10 -0600129struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600130 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600131 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600132 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600133 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600134 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600135 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600136 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600137 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600138 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulaufe0757ba2022-06-10 16:51:45 -0600139 bool IsHazard() const { return NONE != hazard; }
John Zulauf9cb530d2019-09-30 14:14:10 -0600140};
141
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700142struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700143 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
144 VkPipelineStageFlags2KHR
145 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
146 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 -0700147 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
148
149 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
150
John Zulauf06f6f1e2022-04-19 15:28:11 -0600151 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask,
152 const VkPipelineStageFlags2KHR disabled_feature_mask = 0);
Jeremy Gebben40a22942020-12-22 14:22:06 -0700153 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700154};
155
John Zulauf3d84f1b2020-03-09 13:33:25 -0600156struct SyncBarrier {
John Zulaufecf4ac52022-06-06 10:08:42 -0600157 struct AllAccess {};
John Zulaufc523bf62021-02-16 08:20:34 -0700158 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600159 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700160 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600161 SyncStageAccessFlags dst_access_scope;
162 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700163 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600164 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700165
166 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufecf4ac52022-06-06 10:08:42 -0600167 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst, const AllAccess &);
John Zulauf06f6f1e2022-04-19 15:28:11 -0600168 SyncBarrier(const SyncExecScope &src_exec, const SyncStageAccessFlags &src_access, const SyncExecScope &dst_exec,
169 const SyncStageAccessFlags &dst_access)
170 : 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 -0700171
172 template <typename Barrier>
173 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
174
175 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700176 // template constructor for sync2 barriers
177 template <typename Barrier>
178 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700179
John Zulaufa0a98292020-09-18 09:30:10 -0600180 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700181 // Note that after merge, only the exec_scope and access_scope fields are fully valid
182 // TODO: Do we need to update any of the other fields? Merging has limited application.
183 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600184 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700185 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600186 dst_access_scope |= other.dst_access_scope;
187 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600188};
John Zulauf69133422020-05-20 14:55:53 -0600189
John Zulauf43cc7462020-12-03 12:33:12 -0700190enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
191
John Zulaufecf4ac52022-06-06 10:08:42 -0600192struct SemaphoreScope : SyncExecScope {
193 SemaphoreScope(QueueId qid, const SyncExecScope &exec_scope) : SyncExecScope(exec_scope), queue(qid) {}
194 SemaphoreScope() = default;
195 QueueId queue;
196};
197
198class SignaledSemaphores {
199 public:
200 // Is the record of a signaled semaphore, deleted when unsignaled
201 struct Signal {
202 Signal() = delete;
203 Signal(const Signal &other) = default;
204 Signal(Signal &&other) = default;
205 Signal &operator=(const Signal &other) = default;
206 Signal &operator=(Signal &&other) = default;
207 Signal(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state_, const std::shared_ptr<QueueBatchContext> &batch_,
208 const SyncExecScope &exec_scope_);
209
210 std::shared_ptr<const SEMAPHORE_STATE> sem_state;
211 std::shared_ptr<QueueBatchContext> batch;
212 // Use the SyncExecScope::valid_accesses for first access scope
213 SemaphoreScope first_scope;
214 // TODO add timeline semaphore support.
215 };
216 using SignalMap = layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>>;
217 using iterator = SignalMap::iterator;
John Zulaufe0757ba2022-06-10 16:51:45 -0600218 using const_iterator = SignalMap::const_iterator;
219 using mapped_type = SignalMap::mapped_type;
John Zulaufecf4ac52022-06-06 10:08:42 -0600220 iterator begin() { return signaled_.begin(); }
John Zulaufe0757ba2022-06-10 16:51:45 -0600221 const_iterator begin() const { return signaled_.begin(); }
John Zulaufecf4ac52022-06-06 10:08:42 -0600222 iterator end() { return signaled_.end(); }
John Zulaufe0757ba2022-06-10 16:51:45 -0600223 const_iterator end() const { return signaled_.end(); }
John Zulaufecf4ac52022-06-06 10:08:42 -0600224
225 bool SignalSemaphore(const std::shared_ptr<const SEMAPHORE_STATE> &sem_state, const std::shared_ptr<QueueBatchContext> &batch,
226 const VkSemaphoreSubmitInfo &signal_info);
227 std::shared_ptr<const Signal> Unsignal(VkSemaphore);
228 void Import(VkSemaphore sem, std::shared_ptr<Signal> &&move_from);
229 void Reset();
230 SignaledSemaphores() : prev_(nullptr) {}
231 SignaledSemaphores(const SignaledSemaphores &prev) : prev_(&prev) {}
232
233 private:
234 std::shared_ptr<const Signal> GetPrev(VkSemaphore sem) const;
235 layer_data::unordered_map<VkSemaphore, std::shared_ptr<Signal>> signaled_;
236 const SignaledSemaphores *prev_; // Allowing this type to act as a writable overlay
237};
238
John Zulauf4fa68462021-04-26 21:04:22 -0600239struct ResourceFirstAccess {
240 ResourceUsageTag tag;
241 SyncStageAccessIndex usage_index;
242 SyncOrdering ordering_rule;
243 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
244 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
245 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
246 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
247 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
248 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
249 bool operator==(const ResourceFirstAccess &rhs) const {
250 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
251 }
252};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600253
John Zulauf1d5f9c12022-05-13 14:51:08 -0600254using QueueId = uint32_t;
John Zulauf9cb530d2019-09-30 14:14:10 -0600255class ResourceAccessState : public SyncStageAccess {
256 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700257 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700258 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700259 SyncStageAccessFlags access_scope;
260 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700261 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700262 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700263 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600264 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
265 exec_scope |= rhs.exec_scope;
266 access_scope |= rhs.access_scope;
267 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700268 }
269 };
John Zulauf4fa68462021-04-26 21:04:22 -0600270 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
271 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700272
John Zulauf9cb530d2019-09-30 14:14:10 -0600273 // Mutliple read operations can be simlutaneously (and independently) synchronized,
274 // given the only the second execution scope creates a dependency chain, we have to track each,
275 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
276 // and applicable one for hazard detection
277 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700278 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600279 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600280 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700281 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf1d5f9c12022-05-13 14:51:08 -0600282 VkPipelineStageFlags2KHR sync_stages; // reads known to have happened after this
John Zulauf9cb530d2019-09-30 14:14:10 -0600283 ResourceUsageTag tag;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600284 QueueId queue;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700285 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
286 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600287 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700288 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf1d5f9c12022-05-13 14:51:08 -0600289 ResourceUsageTag tag_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600290 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600291 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600292 return same;
293 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700294 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700295 // If the read stage is not in the src sync scope
296 // *AND* not execution chained with an existing sync barrier (that's the or)
297 // then the barrier access is unsafe (R/W after R)
298 return (src_exec_scope & (stage | barriers)) == 0;
299 }
John Zulaufe0757ba2022-06-10 16:51:45 -0600300 bool IsReadBarrierHazard(QueueId barrier_queue, VkPipelineStageFlags2KHR src_exec_scope) const {
301 // If the read stage is not in the src sync scope
302 // *AND* not execution chained with an existing sync barrier (that's the or)
303 // then the barrier access is unsafe (R/W after R)
304 VkPipelineStageFlags2 queue_ordered_stage = (queue == barrier_queue) ? stage : VK_PIPELINE_STAGE_2_NONE;
305 return (src_exec_scope & (queue_ordered_stage | barriers)) == 0;
306 }
John Zulauf4a6105a2020-11-17 15:11:05 -0700307
John Zulaufe5da6e52020-03-18 15:32:18 -0600308 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
John Zulaufee984022022-04-13 16:39:50 -0600309 void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
310 ResourceUsageTag tag_);
John Zulaufb7578302022-05-19 13:50:18 -0600311 bool ReadInScopeOrChain(VkPipelineStageFlags2 exec_scope) const { return (exec_scope & (stage | barriers)) != 0; }
John Zulauf00119522022-05-23 19:07:42 -0600312 bool ReadInQueueScopeOrChain(QueueId queue, VkPipelineStageFlags2 exec_scope) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600313 bool ReadInEventScope(VkPipelineStageFlags2 exec_scope, QueueId scope_queue, ResourceUsageTag scope_tag) const {
John Zulaufb7578302022-05-19 13:50:18 -0600314 // If this read is the same one we included in the set event and in scope, then apply the execution barrier...
315 // NOTE: That's not really correct... this read stage might *not* have been included in the setevent, and the barriers
316 // representing the chain might have changed since then (that would be an odd usage), so as a first approximation
317 // we'll assume the barriers *haven't* been changed since (if the tag hasn't), and while this could be a false
318 // positive in the case of Set; SomeBarrier; Wait; we'll live with it until we can add more state to the first scope
319 // capture (the specific write and read stages that *were* in scope at the moment of SetEvents.
John Zulaufe0757ba2022-06-10 16:51:45 -0600320 return (tag < scope_tag) && ReadInQueueScopeOrChain(scope_queue, exec_scope);
John Zulaufb7578302022-05-19 13:50:18 -0600321 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600322 };
323
324 public:
325 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulaufec943ec2022-06-29 07:52:56 -0600326 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, QueueId queue_id) const;
327 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering, QueueId queue_id) const;
328 HazardResult DetectHazard(const ResourceAccessState &recorded_use, QueueId queue_id, const ResourceUsageRange &tag_range) const;
John Zulaufae842002021-04-15 18:20:55 -0600329
330 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
331 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
332 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600333
John Zulaufec943ec2022-06-29 07:52:56 -0600334 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, QueueId queue_id, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700335 const SyncStageAccessFlags &source_access_scope) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600336 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, const ResourceAccessState &scope_state,
337 VkPipelineStageFlags2KHR source_exec_scope, const SyncStageAccessFlags &source_access_scope,
338 QueueId event_queue, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600339
John Zulauf14940722021-04-12 15:19:02 -0600340 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
341 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf1d5f9c12022-05-13 14:51:08 -0600342 void ClearWrite();
343 void ClearRead();
John Zulauf5f13a792020-03-10 07:31:21 -0600344 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600345 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulaufbb890452021-12-14 11:30:18 -0700346 void ApplyBarriersImmediate(const std::vector<SyncBarrier> &barriers);
John Zulaufb7578302022-05-19 13:50:18 -0600347 template <typename ScopeOps>
348 void ApplyBarrier(ScopeOps &&scope, const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600349 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufecf4ac52022-06-06 10:08:42 -0600350 void ApplySemaphore(const SemaphoreScope &signal, const SemaphoreScope wait);
John Zulauf1d5f9c12022-05-13 14:51:08 -0600351
352 struct QueueTagPredicate {
353 QueueId queue;
354 ResourceUsageTag tag;
355 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag);
356 };
357
358 struct QueuePredicate {
359 QueueId queue;
360 QueuePredicate(QueueId queue_) : queue(queue_) {}
361 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag);
362 };
363 struct TagPredicate {
364 ResourceUsageTag tag;
365 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag);
366 };
367
368 template <typename Pred>
369 bool ApplyQueueTagWait(Pred &&);
John Zulaufae842002021-04-15 18:20:55 -0600370 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600371
John Zulauf1d5f9c12022-05-13 14:51:08 -0600372 void OffsetTag(ResourceUsageTag offset);
373 ResourceAccessState();
John Zulauf9cb530d2019-09-30 14:14:10 -0600374
John Zulaufb02c1eb2020-10-06 16:33:36 -0600375 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700376 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600377 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600378 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600379 bool operator==(const ResourceAccessState &rhs) const {
380 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700381 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
382 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700383 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600384 return same;
385 }
386 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700387 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600388 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700389 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700390 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
391 }
John Zulauf1d5f9c12022-05-13 14:51:08 -0600392 void SetQueueId(QueueId id);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600393
John Zulauf00119522022-05-23 19:07:42 -0600394 bool WriteInChain(VkPipelineStageFlags2KHR src_exec_scope) const;
395 bool WriteInScope(const SyncStageAccessFlags &src_access_scope) const;
John Zulaufec943ec2022-06-29 07:52:56 -0600396 bool WriteBarrierInScope(const SyncStageAccessFlags &src_access_scope) const;
397 bool WriteInChainedScope(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const;
John Zulaufb7578302022-05-19 13:50:18 -0600398 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const;
John Zulauf00119522022-05-23 19:07:42 -0600399 bool WriteInQueueSourceScopeOrChain(QueueId queue, VkPipelineStageFlags2KHR src_exec_scope,
400 SyncStageAccessFlags src_access_scope) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600401 bool WriteInEventScope(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope,
402 QueueId scope_queue, ResourceUsageTag scope_tag) const;
John Zulaufb7578302022-05-19 13:50:18 -0600403
404 struct UntaggedScopeOps {
405 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
406 return access.WriteInSourceScopeOrChain(barrier.src_exec_scope.exec_scope, barrier.src_access_scope);
407 }
408 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
409 return read_state.ReadInScopeOrChain(barrier.src_exec_scope.exec_scope);
410 }
411 };
John Zulauf00119522022-05-23 19:07:42 -0600412
413 struct QueueScopeOps {
414 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
415 return access.WriteInQueueSourceScopeOrChain(queue, barrier.src_exec_scope.exec_scope, barrier.src_access_scope);
416 }
417 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
418 return read_state.ReadInQueueScopeOrChain(queue, barrier.src_exec_scope.exec_scope);
419 }
420 QueueScopeOps(QueueId scope_queue) : queue(scope_queue) {}
421 QueueId queue;
422 };
423
John Zulaufb7578302022-05-19 13:50:18 -0600424 struct EventScopeOps {
425 bool WriteInScope(const SyncBarrier &barrier, const ResourceAccessState &access) const {
John Zulaufe0757ba2022-06-10 16:51:45 -0600426 return access.WriteInEventScope(barrier.src_exec_scope.exec_scope, barrier.src_access_scope, scope_queue, scope_tag);
John Zulaufb7578302022-05-19 13:50:18 -0600427 }
428 bool ReadInScope(const SyncBarrier &barrier, const ReadState &read_state) const {
John Zulaufe0757ba2022-06-10 16:51:45 -0600429 return read_state.ReadInEventScope(barrier.src_exec_scope.exec_scope, scope_queue, scope_tag);
John Zulaufb7578302022-05-19 13:50:18 -0600430 }
John Zulaufe0757ba2022-06-10 16:51:45 -0600431 EventScopeOps(QueueId qid, ResourceUsageTag event_tag) : scope_queue(qid), scope_tag(event_tag) {}
432 QueueId scope_queue;
John Zulaufb7578302022-05-19 13:50:18 -0600433 ResourceUsageTag scope_tag;
434 };
435
John Zulauf9cb530d2019-09-30 14:14:10 -0600436 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700437 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700438 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700439 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
John Zulaufec943ec2022-06-29 07:52:56 -0600440
441 // This form is only valid when queue submit order is known...
Jeremy Gebben40a22942020-12-22 14:22:06 -0700442 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600443 // If the previous write is *not* a layout transition
444 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700445 // *AND* the current barrier is not in the dependency chain
446 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
447 // then the barrier access is unsafe (R/W after W)
John Zulaufec943ec2022-06-29 07:52:56 -0600448 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && !WriteInScope(src_access_scope) &&
449 !WriteInChainedScope(src_exec_scope, src_access_scope);
450 }
451
452 bool IsWriteBarrierHazard(QueueId queue_id, VkPipelineStageFlags2KHR src_exec_scope,
453 const SyncStageAccessFlags &src_access_scope) const {
454 if (queue_id == write_queue) {
455 return IsWriteBarrierHazard(src_exec_scope, src_access_scope);
456 }
457 return !WriteInChainedScope(src_exec_scope, src_access_scope);
John Zulauf4a6105a2020-11-17 15:11:05 -0700458 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700459 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700460 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
461 }
John Zulaufd14743a2020-07-03 09:42:39 -0600462
Jeremy Gebben40a22942020-12-22 14:22:06 -0700463 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600464 return stage_mask != (stage_mask & barriers);
465 }
466
Jeremy Gebben40a22942020-12-22 14:22:06 -0700467 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600468 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700469 }
John Zulaufec943ec2022-06-29 07:52:56 -0600470 VkPipelineStageFlags2 GetOrderedStages(QueueId queue_id, const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700471
John Zulauf14940722021-04-12 15:19:02 -0600472 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600473 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700474
John Zulauf8e3c3e92021-01-06 11:19:36 -0700475 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
476 return kOrderingRules[static_cast<size_t>(ordering_enum)];
477 }
John Zulaufd14743a2020-07-03 09:42:39 -0600478
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700479 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600480
John Zulauf9cb530d2019-09-30 14:14:10 -0600481 // With reads, each must be "safe" relative to it's prior write, so we need only
482 // save the most recent write operation (as anything *transitively* unsafe would arleady
483 // be included
484 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700485 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600486 ResourceUsageTag write_tag;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600487 QueueId write_queue;
John Zulauf355e49b2020-04-24 15:11:15 -0600488 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600489
John Zulauff51fbb62020-10-02 14:43:24 -0600490 // TODO Input Attachment cleanup for multiple reads in a given stage
491 // Tracks whether the fragment shader read is input attachment read
492 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600493
Jeremy Gebben40a22942020-12-22 14:22:06 -0700494 VkPipelineStageFlags2KHR last_read_stages;
495 VkPipelineStageFlags2KHR read_execution_barriers;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600496 using ReadStates = small_vector<ReadState, 3, uint32_t>;
497 ReadStates last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600498
499 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700500 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600501 bool pending_layout_transition;
502 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600503 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700504 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700505 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600506 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700507
508 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600509};
John Zulauf22aefed2021-03-11 18:14:35 -0700510using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
511using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600512
John Zulaufe0757ba2022-06-10 16:51:45 -0600513using ResourceAddress = VkDeviceSize;
514using ResourceAccessRangeMap = sparse_container::range_map<ResourceAddress, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700515using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700516using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600517using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600518
John Zulaufd0ec59f2021-03-13 14:25:08 -0700519class AttachmentViewGen {
520 public:
521 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
522 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
523 AttachmentViewGen(const AttachmentViewGen &other) = default;
524 AttachmentViewGen(AttachmentViewGen &&other) = default;
525 AccessAddressType GetAddressType() const;
526 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
527 const ImageRangeGen *GetRangeGen(Gen type) const;
528 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
529 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
530
531 private:
532 using RangeGenStore = layer_data::optional<ImageRangeGen>;
533 const IMAGE_VIEW_STATE *view_ = nullptr;
534 VkImageAspectFlags view_mask_ = 0U;
535 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
536};
537
538using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
539
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700540using SyncMemoryBarrier = SyncBarrier;
541struct SyncBufferMemoryBarrier {
542 using Buffer = std::shared_ptr<const BUFFER_STATE>;
543 Buffer buffer;
544 SyncBarrier barrier;
545 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700546 bool IsLayoutTransition() const { return false; }
547 const ResourceAccessRange &Range() const { return range; };
548 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700549 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
550 : buffer(buffer_), barrier(barrier_), range(range_) {}
551 SyncBufferMemoryBarrier() = default;
552};
553
554struct SyncImageMemoryBarrier {
555 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600556
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700557 Image image;
558 uint32_t index;
559 SyncBarrier barrier;
560 VkImageLayout old_layout;
561 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600562 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700563
564 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600565 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700566 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700567 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
568 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
569 : image(image_),
570 index(index_),
571 barrier(barrier_),
572 old_layout(old_layout_),
573 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600574 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700575 SyncImageMemoryBarrier() = default;
576};
577
John Zulaufbb890452021-12-14 11:30:18 -0700578template <typename SubpassNode>
579struct SubpassBarrierTrackback {
580 std::vector<SyncBarrier> barriers;
581 const SubpassNode *source_subpass = nullptr;
582 SubpassBarrierTrackback() = default;
583 SubpassBarrierTrackback(const SubpassBarrierTrackback &) = default;
584 SubpassBarrierTrackback(const SubpassNode *source_subpass_, VkQueueFlags queue_flags_,
585 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
586 : barriers(), source_subpass(source_subpass_) {
587 barriers.reserve(subpass_dependencies_.size());
588 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
589 assert(dependency);
590 barriers.emplace_back(queue_flags_, *dependency);
591 }
592 }
John Zulauf06f6f1e2022-04-19 15:28:11 -0600593 SubpassBarrierTrackback(const SubpassNode *source_subpass_, const SyncBarrier &barrier_)
594 : barriers(1, barrier_), source_subpass(source_subpass_) {}
John Zulaufbb890452021-12-14 11:30:18 -0700595 SubpassBarrierTrackback &operator=(const SubpassBarrierTrackback &) = default;
596};
597
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700598class SyncOpBase {
599 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900600 SyncOpBase() : cmd_type_(CMD_NONE) {}
601 SyncOpBase(CMD_TYPE cmd_type) : cmd_type_(cmd_type) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600602 virtual ~SyncOpBase() = default;
603
sjfricke0bea06e2022-06-05 09:22:26 +0900604 const char *CmdName() const { return CommandTypeString(cmd_type_); }
John Zulaufbb890452021-12-14 11:30:18 -0700605
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700606 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulaufdab327f2022-07-08 12:02:05 -0600607 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600608 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600609 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const = 0;
610 virtual void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700611
612 protected:
John Zulaufbb890452021-12-14 11:30:18 -0700613 // Only non-null and valid for SyncOps within a render pass instance WIP -- think about how to manage for non RPI calls within
614 // RPI and 2ndarys...
John Zulaufbb890452021-12-14 11:30:18 -0700615 uint32_t subpass_ = VK_SUBPASS_EXTERNAL;
sjfricke0bea06e2022-06-05 09:22:26 +0900616 CMD_TYPE cmd_type_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700617};
618
John Zulaufd5115702021-01-18 12:34:33 -0700619class SyncOpBarriers : public SyncOpBase {
620 protected:
621 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600622 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700623 AccessContext *context);
624 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600625 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700626 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700627
sjfricke0bea06e2022-06-05 09:22:26 +0900628 SyncOpBarriers(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700629 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
630 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
631 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
632 const VkImageMemoryBarrier *pImageMemoryBarriers);
sjfricke0bea06e2022-06-05 09:22:26 +0900633 SyncOpBarriers(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
John Zulauf4edde622021-02-15 08:54:50 -0700634 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700635
John Zulauf8eda1562021-04-13 17:06:41 -0600636 ~SyncOpBarriers() override = default;
637
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700638 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700639 struct BarrierSet {
640 VkDependencyFlags dependency_flags;
641 SyncExecScope src_exec_scope;
642 SyncExecScope dst_exec_scope;
643 std::vector<SyncMemoryBarrier> memory_barriers;
644 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
645 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
646 bool single_exec_scope;
647 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
648 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
649 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
650 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
651 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
652 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
653 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
654 const VkImageMemoryBarrier *pImageMemoryBarriers);
655 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700656 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700657 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700658 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700659 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700660 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700661 };
662 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700663};
664
John Zulaufd5115702021-01-18 12:34:33 -0700665class SyncOpPipelineBarrier : public SyncOpBarriers {
666 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900667 SyncOpPipelineBarrier(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags,
John Zulauf36ef9282021-02-02 11:47:24 -0700668 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
669 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700670 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
671 const VkImageMemoryBarrier *pImageMemoryBarriers);
sjfricke0bea06e2022-06-05 09:22:26 +0900672 SyncOpPipelineBarrier(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags,
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700673 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600674 ~SyncOpPipelineBarrier() override = default;
675
John Zulaufd5115702021-01-18 12:34:33 -0700676 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600677 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600678 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600679 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
680 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700681};
682
683class SyncOpWaitEvents : public SyncOpBarriers {
684 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900685 SyncOpWaitEvents(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
John Zulauf36ef9282021-02-02 11:47:24 -0700686 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
687 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700688 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
689 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700690
sjfricke0bea06e2022-06-05 09:22:26 +0900691 SyncOpWaitEvents(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
John Zulauf4edde622021-02-15 08:54:50 -0700692 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600693 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700694
John Zulaufd5115702021-01-18 12:34:33 -0700695 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600696 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600697 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600698 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
699 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700700
701 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600702 static const char *const kIgnored;
John Zulaufbb890452021-12-14 11:30:18 -0700703 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700704 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
705 // 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 -0700706 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
707 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700708};
709
John Zulauf6ce24372021-01-30 05:56:25 -0700710class SyncOpResetEvent : public SyncOpBase {
711 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900712 SyncOpResetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700713 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600714 ~SyncOpResetEvent() override = default;
715
John Zulauf6ce24372021-01-30 05:56:25 -0700716 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600717 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600718 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600719 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
720 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700721
722 private:
John Zulaufbb890452021-12-14 11:30:18 -0700723 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700724 std::shared_ptr<const EVENT_STATE> event_;
725 SyncExecScope exec_scope_;
726};
727
728class SyncOpSetEvent : public SyncOpBase {
729 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900730 SyncOpSetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulaufe0757ba2022-06-10 16:51:45 -0600731 VkPipelineStageFlags2KHR stageMask, const AccessContext *access_context);
sjfricke0bea06e2022-06-05 09:22:26 +0900732 SyncOpSetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulaufe0757ba2022-06-10 16:51:45 -0600733 const VkDependencyInfoKHR &dep_info, const AccessContext *access_context);
John Zulauf8eda1562021-04-13 17:06:41 -0600734 ~SyncOpSetEvent() override = default;
735
John Zulauf6ce24372021-01-30 05:56:25 -0700736 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600737 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600738 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600739 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
740 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700741
742 private:
John Zulaufbb890452021-12-14 11:30:18 -0700743 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600744 void DoRecord(QueueId queue_id, ResourceUsageTag recorded_tag, const std::shared_ptr<const AccessContext> &access_context,
745 SyncEventsContext *events_context) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700746 std::shared_ptr<const EVENT_STATE> event_;
John Zulaufe0757ba2022-06-10 16:51:45 -0600747 // The Access context of the command buffer at record set event time.
748 std::shared_ptr<const AccessContext> recorded_context_;
John Zulauf6ce24372021-01-30 05:56:25 -0700749 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700750 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600751 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700752};
John Zulauf64ffe552021-02-06 10:25:07 -0700753
754class SyncOpBeginRenderPass : public SyncOpBase {
755 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900756 SyncOpBeginRenderPass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700757 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600758 ~SyncOpBeginRenderPass() override = default;
759
John Zulauf64ffe552021-02-06 10:25:07 -0700760 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600761 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600762 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600763 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
764 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600765 const RenderPassAccessContext *GetRenderPassAccessContext() const { return rp_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700766
767 protected:
768 safe_VkRenderPassBeginInfo renderpass_begin_info_;
769 safe_VkSubpassBeginInfo subpass_begin_info_;
770 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
771 std::vector<const IMAGE_VIEW_STATE *> attachments_;
772 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
John Zulaufdab327f2022-07-08 12:02:05 -0600773 const RenderPassAccessContext *rp_context_;
John Zulauf64ffe552021-02-06 10:25:07 -0700774};
775
776class SyncOpNextSubpass : public SyncOpBase {
777 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900778 SyncOpNextSubpass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700779 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600780 ~SyncOpNextSubpass() override = default;
781
John Zulauf64ffe552021-02-06 10:25:07 -0700782 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600783 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600784 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600785 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
786 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700787
788 protected:
789 safe_VkSubpassBeginInfo subpass_begin_info_;
790 safe_VkSubpassEndInfo subpass_end_info_;
791};
792
793class SyncOpEndRenderPass : public SyncOpBase {
794 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900795 SyncOpEndRenderPass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600796 ~SyncOpEndRenderPass() 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 Zulauf64ffe552021-02-06 10:25:07 -0700803
804 protected:
805 safe_VkSubpassEndInfo subpass_end_info_;
806};
807
John Zulauf540266b2020-04-06 18:54:53 -0600808class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700809 public:
John Zulauf69133422020-05-20 14:55:53 -0600810 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600811 kDetectPrevious = 1U << 0,
812 kDetectAsync = 1U << 1,
813 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600814 };
John Zulauf1d5f9c12022-05-13 14:51:08 -0600815 struct AddressRange {
816 AccessAddressType type;
817 ResourceAccessRange range;
818 AddressRange() = default; // the explicit constructor below isn't needed in 20, but would delete the default.
819 AddressRange(AccessAddressType type_, ResourceAccessRange range_) : type(type_), range(range_) {}
820 };
John Zulauf43cc7462020-12-03 12:33:12 -0700821 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600822
John Zulaufbb890452021-12-14 11:30:18 -0700823 using TrackBack = SubpassBarrierTrackback<AccessContext>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700824
John Zulauf355e49b2020-04-24 15:11:15 -0600825 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600826 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200827 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
828 bool is_depth_sliced) const;
John Zulauf69133422020-05-20 14:55:53 -0600829 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700830 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
831 DetectOptions options) const;
832 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600833 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200834 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced,
835 DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600836 template <typename Detector>
837 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200838 bool is_depth_sliced, DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600839 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200840 const VkImageSubresourceRange &subresource_range, bool is_depth_sliced) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700841 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
842 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
843
John Zulauf69133422020-05-20 14:55:53 -0600844 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700845 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200846 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600847 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
848 VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope,
849 QueueId queue_id, const SyncEventState &sync_event, DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700850 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
851 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700852 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700853 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700854 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700855 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700856 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600857
John Zulaufb02c1eb2020-10-06 16:33:36 -0600858 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600859 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600860
John Zulauf0223f142022-07-06 09:05:39 -0600861 HazardResult DetectFirstUseHazard(QueueId queue_id, const ResourceUsageRange &tag_range,
862 const AccessContext &access_context) const;
John Zulaufae842002021-04-15 18:20:55 -0600863
John Zulaufe5da6e52020-03-18 15:32:18 -0600864 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600865 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600866 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600867 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600868 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700869 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600870 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700871 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600872 for (auto &map : access_state_maps_) {
873 map.clear();
874 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600875 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600876
877 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
878 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600879 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
880 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700881 template <typename BarrierAction>
882 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
883 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700884 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700885 const ResourceAccessState *infill_state,
886 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700887 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600888 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700889 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
890 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600891 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700892 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600893 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
894 bool recur_to_infill = true) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600895 template <typename ResolveOp>
896 void ResolveFromContext(ResolveOp &&resolve_op, const AccessContext &from_context,
897 const ResourceAccessState *infill_state = nullptr, bool recur_to_infill = false);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600898
John Zulauf8e3c3e92021-01-06 11:19:36 -0700899 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600900 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700901 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600902 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
903 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600904 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600905 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700906 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600907 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700908 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600909 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600910 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700911 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600912 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700913 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600914 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600915
John Zulauf540266b2020-04-06 18:54:53 -0600916 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600917
John Zulauf4fa68462021-04-26 21:04:22 -0600918 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700919 template <typename Action, typename RangeGen>
920 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600921 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700922 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600923 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700924 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700925 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600926
John Zulauf1d5f9c12022-05-13 14:51:08 -0600927 void DeleteAccess(const AddressRange &address);
John Zulauf540266b2020-04-06 18:54:53 -0600928 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600929 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600930
931 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600932 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600933
John Zulauf43cc7462020-12-03 12:33:12 -0700934 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
935 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
936 return access_state_maps_[static_cast<size_t>(type)];
937 }
John Zulauf355e49b2020-04-24 15:11:15 -0600938 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
939 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700940 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600941 } else {
942 assert(subpass < prev_by_subpass_.size());
943 return prev_by_subpass_[subpass];
944 }
945 }
John Zulauf16adfc92020-04-08 10:28:33 -0600946
John Zulauf64ffe552021-02-06 10:25:07 -0700947 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700948 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900949 CMD_TYPE cmd_type) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700950 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700951 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900952 CMD_TYPE cmd_type) const;
953 bool ValidateStoreOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700954 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900955 CMD_TYPE cmd_type) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700956 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
sjfricke0bea06e2022-06-05 09:22:26 +0900957 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views, CMD_TYPE cmd_type,
958 uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600959
John Zulauf14940722021-04-12 15:19:02 -0600960 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700961 template <typename Action>
962 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700963
John Zulaufecf4ac52022-06-06 10:08:42 -0600964 // For use during queue submit building up the QueueBatchContext AccessContext for validation, otherwise clear.
John Zulauf06f6f1e2022-04-19 15:28:11 -0600965 void AddAsyncContext(const AccessContext *context);
966 // For use during queue submit to avoid stale pointers;
John Zulauf06f6f1e2022-04-19 15:28:11 -0600967 void ClearAsyncContext(const AccessContext *context) { async_.clear(); }
968
John Zulauf3d84f1b2020-03-09 13:33:25 -0600969 private:
970 template <typename Detector>
John Zulaufe0757ba2022-06-10 16:51:45 -0600971 HazardResult DetectHazard(AccessAddressType type, Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600972 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600973 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700974 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600975 template <typename Detector>
John Zulaufe0757ba2022-06-10 16:51:45 -0600976 HazardResult DetectPreviousHazard(AccessAddressType type, Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700977 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600978 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600979
980 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600981 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600982 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700983 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700984 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600985 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700986 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600987};
988
John Zulaufe0757ba2022-06-10 16:51:45 -0600989struct SyncEventState {
990 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2, MissingSetEvent };
991 using EventPointer = std::shared_ptr<const EVENT_STATE>;
992 using ScopeMap = ResourceAccessRangeMap;
993 EventPointer event;
994 CMD_TYPE last_command; // Only Event commands are valid here.
995 ResourceUsageTag last_command_tag; // Needed to filter replay validation
996 CMD_TYPE unsynchronized_set;
997 VkPipelineStageFlags2KHR barriers;
998 SyncExecScope scope;
999 ResourceUsageTag first_scope_tag;
1000 bool destroyed;
1001 std::shared_ptr<const AccessContext> first_scope;
1002
1003 SyncEventState()
1004 : event(),
1005 last_command(CMD_NONE),
1006 last_command_tag(0),
1007 unsynchronized_set(CMD_NONE),
1008 barriers(0U),
1009 scope(),
1010 first_scope_tag(),
1011 destroyed(true) {}
1012
1013 SyncEventState(const SyncEventState &) = default;
1014 SyncEventState(SyncEventState &&) = default;
1015
1016 SyncEventState(const SyncEventState::EventPointer &event_state) : SyncEventState() {
1017 event = event_state;
1018 destroyed = (event.get() == nullptr) || event_state->Destroyed();
1019 }
1020
1021 void ResetFirstScope();
1022 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope->GetAccessStateMap(address_type); }
1023 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd_type, VkPipelineStageFlags2KHR srcStageMask) const;
1024 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
1025};
1026
1027class SyncEventsContext {
1028 public:
1029 using Map = layer_data::unordered_map<const EVENT_STATE *, std::shared_ptr<SyncEventState>>;
1030 using iterator = Map::iterator;
1031 using const_iterator = Map::const_iterator;
1032
1033 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
1034 const auto find_it = map_.find(event_state.get());
1035 if (find_it == map_.end()) {
1036 if (!event_state.get()) return nullptr;
1037
1038 const auto *event_plain_ptr = event_state.get();
1039 auto sync_state = std::make_shared<SyncEventState>(event_state);
1040 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
1041 return insert_pair.first->second.get();
1042 }
1043 return find_it->second.get();
1044 }
1045
1046 const SyncEventState *Get(const EVENT_STATE *event_state) const {
1047 const auto find_it = map_.find(event_state);
1048 if (find_it == map_.end()) {
1049 return nullptr;
1050 }
1051 return find_it->second.get();
1052 }
1053 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
1054
1055 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst, ResourceUsageTag tag);
1056 void ApplyTaggedWait(VkQueueFlags queue_flags, ResourceUsageTag tag);
1057
1058 // stl style naming for range-for support
1059 inline iterator begin() { return map_.begin(); }
1060 inline const_iterator begin() const { return map_.begin(); }
1061 inline iterator end() { return map_.end(); }
1062 inline const_iterator end() const { return map_.end(); }
1063
1064 void Destroy(const EVENT_STATE *event_state) {
1065 auto sync_it = map_.find(event_state);
1066 if (sync_it != map_.end()) {
1067 sync_it->second->destroyed = true;
1068 map_.erase(sync_it);
1069 }
1070 }
1071 void Clear() { map_.clear(); }
1072
1073 SyncEventsContext &DeepCopy(const SyncEventsContext &from);
1074
1075 private:
1076 Map map_;
1077};
1078
John Zulauf355e49b2020-04-24 15:11:15 -06001079class RenderPassAccessContext {
1080 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -07001081 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
1082 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -07001083 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
1084 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
1085 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -06001086
sjfricke0bea06e2022-06-05 09:22:26 +09001087 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd_buffer,
1088 CMD_TYPE cmd_type) const;
1089 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd_buffer, ResourceUsageTag tag);
1090 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
1091 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
1092 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001093
John Zulauf14940722021-04-12 15:19:02 -06001094 void RecordLayoutTransitions(ResourceUsageTag tag);
1095 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001096 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
1097 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
1098 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -06001099
John Zulauf540266b2020-04-06 18:54:53 -06001100 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
1101 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -06001102 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
1103 uint32_t GetCurrentSubpass() const { return current_subpass_; }
1104 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001105 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -06001106
1107 private:
John Zulauf355e49b2020-04-24 15:11:15 -06001108 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001109 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -06001110 uint32_t current_subpass_;
1111 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -07001112 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001113};
1114
John Zulauf64ffe552021-02-06 10:25:07 -07001115// Command execution context is the base class for command buffer and queue contexts
1116// Preventing unintented leakage of subclass specific state, storing enough information
1117// for message logging.
1118// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
1119class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001120 public:
John Zulauf3c788ef2022-02-22 12:12:30 -07001121 using AccessLog = std::vector<ResourceUsageRecord>;
John Zulauf64ffe552021-02-06 10:25:07 -07001122 CommandExecutionContext() : sync_state_(nullptr) {}
John Zulauf3c788ef2022-02-22 12:12:30 -07001123 CommandExecutionContext(const SyncValidator *sync_validator) : sync_state_(sync_validator) {}
John Zulauf64ffe552021-02-06 10:25:07 -07001124 virtual ~CommandExecutionContext() = default;
John Zulaufbb890452021-12-14 11:30:18 -07001125 virtual AccessContext *GetCurrentAccessContext() = 0;
1126 virtual SyncEventsContext *GetCurrentEventsContext() = 0;
1127 virtual const AccessContext *GetCurrentAccessContext() const = 0;
1128 virtual const SyncEventsContext *GetCurrentEventsContext() const = 0;
John Zulauf00119522022-05-23 19:07:42 -06001129 virtual QueueId GetQueueId() const = 0;
John Zulaufbb890452021-12-14 11:30:18 -07001130
John Zulauf64ffe552021-02-06 10:25:07 -07001131 const SyncValidator &GetSyncState() const {
1132 assert(sync_state_);
1133 return *sync_state_;
1134 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001135
John Zulauf3c788ef2022-02-22 12:12:30 -07001136 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulauf06f6f1e2022-04-19 15:28:11 -06001137 std::string FormatHazard(const HazardResult &hazard) const;
1138
John Zulaufbb890452021-12-14 11:30:18 -07001139 virtual ResourceUsageTag GetTagLimit() const = 0;
1140 virtual VulkanTypedHandle Handle() const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -06001141 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
John Zulauf3c788ef2022-02-22 12:12:30 -07001142 virtual void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) = 0;
John Zulauf64ffe552021-02-06 10:25:07 -07001143
John Zulaufdab327f2022-07-08 12:02:05 -06001144 virtual HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) = 0;
1145 virtual void BeginRenderPassReplay(const SyncOpBeginRenderPass &begin_op, ResourceUsageTag tag) {
1146 assert("Must override if use by derived type is valid" == nullptr);
1147 }
1148 virtual void NextSubpassReplay() { assert("Must override if use by derived type is valid" == nullptr); }
1149 virtual void EndRenderPassReplay() { assert("Must override if use by derived type is valid" == nullptr); }
1150
John Zulauf0223f142022-07-06 09:05:39 -06001151 bool ValidForSyncOps() const;
1152
John Zulauf64ffe552021-02-06 10:25:07 -07001153 protected:
John Zulaufdab327f2022-07-08 12:02:05 -06001154 class ReplayGuard {
1155 public:
1156 ReplayGuard(CommandExecutionContext &exec_context, const CommandBufferAccessContext &recorded_context)
1157 : exec_context_(exec_context) {
1158 exec_context_.BeginCommandBufferReplay(recorded_context);
1159 }
1160 ~ReplayGuard() { exec_context_.EndCommandBufferReplay(); }
1161
1162 private:
1163 CommandExecutionContext &exec_context_;
1164 };
1165 friend ReplayGuard;
1166
John Zulauf3c788ef2022-02-22 12:12:30 -07001167 const SyncValidator *sync_state_;
John Zulaufdab327f2022-07-08 12:02:05 -06001168 const CommandBufferAccessContext *current_replay_;
1169
1170 private:
1171 // Only allow the replay guard to manage the begin/end
1172 void BeginCommandBufferReplay(const CommandBufferAccessContext &recorded) { current_replay_ = &recorded; }
1173 void EndCommandBufferReplay() { current_replay_ = nullptr; }
John Zulauf64ffe552021-02-06 10:25:07 -07001174};
1175
1176class CommandBufferAccessContext : public CommandExecutionContext {
1177 public:
John Zulauf8eda1562021-04-13 17:06:41 -06001178 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
1179 struct SyncOpEntry {
1180 ResourceUsageTag tag;
1181 SyncOpPointer sync_op;
1182 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
1183 SyncOpEntry() = default;
1184 SyncOpEntry(const SyncOpEntry &other) = default;
1185 };
1186
John Zulauf3c788ef2022-02-22 12:12:30 -07001187 CommandBufferAccessContext(const SyncValidator *sync_validator = nullptr)
John Zulauf64ffe552021-02-06 10:25:07 -07001188 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -06001189 cb_state_(),
1190 queue_flags_(),
1191 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -06001192 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -06001193 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -07001194 command_number_(0),
1195 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001196 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001197 cb_access_context_(),
1198 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001199 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001200 render_pass_contexts_(),
1201 current_renderpass_context_(),
1202 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001203 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001204 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001205 cb_state_ = cb_state;
1206 queue_flags_ = queue_flags;
1207 }
John Zulauf4fa68462021-04-26 21:04:22 -06001208
1209 struct AsProxyContext {};
1210 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1211
John Zulauf64ffe552021-02-06 10:25:07 -07001212 ~CommandBufferAccessContext() override = default;
1213 CommandExecutionContext &GetExecutionContext() { return *this; }
1214 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001215
1216 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001217 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001218 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001219 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001220 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001221 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001222 reset_count_++;
1223 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001224 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001225 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001226 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001227 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001228 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001229 void MarkDestroyed() { destroyed_ = true; }
1230 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001231
John Zulauf4fa68462021-04-26 21:04:22 -06001232 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001233 std::string FormatUsage(const ResourceFirstAccess &access) const; // Only command buffers have "first usage"
John Zulaufbb890452021-12-14 11:30:18 -07001234 AccessContext *GetCurrentAccessContext() override { return current_context_; }
1235 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1236 const AccessContext *GetCurrentAccessContext() const override { return current_context_; }
1237 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
John Zulauf00119522022-05-23 19:07:42 -06001238 QueueId GetQueueId() const override;
John Zulaufbb890452021-12-14 11:30:18 -07001239
John Zulauf64ffe552021-02-06 10:25:07 -07001240 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001241 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
sjfricke0bea06e2022-06-05 09:22:26 +09001242 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd_type, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
John Zulauf41a9c7c2021-12-07 15:59:53 -07001243 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulaufd5115702021-01-18 12:34:33 -07001244
sjfricke0bea06e2022-06-05 09:22:26 +09001245 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001246 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001247 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001248 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001249 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001250 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001251 bool ValidateDrawSubpassAttachment(CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001252 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001253 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd_type);
1254 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd_type);
John Zulauf4a6105a2020-11-17 15:11:05 -07001255 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001256
John Zulauf0223f142022-07-06 09:05:39 -06001257 bool ValidateFirstUse(CommandExecutionContext &exec_context, const char *func_name, uint32_t index) const;
sjfricke0bea06e2022-06-05 09:22:26 +09001258 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context);
John Zulauf1d5f9c12022-05-13 14:51:08 -06001259 void ResolveExecutedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
John Zulauf4fa68462021-04-26 21:04:22 -06001260
John Zulaufdab327f2022-07-08 12:02:05 -06001261 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) override;
1262
John Zulauf3d84f1b2020-03-09 13:33:25 -06001263 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1264 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001265
John Zulauf41a9c7c2021-12-07 15:59:53 -07001266 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
John Zulaufbb890452021-12-14 11:30:18 -07001267 ResourceUsageTag GetTagLimit() const override { return access_log_.size(); }
1268 VulkanTypedHandle Handle() const override {
1269 if (cb_state_) {
1270 return cb_state_->Handle();
1271 }
1272 return VulkanTypedHandle(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), kVulkanObjectTypeCommandBuffer);
1273 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001274
John Zulauf41a9c7c2021-12-07 15:59:53 -07001275 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1276 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1277 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001278
John Zulauf3c788ef2022-02-22 12:12:30 -07001279 std::shared_ptr<const CMD_BUFFER_STATE> GetCBStateShared() const { return cb_state_; }
1280
John Zulauffaea0ee2021-01-14 14:01:32 -07001281 const CMD_BUFFER_STATE &GetCBState() const {
1282 assert(cb_state_);
1283 return *(cb_state_.get());
1284 }
1285 CMD_BUFFER_STATE &GetCBState() {
1286 assert(cb_state_);
1287 return *(cb_state_.get());
1288 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001289
John Zulauf1bf30522021-09-03 15:39:06 -06001290 template <class T, class... Args>
1291 void RecordSyncOp(Args &&...args) {
1292 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1293 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
John Zulaufbb890452021-12-14 11:30:18 -07001294 RecordSyncOp(std::move(sync_op)); // Call the non-template version
John Zulauf1bf30522021-09-03 15:39:06 -06001295 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001296 const AccessLog &GetAccessLog() const { return access_log_; }
1297 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001298 const std::vector<SyncOpEntry> &GetSyncOps() const { return sync_ops_; };
John Zulauf8eda1562021-04-13 17:06:41 -06001299
John Zulauf3d84f1b2020-03-09 13:33:25 -06001300 private:
John Zulaufbb890452021-12-14 11:30:18 -07001301 // As this is passing around a shared pointer to record, move to avoid needless atomics.
1302 void RecordSyncOp(SyncOpPointer &&sync_op);
John Zulauf4fa68462021-04-26 21:04:22 -06001303 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1304 VkQueueFlags queue_flags_;
1305 bool destroyed_;
1306
John Zulauf3c788ef2022-02-22 12:12:30 -07001307 AccessLog access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001308 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001309 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001310 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001311 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001312
John Zulauf355e49b2020-04-24 15:11:15 -06001313 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001314 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001315 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001316
1317 // Don't need the following for an active proxy cb context
1318 std::vector<RenderPassAccessContext> render_pass_contexts_;
1319 RenderPassAccessContext *current_renderpass_context_;
1320 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001321};
1322
John Zulauf697c0e12022-04-19 16:31:12 -06001323class QueueSyncState;
1324
1325// Store the ResourceUsageRecords for the global tag range. The prev_ field allows for
1326// const Validation phase access from the cmd state "overlay" seamlessly.
1327class AccessLogger {
1328 public:
1329 struct BatchRecord {
1330 BatchRecord() = default;
1331 BatchRecord(const BatchRecord &other) = default;
1332 BatchRecord(BatchRecord &&other) = default;
1333 BatchRecord(const QueueSyncState *q, uint64_t submit, uint32_t batch)
1334 : queue(q), submit_index(submit), batch_index(batch) {}
1335 BatchRecord &operator=(const BatchRecord &other) = default;
1336 const QueueSyncState *queue;
1337 uint64_t submit_index;
1338 uint32_t batch_index;
1339 };
1340
1341 struct AccessRecord {
1342 const BatchRecord *batch;
1343 const ResourceUsageRecord *record;
1344 bool IsValid() const { return batch && record; }
1345 };
1346
1347 // BatchLog lookup is batch relative, thus the batch doesn't need to track it's offset
1348 class BatchLog {
1349 public:
1350 BatchLog() = default;
1351 BatchLog(const BatchLog &batch) = default;
1352 BatchLog(BatchLog &&other) = default;
1353 BatchLog &operator=(const BatchLog &other) = default;
1354 BatchLog &operator=(BatchLog &&other) = default;
1355 BatchLog(const BatchRecord &batch) : batch_(batch) {}
1356
1357 size_t Size() const { return log_.size(); }
1358 const BatchRecord &GetBatch() const { return batch_; }
1359 AccessRecord operator[](size_t index) const;
1360
1361 void Append(const CommandExecutionContext::AccessLog &other);
1362
1363 private:
1364 BatchRecord batch_;
1365 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
1366 CommandExecutionContext::AccessLog log_;
1367 };
1368
1369 using AccessLogRangeMap = sparse_container::range_map<ResourceUsageTag, BatchLog>;
1370
1371 AccessLogger(const AccessLogger *prev = nullptr) : prev_(prev) {}
1372 // AccessLogger lookup is based on global tags
1373 AccessRecord operator[](ResourceUsageTag tag) const;
1374 BatchLog *AddBatch(const QueueSyncState *queue_state, uint64_t submit_id, uint32_t batch_id, const ResourceUsageRange &range);
1375 void MergeMove(AccessLogger &&child);
1376 void Reset();
1377
1378 private:
1379 const AccessLogger *prev_;
1380 AccessLogRangeMap access_log_map_;
1381};
1382
John Zulauf697c0e12022-04-19 16:31:12 -06001383// TODO need a map from fence to submbit batch id
1384class QueueBatchContext : public CommandExecutionContext {
1385 public:
John Zulaufdab327f2022-07-08 12:02:05 -06001386 struct RenderPassReplayState {
1387 // A minimal subset of the functionality present in the RenderPassAccessContext. Since the accesses are recorded in the
1388 // first_use information of the recorded access contexts, s.t. all we need to support is the barrier/resolve operations
1389 RenderPassReplayState() { Reset(); }
1390 AccessContext *Begin(VkQueueFlags queue_flags, const SyncOpBeginRenderPass &begin_op_,
1391 const AccessContext &external_context);
1392 AccessContext *Next();
1393 void End(AccessContext &external_context);
1394
1395 const SyncOpBeginRenderPass *begin_op = nullptr;
1396 const AccessContext *replay_context = nullptr;
1397 uint32_t subpass = VK_SUBPASS_EXTERNAL;
1398 std::vector<AccessContext> subpass_contexts;
1399 void Reset() {
1400 begin_op = nullptr;
1401 replay_context = nullptr;
1402 subpass = VK_SUBPASS_EXTERNAL;
1403 subpass_contexts.clear();
1404 }
1405 operator bool() const { return begin_op != nullptr; }
1406 };
1407
John Zulauf1d5f9c12022-05-13 14:51:08 -06001408 using ConstBatchSet = layer_data::unordered_set<std::shared_ptr<const QueueBatchContext>>;
1409 using BatchSet = layer_data::unordered_set<std::shared_ptr<QueueBatchContext>>;
1410 static constexpr bool TruePred(const std::shared_ptr<const QueueBatchContext> &) { return true; }
John Zulauf697c0e12022-04-19 16:31:12 -06001411 struct CmdBufferEntry {
1412 uint32_t index = 0;
1413 std::shared_ptr<const CommandBufferAccessContext> cb;
1414 CmdBufferEntry(uint32_t index_, std::shared_ptr<const CommandBufferAccessContext> &&cb_)
1415 : index(index_), cb(std::move(cb_)) {}
1416 };
John Zulauf1d5f9c12022-05-13 14:51:08 -06001417
1418 // For Wait operations we have to
1419 struct QueueWormBase {
1420 std::vector<AccessContext::AddressRange> erase_list;
1421 bool erase_all = true;
1422 };
1423
1424 struct QueueWaitWorm : QueueWormBase {
1425 ResourceAccessState::QueuePredicate predicate;
1426 QueueWaitWorm(QueueId queue_, ResourceUsageTag tag_ = ResourceUsageRecord::kMaxIndex);
1427 void operator()(AccessAddressType address_type, ResourceAccessRangeMap::value_type &access);
1428 };
1429
John Zulauf697c0e12022-04-19 16:31:12 -06001430 using CommandBuffers = std::vector<CmdBufferEntry>;
1431
1432 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulaufdab327f2022-07-08 12:02:05 -06001433 AccessContext *GetCurrentAccessContext() override { return current_access_context_; }
1434 const AccessContext *GetCurrentAccessContext() const override { return current_access_context_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001435 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1436 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1437 const QueueSyncState *GetQueueSyncState() const { return queue_state_; }
1438 VkQueueFlags GetQueueFlags() const;
John Zulauf00119522022-05-23 19:07:42 -06001439 QueueId GetQueueId() const override;
John Zulauf697c0e12022-04-19 16:31:12 -06001440
1441 void SetBatchLog(AccessLogger &loggger, uint64_t sumbit_id, uint32_t batch_id);
1442 void ResetAccessLog() {
1443 logger_ = nullptr;
1444 batch_log_ = nullptr;
1445 }
John Zulaufe0757ba2022-06-10 16:51:45 -06001446 void ResetEventsContext() { events_context_.Clear(); }
John Zulauf697c0e12022-04-19 16:31:12 -06001447 ResourceUsageTag GetTagLimit() const override { return batch_log_->Size() + tag_range_.begin; }
1448 // begin is the tag bias / .size() is the number of total records that should eventually be in access_log_
1449 ResourceUsageRange GetTagRange() const { return tag_range_; }
1450 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
1451
1452 void SetTagBias(ResourceUsageTag);
1453 CommandBuffers::const_iterator begin() const { return command_buffers_.cbegin(); }
1454 CommandBuffers::const_iterator end() const { return command_buffers_.cend(); }
1455
John Zulaufcb7e1672022-05-04 13:46:08 -06001456 QueueBatchContext(const SyncValidator &sync_state, const QueueSyncState &queue_state);
John Zulauf697c0e12022-04-19 16:31:12 -06001457 QueueBatchContext() = delete;
1458
John Zulaufcb7e1672022-05-04 13:46:08 -06001459 template <typename BatchInfo>
1460 void Setup(const std::shared_ptr<const QueueBatchContext> &prev_batch, const BatchInfo &batch_info,
1461 SignaledSemaphores &signaled);
1462
John Zulauf1d5f9c12022-05-13 14:51:08 -06001463 void ResolveSubmittedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
1464
John Zulauf697c0e12022-04-19 16:31:12 -06001465 VulkanTypedHandle Handle() const override;
1466
1467 template <typename BatchInfo, typename Fn>
1468 static void ForEachWaitSemaphore(const BatchInfo &batch_info, Fn &&func);
1469
John Zulauf1d5f9c12022-05-13 14:51:08 -06001470 void ApplyTaggedWait(QueueId queue_id, ResourceUsageTag tag);
1471 void ApplyDeviceWait();
1472
John Zulaufdab327f2022-07-08 12:02:05 -06001473 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) override;
1474 void BeginRenderPassReplay(const SyncOpBeginRenderPass &begin_op, ResourceUsageTag tag) override;
1475 void NextSubpassReplay() override;
1476 void EndRenderPassReplay() override;
1477
John Zulauf697c0e12022-04-19 16:31:12 -06001478 private:
John Zulauf697c0e12022-04-19 16:31:12 -06001479 // The BatchInfo is either the Submit or Submit2 version with traits allowing generic acces
1480 template <typename BatchInfo>
1481 class SubmitInfoAccessor {};
1482 template <typename BatchInfo>
John Zulaufcb7e1672022-05-04 13:46:08 -06001483 void SetupAccessContext(const std::shared_ptr<const QueueBatchContext> &prev, const BatchInfo &batch_info,
1484 SignaledSemaphores &signaled_semaphores);
John Zulauf697c0e12022-04-19 16:31:12 -06001485 template <typename BatchInfo>
1486 void SetupCommandBufferInfo(const BatchInfo &batch_info);
1487
John Zulaufecf4ac52022-06-06 10:08:42 -06001488 std::shared_ptr<QueueBatchContext> ResolveOneWaitSemaphore(VkSemaphore sem, VkPipelineStageFlags2 wait_mask,
1489 SignaledSemaphores &signaled);
John Zulauf697c0e12022-04-19 16:31:12 -06001490
1491 const QueueSyncState *queue_state_ = nullptr;
1492 ResourceUsageRange tag_range_ = ResourceUsageRange(0, 0); // Range of tags referenced by cbs_referenced
1493
1494 AccessContext access_context_;
John Zulaufdab327f2022-07-08 12:02:05 -06001495 AccessContext *current_access_context_;
John Zulauf697c0e12022-04-19 16:31:12 -06001496 SyncEventsContext events_context_;
1497
1498 // Clear these after validation and import
1499 CommandBuffers command_buffers_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001500 ConstBatchSet async_batches_;
John Zulauf697c0e12022-04-19 16:31:12 -06001501 // When null use the global logger
1502 AccessLogger *logger_ = nullptr;
1503 AccessLogger::BatchLog *batch_log_ = nullptr;
John Zulaufdab327f2022-07-08 12:02:05 -06001504 RenderPassReplayState rp_replay_;
John Zulauf697c0e12022-04-19 16:31:12 -06001505};
John Zulaufbbda4572022-04-19 16:20:45 -06001506
1507class QueueSyncState {
1508 public:
John Zulauf1d5f9c12022-05-13 14:51:08 -06001509 constexpr static QueueId kQueueIdBase = QueueId(0);
1510 constexpr static QueueId kQueueIdInvalid = ~kQueueIdBase;
1511 QueueSyncState(const std::shared_ptr<QUEUE_STATE> &queue_state, VkQueueFlags queue_flags, QueueId id)
1512 : submit_index_(0), queue_state_(queue_state), last_batch_(), queue_flags_(queue_flags), id_(id) {}
John Zulaufbbda4572022-04-19 16:20:45 -06001513
1514 VulkanTypedHandle Handle() const {
1515 if (queue_state_) {
1516 return queue_state_->Handle();
1517 }
1518 return VulkanTypedHandle(static_cast<VkQueue>(VK_NULL_HANDLE), kVulkanObjectTypeQueue);
1519 }
1520 std::shared_ptr<const QueueBatchContext> LastBatch() const { return last_batch_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001521 std::shared_ptr<QueueBatchContext> LastBatch() { return last_batch_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001522 void SetLastBatch(std::shared_ptr<QueueBatchContext> &&last);
John Zulaufbbda4572022-04-19 16:20:45 -06001523 QUEUE_STATE *GetQueueState() { return queue_state_.get(); }
1524 const QUEUE_STATE *GetQueueState() const { return queue_state_.get(); }
1525 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001526 QueueId GetQueueId() const { return id_; }
John Zulaufbbda4572022-04-19 16:20:45 -06001527
John Zulauf697c0e12022-04-19 16:31:12 -06001528 uint64_t ReserveSubmitId() const; // Method is const but updates mutable sumbit_index atomically.
1529
John Zulaufbbda4572022-04-19 16:20:45 -06001530 private:
1531 mutable std::atomic<uint64_t> submit_index_;
1532 std::shared_ptr<QUEUE_STATE> queue_state_;
1533 std::shared_ptr<QueueBatchContext> last_batch_;
1534 const VkQueueFlags queue_flags_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001535 QueueId id_;
John Zulaufbbda4572022-04-19 16:20:45 -06001536};
1537
John Zulauf9cb530d2019-09-30 14:14:10 -06001538class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1539 public:
John Zulauf9cb530d2019-09-30 14:14:10 -06001540 using StateTracker = ValidationStateTracker;
John Zulaufea943c52022-02-22 11:05:17 -07001541 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
John Zulauf888bb9d2022-05-20 16:13:00 -06001542 virtual ~SyncValidator() { ResetCommandBufferCallbacks(); };
John Zulauf9cb530d2019-09-30 14:14:10 -06001543
John Zulauf697c0e12022-04-19 16:31:12 -06001544 // Global tag range for submitted command buffers resource usage logs
1545 mutable std::atomic<ResourceUsageTag> tag_limit_{0}; // This is reserved in Validation phase, thus mutable and atomic
1546 ResourceUsageRange ReserveGlobalTagRange(size_t tag_count) const; // Note that the tag_limit_ is mutable this has side effects
1547 // This is a snapshot value only
John Zulauf697c0e12022-04-19 16:31:12 -06001548 AccessLogger global_access_log_;
1549
John Zulaufea943c52022-02-22 11:05:17 -07001550 layer_data::unordered_map<VkCommandBuffer, std::shared_ptr<CommandBufferAccessContext>> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001551
John Zulauf1d5f9c12022-05-13 14:51:08 -06001552 using QueueSyncStatesMap = layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>>;
John Zulaufbbda4572022-04-19 16:20:45 -06001553 layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>> queue_sync_states_;
John Zulaufcb7e1672022-05-04 13:46:08 -06001554 SignaledSemaphores signaled_semaphores_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001555
John Zulaufbbda4572022-04-19 16:20:45 -06001556 const QueueSyncState *GetQueueSyncState(VkQueue queue) const;
1557 QueueSyncState *GetQueueSyncState(VkQueue queue);
1558 std::shared_ptr<const QueueSyncState> GetQueueSyncStateShared(VkQueue queue) const;
1559 std::shared_ptr<QueueSyncState> GetQueueSyncStateShared(VkQueue queue);
1560
John Zulaufe0757ba2022-06-10 16:51:45 -06001561 QueueBatchContext::BatchSet GetQueueBatchSnapshot();
1562
John Zulauf1d5f9c12022-05-13 14:51:08 -06001563 template <typename Predicate>
1564 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot(Predicate &&pred) const;
1565 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot() const {
1566 return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred);
1567 };
1568
1569 template <typename Predicate>
1570 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot(Predicate &&pred);
1571 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot() { return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred); };
John Zulaufbbda4572022-04-19 16:20:45 -06001572
1573 std::shared_ptr<CommandBufferAccessContext> AccessContextFactory(VkCommandBuffer command_buffer);
John Zulaufea943c52022-02-22 11:05:17 -07001574 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer);
1575 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer);
1576 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const;
1577 std::shared_ptr<CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer);
1578 std::shared_ptr<const CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001579
John Zulaufd1f85d42020-04-15 12:23:15 -06001580 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1581 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001582 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sjfricke0bea06e2022-06-05 09:22:26 +09001583 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd_type);
John Zulauf64ffe552021-02-06 10:25:07 -07001584 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001585 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
sjfricke0bea06e2022-06-05 09:22:26 +09001586 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type);
John Zulauf33fc1d52020-07-17 11:01:10 -06001587 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001588
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001589 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001590
John Zulauf355e49b2020-04-24 15:11:15 -06001591 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sjfricke0bea06e2022-06-05 09:22:26 +09001592 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd_type) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001593
1594 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001595 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001596
1597 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001598 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001599
1600 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001601 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001602
John Zulauf9cb530d2019-09-30 14:14:10 -06001603 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001604 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001605
1606 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001607 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001608
John Zulauf4a6105a2020-11-17 15:11:05 -07001609 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001610 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001611 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1612 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001613
Tony-LunarGef035472021-11-02 10:23:33 -06001614 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001615 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001616 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001617
John Zulauf5c5e88d2019-12-26 11:22:02 -07001618 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1619 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001620 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001621
1622 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001623 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001624
Tony-LunarGb61514a2021-11-02 12:36:51 -06001625 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001626 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001627 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001628
Tony-LunarGb61514a2021-11-02 12:36:51 -06001629 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001630 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001631 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001632
John Zulauf9cb530d2019-09-30 14:14:10 -06001633 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1634 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1635 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1636 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1637 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001638 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001639
1640 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1641 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1642 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1643 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001644 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001645
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001646 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1647 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001648 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001649 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001650 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001651
John Zulauf3d84f1b2020-03-09 13:33:25 -06001652 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001653 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001654
1655 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001656 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001657 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001658 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001659 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001660 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001661
Mike Schuchardt2df08912020-12-15 16:28:09 -08001662 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sjfricke0bea06e2022-06-05 09:22:26 +09001663 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001664 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001665 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1666 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1667 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1668 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001669
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001670 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001671 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001672 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001673 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001674 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001675
sjfricke0bea06e2022-06-05 09:22:26 +09001676 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001677 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001678 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1679 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001680
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001681 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1682 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1683 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001684
sfricke-samsung71f04e32022-03-16 01:21:21 -05001685 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001686 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001687 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001688 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001689 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1690 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001691 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001692 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001693 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001694 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1695 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001696
sfricke-samsung71f04e32022-03-16 01:21:21 -05001697 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001698 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001699 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001700 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001701 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001702 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001703 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001704 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001705 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1706 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001707
sfricke-samsung71f04e32022-03-16 01:21:21 -05001708 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001709 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001710 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001711 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001712 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001713 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001714 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001715 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001716 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1717 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001718
sfricke-samsung71f04e32022-03-16 01:21:21 -05001719 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001720 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001721 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001722 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001723 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001724 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001725 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001726 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1727 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001728
1729 template <typename RegionType>
1730 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1731 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
sjfricke0bea06e2022-06-05 09:22:26 +09001732 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001733
1734 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1735 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001736 const VkImageBlit *pRegions, VkFilter filter) const override;
1737 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001738 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001739
Jeff Leger178b1e52020-10-05 12:22:23 -04001740 template <typename RegionType>
1741 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1742 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1743 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001744 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1745 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001746 VkFilter filter) override;
1747 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001748 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001749
John Zulauffaea0ee2021-01-14 14:01:32 -07001750 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1751 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1752 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
sjfricke0bea06e2022-06-05 09:22:26 +09001753 CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001754 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1755 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001756
John Zulauffaea0ee2021-01-14 14:01:32 -07001757 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
sjfricke0bea06e2022-06-05 09:22:26 +09001758 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001759 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001760
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001761 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1762 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001763
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001764 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1765 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001766
1767 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001768 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001769 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001770 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001771
1772 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001773 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001774 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001775 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001776
1777 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001778 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001779 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001780 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001781
1782 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001783 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001784 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001785 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001786
locke-lunargff255f92020-05-13 18:53:52 -06001787 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1788 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
sjfricke0bea06e2022-06-05 09:22:26 +09001789 CMD_TYPE cmd_type) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001790 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1791 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001792 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001793 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1794 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001795 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1796 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001797 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001798 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1799 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001800 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001801 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1802 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001803 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001804 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1805 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001806 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001807 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1808 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001809 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001810
locke-lunargff255f92020-05-13 18:53:52 -06001811 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1812 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sjfricke0bea06e2022-06-05 09:22:26 +09001813 uint32_t stride, CMD_TYPE cmd_type) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001814 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1815 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001816 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001817 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1818 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1819 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001820 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1821 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001822 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001823 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1824 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001825 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001826 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1827 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001828 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001829 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1830 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001831 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001832 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1833 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001834 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001835
1836 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1837 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001838 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001839 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1840 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001841 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001842
1843 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1844 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001845 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001846 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1847 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001848 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001849
1850 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1851 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001852 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001853 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1854 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001855 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001856
1857 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001858 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001859 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001860 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001861
1862 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1863 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001864 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001865
locke-lunarge1a67022020-04-29 00:15:36 -06001866 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1867 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001868 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001869
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001870 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001871 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1872 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001873 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001874 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1875 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001876
locke-lunarge1a67022020-04-29 00:15:36 -06001877 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001878 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001879 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001880 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001881
1882 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001883 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001884 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001885 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001886
1887 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1888 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1889
John Zulauf4edde622021-02-15 08:54:50 -07001890 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1891 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001892 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1893 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001894 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1895 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001896 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001897
John Zulauf49beb112020-11-04 16:06:31 -07001898 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1899 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1900
John Zulauf4edde622021-02-15 08:54:50 -07001901 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1902 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001903 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1904 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001905 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001906 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001907
John Zulauf49beb112020-11-04 16:06:31 -07001908 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1909 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1910 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1911 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1912 uint32_t imageMemoryBarrierCount,
1913 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1914 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1915 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1916 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1917 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1918 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001919 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1920 const VkDependencyInfoKHR *pDependencyInfos) const override;
1921 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1922 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001923 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1924 const VkDependencyInfo *pDependencyInfos) const override;
1925 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1926 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001927 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1928 VkDeviceSize dstOffset, uint32_t marker) const override;
1929 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1930 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001931 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1932 const VkCommandBuffer *pCommandBuffers) const override;
1933 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1934 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001935 void PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) override;
1936 void PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) override;
John Zulaufbbda4572022-04-19 16:20:45 -06001937 bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1938 VkFence fence) const override;
1939 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence,
1940 VkResult result) override;
1941 bool PreCallValidateQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1942 VkFence fence) const override;
1943 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence,
1944 VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001945};