blob: df05aeae523d93b2d0dc6f694f0626554750d994 [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;
John Zulauf3da08bb2022-08-01 17:56:56 -0600355 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600356 };
357
358 struct QueuePredicate {
359 QueueId queue;
360 QueuePredicate(QueueId queue_) : queue(queue_) {}
John Zulauf3da08bb2022-08-01 17:56:56 -0600361 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600362 };
363 struct TagPredicate {
364 ResourceUsageTag tag;
John Zulauf3da08bb2022-08-01 17:56:56 -0600365 bool operator()(QueueId usage_queue, ResourceUsageTag usage_tag) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600366 };
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 Zulauf3da08bb2022-08-01 17:56:56 -0600519struct FenceSyncState {
520 std::shared_ptr<const FENCE_STATE> fence;
521 ResourceUsageTag tag;
522 QueueId queue_id;
523 FenceSyncState();
524 FenceSyncState(const FenceSyncState &other) = default;
525 FenceSyncState(FenceSyncState &&other) = default;
526 FenceSyncState &operator=(const FenceSyncState &other) = default;
527 FenceSyncState &operator=(FenceSyncState &&other) = default;
528
529 FenceSyncState(const std::shared_ptr<const FENCE_STATE> &fence_, ResourceUsageTag tag_, QueueId queue_id_)
530 : fence(fence_), tag(tag_), queue_id(queue_id_) {}
531};
532
John Zulaufd0ec59f2021-03-13 14:25:08 -0700533class AttachmentViewGen {
534 public:
535 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
536 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
537 AttachmentViewGen(const AttachmentViewGen &other) = default;
538 AttachmentViewGen(AttachmentViewGen &&other) = default;
539 AccessAddressType GetAddressType() const;
540 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
541 const ImageRangeGen *GetRangeGen(Gen type) const;
542 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
543 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
544
545 private:
546 using RangeGenStore = layer_data::optional<ImageRangeGen>;
547 const IMAGE_VIEW_STATE *view_ = nullptr;
548 VkImageAspectFlags view_mask_ = 0U;
549 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
550};
551
552using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
553
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700554using SyncMemoryBarrier = SyncBarrier;
555struct SyncBufferMemoryBarrier {
556 using Buffer = std::shared_ptr<const BUFFER_STATE>;
557 Buffer buffer;
558 SyncBarrier barrier;
559 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700560 bool IsLayoutTransition() const { return false; }
561 const ResourceAccessRange &Range() const { return range; };
562 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700563 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
564 : buffer(buffer_), barrier(barrier_), range(range_) {}
565 SyncBufferMemoryBarrier() = default;
566};
567
568struct SyncImageMemoryBarrier {
569 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600570
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700571 Image image;
572 uint32_t index;
573 SyncBarrier barrier;
574 VkImageLayout old_layout;
575 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600576 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700577
578 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600579 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700580 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700581 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
582 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
583 : image(image_),
584 index(index_),
585 barrier(barrier_),
586 old_layout(old_layout_),
587 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600588 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700589 SyncImageMemoryBarrier() = default;
590};
591
John Zulaufbb890452021-12-14 11:30:18 -0700592template <typename SubpassNode>
593struct SubpassBarrierTrackback {
594 std::vector<SyncBarrier> barriers;
595 const SubpassNode *source_subpass = nullptr;
596 SubpassBarrierTrackback() = default;
597 SubpassBarrierTrackback(const SubpassBarrierTrackback &) = default;
598 SubpassBarrierTrackback(const SubpassNode *source_subpass_, VkQueueFlags queue_flags_,
599 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
600 : barriers(), source_subpass(source_subpass_) {
601 barriers.reserve(subpass_dependencies_.size());
602 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
603 assert(dependency);
604 barriers.emplace_back(queue_flags_, *dependency);
605 }
606 }
John Zulauf06f6f1e2022-04-19 15:28:11 -0600607 SubpassBarrierTrackback(const SubpassNode *source_subpass_, const SyncBarrier &barrier_)
608 : barriers(1, barrier_), source_subpass(source_subpass_) {}
John Zulaufbb890452021-12-14 11:30:18 -0700609 SubpassBarrierTrackback &operator=(const SubpassBarrierTrackback &) = default;
610};
611
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700612class SyncOpBase {
613 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900614 SyncOpBase() : cmd_type_(CMD_NONE) {}
615 SyncOpBase(CMD_TYPE cmd_type) : cmd_type_(cmd_type) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600616 virtual ~SyncOpBase() = default;
617
sjfricke0bea06e2022-06-05 09:22:26 +0900618 const char *CmdName() const { return CommandTypeString(cmd_type_); }
John Zulaufbb890452021-12-14 11:30:18 -0700619
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700620 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulaufdab327f2022-07-08 12:02:05 -0600621 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600622 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600623 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const = 0;
624 virtual void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700625
626 protected:
John Zulaufbb890452021-12-14 11:30:18 -0700627 // Only non-null and valid for SyncOps within a render pass instance WIP -- think about how to manage for non RPI calls within
628 // RPI and 2ndarys...
John Zulaufbb890452021-12-14 11:30:18 -0700629 uint32_t subpass_ = VK_SUBPASS_EXTERNAL;
sjfricke0bea06e2022-06-05 09:22:26 +0900630 CMD_TYPE cmd_type_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700631};
632
John Zulaufd5115702021-01-18 12:34:33 -0700633class SyncOpBarriers : public SyncOpBase {
634 protected:
635 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600636 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700637 AccessContext *context);
638 template <typename Barriers, typename FunctorFactory>
John Zulauf00119522022-05-23 19:07:42 -0600639 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, QueueId queue_id, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700640 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700641
sjfricke0bea06e2022-06-05 09:22:26 +0900642 SyncOpBarriers(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700643 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
644 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
645 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
646 const VkImageMemoryBarrier *pImageMemoryBarriers);
sjfricke0bea06e2022-06-05 09:22:26 +0900647 SyncOpBarriers(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
John Zulauf4edde622021-02-15 08:54:50 -0700648 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700649
John Zulauf8eda1562021-04-13 17:06:41 -0600650 ~SyncOpBarriers() override = default;
651
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700652 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700653 struct BarrierSet {
654 VkDependencyFlags dependency_flags;
655 SyncExecScope src_exec_scope;
656 SyncExecScope dst_exec_scope;
657 std::vector<SyncMemoryBarrier> memory_barriers;
658 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
659 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
660 bool single_exec_scope;
661 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
662 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
663 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
664 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
665 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
666 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
667 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
668 const VkImageMemoryBarrier *pImageMemoryBarriers);
669 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700670 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700671 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700672 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700673 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700674 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700675 };
676 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700677};
678
John Zulaufd5115702021-01-18 12:34:33 -0700679class SyncOpPipelineBarrier : public SyncOpBarriers {
680 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900681 SyncOpPipelineBarrier(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags,
John Zulauf36ef9282021-02-02 11:47:24 -0700682 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
683 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700684 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
685 const VkImageMemoryBarrier *pImageMemoryBarriers);
sjfricke0bea06e2022-06-05 09:22:26 +0900686 SyncOpPipelineBarrier(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags,
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700687 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600688 ~SyncOpPipelineBarrier() override = default;
689
John Zulaufd5115702021-01-18 12:34:33 -0700690 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600691 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600692 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600693 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
694 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700695};
696
697class SyncOpWaitEvents : public SyncOpBarriers {
698 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900699 SyncOpWaitEvents(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
John Zulauf36ef9282021-02-02 11:47:24 -0700700 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
701 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700702 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
703 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700704
sjfricke0bea06e2022-06-05 09:22:26 +0900705 SyncOpWaitEvents(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
John Zulauf4edde622021-02-15 08:54:50 -0700706 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600707 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700708
John Zulaufd5115702021-01-18 12:34:33 -0700709 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600710 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600711 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600712 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
713 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700714
715 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600716 static const char *const kIgnored;
John Zulaufbb890452021-12-14 11:30:18 -0700717 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700718 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
719 // 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 -0700720 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
721 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700722};
723
John Zulauf6ce24372021-01-30 05:56:25 -0700724class SyncOpResetEvent : public SyncOpBase {
725 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900726 SyncOpResetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700727 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600728 ~SyncOpResetEvent() override = default;
729
John Zulauf6ce24372021-01-30 05:56:25 -0700730 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600731 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600732 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600733 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
734 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700735
736 private:
John Zulaufbb890452021-12-14 11:30:18 -0700737 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700738 std::shared_ptr<const EVENT_STATE> event_;
739 SyncExecScope exec_scope_;
740};
741
742class SyncOpSetEvent : public SyncOpBase {
743 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900744 SyncOpSetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulaufe0757ba2022-06-10 16:51:45 -0600745 VkPipelineStageFlags2KHR stageMask, const AccessContext *access_context);
sjfricke0bea06e2022-06-05 09:22:26 +0900746 SyncOpSetEvent(CMD_TYPE cmd_type, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulaufe0757ba2022-06-10 16:51:45 -0600747 const VkDependencyInfoKHR &dep_info, const AccessContext *access_context);
John Zulauf8eda1562021-04-13 17:06:41 -0600748 ~SyncOpSetEvent() override = default;
749
John Zulauf6ce24372021-01-30 05:56:25 -0700750 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600751 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600752 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600753 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
754 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700755
756 private:
John Zulaufbb890452021-12-14 11:30:18 -0700757 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600758 void DoRecord(QueueId queue_id, ResourceUsageTag recorded_tag, const std::shared_ptr<const AccessContext> &access_context,
759 SyncEventsContext *events_context) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700760 std::shared_ptr<const EVENT_STATE> event_;
John Zulaufe0757ba2022-06-10 16:51:45 -0600761 // The Access context of the command buffer at record set event time.
762 std::shared_ptr<const AccessContext> recorded_context_;
John Zulauf6ce24372021-01-30 05:56:25 -0700763 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700764 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600765 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700766};
John Zulauf64ffe552021-02-06 10:25:07 -0700767
768class SyncOpBeginRenderPass : public SyncOpBase {
769 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900770 SyncOpBeginRenderPass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700771 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600772 ~SyncOpBeginRenderPass() override = default;
773
John Zulauf64ffe552021-02-06 10:25:07 -0700774 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600775 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600776 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600777 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
778 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600779 const RenderPassAccessContext *GetRenderPassAccessContext() const { return rp_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700780
781 protected:
782 safe_VkRenderPassBeginInfo renderpass_begin_info_;
783 safe_VkSubpassBeginInfo subpass_begin_info_;
784 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
785 std::vector<const IMAGE_VIEW_STATE *> attachments_;
786 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
John Zulaufdab327f2022-07-08 12:02:05 -0600787 const RenderPassAccessContext *rp_context_;
John Zulauf64ffe552021-02-06 10:25:07 -0700788};
789
790class SyncOpNextSubpass : public SyncOpBase {
791 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900792 SyncOpNextSubpass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700793 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600794 ~SyncOpNextSubpass() override = default;
795
John Zulauf64ffe552021-02-06 10:25:07 -0700796 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600797 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600798 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600799 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
800 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700801
802 protected:
803 safe_VkSubpassBeginInfo subpass_begin_info_;
804 safe_VkSubpassEndInfo subpass_end_info_;
805};
806
807class SyncOpEndRenderPass : public SyncOpBase {
808 public:
sjfricke0bea06e2022-06-05 09:22:26 +0900809 SyncOpEndRenderPass(CMD_TYPE cmd_type, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600810 ~SyncOpEndRenderPass() override = default;
811
John Zulauf64ffe552021-02-06 10:25:07 -0700812 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulaufdab327f2022-07-08 12:02:05 -0600813 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -0600814 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf0223f142022-07-06 09:05:39 -0600815 ResourceUsageTag base_tag, CommandExecutionContext &exec_context) const override;
816 void ReplayRecord(CommandExecutionContext &exec_context, ResourceUsageTag tag) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700817
818 protected:
819 safe_VkSubpassEndInfo subpass_end_info_;
820};
821
John Zulauf540266b2020-04-06 18:54:53 -0600822class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700823 public:
John Zulauf69133422020-05-20 14:55:53 -0600824 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600825 kDetectPrevious = 1U << 0,
826 kDetectAsync = 1U << 1,
827 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600828 };
John Zulauf1d5f9c12022-05-13 14:51:08 -0600829 struct AddressRange {
830 AccessAddressType type;
831 ResourceAccessRange range;
832 AddressRange() = default; // the explicit constructor below isn't needed in 20, but would delete the default.
833 AddressRange(AccessAddressType type_, ResourceAccessRange range_) : type(type_), range(range_) {}
834 };
John Zulauf43cc7462020-12-03 12:33:12 -0700835 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600836
John Zulaufbb890452021-12-14 11:30:18 -0700837 using TrackBack = SubpassBarrierTrackback<AccessContext>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700838
John Zulauf355e49b2020-04-24 15:11:15 -0600839 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600840 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200841 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
842 bool is_depth_sliced) const;
John Zulauf69133422020-05-20 14:55:53 -0600843 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700844 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
845 DetectOptions options) const;
846 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600847 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200848 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced,
849 DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600850 template <typename Detector>
851 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200852 bool is_depth_sliced, DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600853 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200854 const VkImageSubresourceRange &subresource_range, bool is_depth_sliced) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700855 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
856 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
857
John Zulauf69133422020-05-20 14:55:53 -0600858 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700859 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
Aitor Camachoe67f2c72022-06-08 14:41:58 +0200860 const VkOffset3D &offset, const VkExtent3D &extent, bool is_depth_sliced) const;
John Zulaufe0757ba2022-06-10 16:51:45 -0600861 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
862 VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope,
863 QueueId queue_id, const SyncEventState &sync_event, DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700864 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
865 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700866 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700867 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700868 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700869 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700870 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600871
John Zulaufb02c1eb2020-10-06 16:33:36 -0600872 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600873 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600874
John Zulauf0223f142022-07-06 09:05:39 -0600875 HazardResult DetectFirstUseHazard(QueueId queue_id, const ResourceUsageRange &tag_range,
876 const AccessContext &access_context) const;
John Zulaufae842002021-04-15 18:20:55 -0600877
John Zulaufe5da6e52020-03-18 15:32:18 -0600878 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600879 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600880 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600881 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600882 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700883 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600884 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700885 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600886 for (auto &map : access_state_maps_) {
887 map.clear();
888 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600889 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600890
891 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
892 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600893 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
894 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700895 template <typename BarrierAction>
896 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
897 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700898 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700899 const ResourceAccessState *infill_state,
900 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700901 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600902 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700903 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
904 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600905 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700906 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600907 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
908 bool recur_to_infill = true) const;
John Zulauf1d5f9c12022-05-13 14:51:08 -0600909 template <typename ResolveOp>
910 void ResolveFromContext(ResolveOp &&resolve_op, const AccessContext &from_context,
911 const ResourceAccessState *infill_state = nullptr, bool recur_to_infill = false);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600912
John Zulauf8e3c3e92021-01-06 11:19:36 -0700913 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600914 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700915 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600916 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
917 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600918 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600919 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700920 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600921 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700922 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600923 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600924 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700925 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600926 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700927 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600928 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600929
John Zulauf540266b2020-04-06 18:54:53 -0600930 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600931
John Zulauf4fa68462021-04-26 21:04:22 -0600932 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700933 template <typename Action, typename RangeGen>
934 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600935 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700936 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600937 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700938 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700939 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600940
John Zulauf1d5f9c12022-05-13 14:51:08 -0600941 void DeleteAccess(const AddressRange &address);
John Zulauf540266b2020-04-06 18:54:53 -0600942 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600943 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600944
945 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600946 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600947
John Zulauf43cc7462020-12-03 12:33:12 -0700948 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
949 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
950 return access_state_maps_[static_cast<size_t>(type)];
951 }
John Zulauf355e49b2020-04-24 15:11:15 -0600952 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
953 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700954 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600955 } else {
956 assert(subpass < prev_by_subpass_.size());
957 return prev_by_subpass_[subpass];
958 }
959 }
John Zulauf16adfc92020-04-08 10:28:33 -0600960
John Zulauf64ffe552021-02-06 10:25:07 -0700961 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700962 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900963 CMD_TYPE cmd_type) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700964 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700965 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900966 CMD_TYPE cmd_type) const;
967 bool ValidateStoreOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700968 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
sjfricke0bea06e2022-06-05 09:22:26 +0900969 CMD_TYPE cmd_type) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700970 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
sjfricke0bea06e2022-06-05 09:22:26 +0900971 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views, CMD_TYPE cmd_type,
972 uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600973
John Zulauf14940722021-04-12 15:19:02 -0600974 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700975 template <typename Action>
976 void ForAll(Action &&action);
John Zulauf3da08bb2022-08-01 17:56:56 -0600977 template <typename Predicate>
978 void EraseIf(Predicate &&pred);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700979
John Zulaufecf4ac52022-06-06 10:08:42 -0600980 // For use during queue submit building up the QueueBatchContext AccessContext for validation, otherwise clear.
John Zulauf06f6f1e2022-04-19 15:28:11 -0600981 void AddAsyncContext(const AccessContext *context);
982 // For use during queue submit to avoid stale pointers;
John Zulauf06f6f1e2022-04-19 15:28:11 -0600983 void ClearAsyncContext(const AccessContext *context) { async_.clear(); }
984
John Zulauf3d84f1b2020-03-09 13:33:25 -0600985 private:
986 template <typename Detector>
John Zulaufe0757ba2022-06-10 16:51:45 -0600987 HazardResult DetectHazard(AccessAddressType type, Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600988 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600989 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700990 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600991 template <typename Detector>
John Zulaufe0757ba2022-06-10 16:51:45 -0600992 HazardResult DetectPreviousHazard(AccessAddressType type, Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700993 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600994 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600995
996 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600997 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600998 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700999 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -07001000 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -06001001 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -07001002 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001003};
1004
John Zulaufe0757ba2022-06-10 16:51:45 -06001005struct SyncEventState {
1006 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2, MissingSetEvent };
1007 using EventPointer = std::shared_ptr<const EVENT_STATE>;
1008 using ScopeMap = ResourceAccessRangeMap;
1009 EventPointer event;
1010 CMD_TYPE last_command; // Only Event commands are valid here.
1011 ResourceUsageTag last_command_tag; // Needed to filter replay validation
1012 CMD_TYPE unsynchronized_set;
1013 VkPipelineStageFlags2KHR barriers;
1014 SyncExecScope scope;
1015 ResourceUsageTag first_scope_tag;
1016 bool destroyed;
1017 std::shared_ptr<const AccessContext> first_scope;
1018
1019 SyncEventState()
1020 : event(),
1021 last_command(CMD_NONE),
1022 last_command_tag(0),
1023 unsynchronized_set(CMD_NONE),
1024 barriers(0U),
1025 scope(),
1026 first_scope_tag(),
1027 destroyed(true) {}
1028
1029 SyncEventState(const SyncEventState &) = default;
1030 SyncEventState(SyncEventState &&) = default;
1031
1032 SyncEventState(const SyncEventState::EventPointer &event_state) : SyncEventState() {
1033 event = event_state;
1034 destroyed = (event.get() == nullptr) || event_state->Destroyed();
1035 }
1036
1037 void ResetFirstScope();
1038 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope->GetAccessStateMap(address_type); }
1039 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd_type, VkPipelineStageFlags2KHR srcStageMask) const;
1040 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
1041};
1042
1043class SyncEventsContext {
1044 public:
1045 using Map = layer_data::unordered_map<const EVENT_STATE *, std::shared_ptr<SyncEventState>>;
1046 using iterator = Map::iterator;
1047 using const_iterator = Map::const_iterator;
1048
1049 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
1050 const auto find_it = map_.find(event_state.get());
1051 if (find_it == map_.end()) {
1052 if (!event_state.get()) return nullptr;
1053
1054 const auto *event_plain_ptr = event_state.get();
1055 auto sync_state = std::make_shared<SyncEventState>(event_state);
1056 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
1057 return insert_pair.first->second.get();
1058 }
1059 return find_it->second.get();
1060 }
1061
1062 const SyncEventState *Get(const EVENT_STATE *event_state) const {
1063 const auto find_it = map_.find(event_state);
1064 if (find_it == map_.end()) {
1065 return nullptr;
1066 }
1067 return find_it->second.get();
1068 }
1069 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
1070
1071 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst, ResourceUsageTag tag);
1072 void ApplyTaggedWait(VkQueueFlags queue_flags, ResourceUsageTag tag);
1073
1074 // stl style naming for range-for support
1075 inline iterator begin() { return map_.begin(); }
1076 inline const_iterator begin() const { return map_.begin(); }
1077 inline iterator end() { return map_.end(); }
1078 inline const_iterator end() const { return map_.end(); }
1079
1080 void Destroy(const EVENT_STATE *event_state) {
1081 auto sync_it = map_.find(event_state);
1082 if (sync_it != map_.end()) {
1083 sync_it->second->destroyed = true;
1084 map_.erase(sync_it);
1085 }
1086 }
1087 void Clear() { map_.clear(); }
1088
1089 SyncEventsContext &DeepCopy(const SyncEventsContext &from);
1090
1091 private:
1092 Map map_;
1093};
1094
John Zulauf355e49b2020-04-24 15:11:15 -06001095class RenderPassAccessContext {
1096 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -07001097 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
1098 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -07001099 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
1100 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
1101 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -06001102
sjfricke0bea06e2022-06-05 09:22:26 +09001103 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd_buffer,
1104 CMD_TYPE cmd_type) const;
1105 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd_buffer, ResourceUsageTag tag);
1106 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
1107 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
1108 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, CMD_TYPE cmd_type) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001109
John Zulauf14940722021-04-12 15:19:02 -06001110 void RecordLayoutTransitions(ResourceUsageTag tag);
1111 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001112 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
1113 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
1114 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -06001115
John Zulauf540266b2020-04-06 18:54:53 -06001116 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
1117 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -06001118 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
1119 uint32_t GetCurrentSubpass() const { return current_subpass_; }
1120 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001121 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -06001122
1123 private:
John Zulauf355e49b2020-04-24 15:11:15 -06001124 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001125 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -06001126 uint32_t current_subpass_;
1127 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -07001128 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001129};
1130
John Zulauf64ffe552021-02-06 10:25:07 -07001131// Command execution context is the base class for command buffer and queue contexts
1132// Preventing unintented leakage of subclass specific state, storing enough information
1133// for message logging.
1134// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
1135class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001136 public:
John Zulauf3c788ef2022-02-22 12:12:30 -07001137 using AccessLog = std::vector<ResourceUsageRecord>;
John Zulauf64ffe552021-02-06 10:25:07 -07001138 CommandExecutionContext() : sync_state_(nullptr) {}
John Zulauf3c788ef2022-02-22 12:12:30 -07001139 CommandExecutionContext(const SyncValidator *sync_validator) : sync_state_(sync_validator) {}
John Zulauf64ffe552021-02-06 10:25:07 -07001140 virtual ~CommandExecutionContext() = default;
John Zulaufbb890452021-12-14 11:30:18 -07001141 virtual AccessContext *GetCurrentAccessContext() = 0;
1142 virtual SyncEventsContext *GetCurrentEventsContext() = 0;
1143 virtual const AccessContext *GetCurrentAccessContext() const = 0;
1144 virtual const SyncEventsContext *GetCurrentEventsContext() const = 0;
John Zulauf00119522022-05-23 19:07:42 -06001145 virtual QueueId GetQueueId() const = 0;
John Zulaufbb890452021-12-14 11:30:18 -07001146
John Zulauf64ffe552021-02-06 10:25:07 -07001147 const SyncValidator &GetSyncState() const {
1148 assert(sync_state_);
1149 return *sync_state_;
1150 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001151
John Zulauf3c788ef2022-02-22 12:12:30 -07001152 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulauf06f6f1e2022-04-19 15:28:11 -06001153 std::string FormatHazard(const HazardResult &hazard) const;
1154
John Zulaufbb890452021-12-14 11:30:18 -07001155 virtual ResourceUsageTag GetTagLimit() const = 0;
1156 virtual VulkanTypedHandle Handle() const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -06001157 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
John Zulauf3c788ef2022-02-22 12:12:30 -07001158 virtual void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) = 0;
John Zulauf64ffe552021-02-06 10:25:07 -07001159
John Zulaufdab327f2022-07-08 12:02:05 -06001160 virtual HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) = 0;
1161 virtual void BeginRenderPassReplay(const SyncOpBeginRenderPass &begin_op, ResourceUsageTag tag) {
1162 assert("Must override if use by derived type is valid" == nullptr);
1163 }
1164 virtual void NextSubpassReplay() { assert("Must override if use by derived type is valid" == nullptr); }
1165 virtual void EndRenderPassReplay() { assert("Must override if use by derived type is valid" == nullptr); }
1166
John Zulauf0223f142022-07-06 09:05:39 -06001167 bool ValidForSyncOps() const;
1168
John Zulauf64ffe552021-02-06 10:25:07 -07001169 protected:
John Zulaufdab327f2022-07-08 12:02:05 -06001170 class ReplayGuard {
1171 public:
1172 ReplayGuard(CommandExecutionContext &exec_context, const CommandBufferAccessContext &recorded_context)
1173 : exec_context_(exec_context) {
1174 exec_context_.BeginCommandBufferReplay(recorded_context);
1175 }
1176 ~ReplayGuard() { exec_context_.EndCommandBufferReplay(); }
1177
1178 private:
1179 CommandExecutionContext &exec_context_;
1180 };
1181 friend ReplayGuard;
1182
John Zulauf3c788ef2022-02-22 12:12:30 -07001183 const SyncValidator *sync_state_;
John Zulaufdab327f2022-07-08 12:02:05 -06001184 const CommandBufferAccessContext *current_replay_;
1185
1186 private:
1187 // Only allow the replay guard to manage the begin/end
1188 void BeginCommandBufferReplay(const CommandBufferAccessContext &recorded) { current_replay_ = &recorded; }
1189 void EndCommandBufferReplay() { current_replay_ = nullptr; }
John Zulauf64ffe552021-02-06 10:25:07 -07001190};
1191
1192class CommandBufferAccessContext : public CommandExecutionContext {
1193 public:
John Zulauf8eda1562021-04-13 17:06:41 -06001194 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
1195 struct SyncOpEntry {
1196 ResourceUsageTag tag;
1197 SyncOpPointer sync_op;
1198 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
1199 SyncOpEntry() = default;
1200 SyncOpEntry(const SyncOpEntry &other) = default;
1201 };
1202
John Zulauf3c788ef2022-02-22 12:12:30 -07001203 CommandBufferAccessContext(const SyncValidator *sync_validator = nullptr)
John Zulauf64ffe552021-02-06 10:25:07 -07001204 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -06001205 cb_state_(),
1206 queue_flags_(),
1207 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -06001208 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -06001209 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -07001210 command_number_(0),
1211 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001212 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001213 cb_access_context_(),
1214 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001215 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001216 render_pass_contexts_(),
1217 current_renderpass_context_(),
1218 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001219 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001220 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001221 cb_state_ = cb_state;
1222 queue_flags_ = queue_flags;
1223 }
John Zulauf4fa68462021-04-26 21:04:22 -06001224
1225 struct AsProxyContext {};
1226 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1227
John Zulauf64ffe552021-02-06 10:25:07 -07001228 ~CommandBufferAccessContext() override = default;
1229 CommandExecutionContext &GetExecutionContext() { return *this; }
1230 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001231
1232 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001233 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001234 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001235 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001236 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001237 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001238 reset_count_++;
1239 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001240 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001241 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001242 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001243 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001244 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001245 void MarkDestroyed() { destroyed_ = true; }
1246 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001247
John Zulauf4fa68462021-04-26 21:04:22 -06001248 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001249 std::string FormatUsage(const ResourceFirstAccess &access) const; // Only command buffers have "first usage"
John Zulaufbb890452021-12-14 11:30:18 -07001250 AccessContext *GetCurrentAccessContext() override { return current_context_; }
1251 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1252 const AccessContext *GetCurrentAccessContext() const override { return current_context_; }
1253 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
John Zulauf00119522022-05-23 19:07:42 -06001254 QueueId GetQueueId() const override;
John Zulaufbb890452021-12-14 11:30:18 -07001255
John Zulauf64ffe552021-02-06 10:25:07 -07001256 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001257 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
sjfricke0bea06e2022-06-05 09:22:26 +09001258 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd_type, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
John Zulauf41a9c7c2021-12-07 15:59:53 -07001259 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulaufd5115702021-01-18 12:34:33 -07001260
sjfricke0bea06e2022-06-05 09:22:26 +09001261 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001262 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001263 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001264 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001265 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001266 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001267 bool ValidateDrawSubpassAttachment(CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001268 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
sjfricke0bea06e2022-06-05 09:22:26 +09001269 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd_type);
1270 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd_type);
John Zulauf4a6105a2020-11-17 15:11:05 -07001271 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001272
John Zulauf0223f142022-07-06 09:05:39 -06001273 bool ValidateFirstUse(CommandExecutionContext &exec_context, const char *func_name, uint32_t index) const;
sjfricke0bea06e2022-06-05 09:22:26 +09001274 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context);
John Zulauf1d5f9c12022-05-13 14:51:08 -06001275 void ResolveExecutedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
John Zulauf4fa68462021-04-26 21:04:22 -06001276
John Zulaufdab327f2022-07-08 12:02:05 -06001277 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) override;
1278
John Zulauf3d84f1b2020-03-09 13:33:25 -06001279 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1280 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001281
John Zulauf41a9c7c2021-12-07 15:59:53 -07001282 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
John Zulaufbb890452021-12-14 11:30:18 -07001283 ResourceUsageTag GetTagLimit() const override { return access_log_.size(); }
1284 VulkanTypedHandle Handle() const override {
1285 if (cb_state_) {
1286 return cb_state_->Handle();
1287 }
1288 return VulkanTypedHandle(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), kVulkanObjectTypeCommandBuffer);
1289 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001290
John Zulauf41a9c7c2021-12-07 15:59:53 -07001291 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1292 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1293 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001294
John Zulauf3c788ef2022-02-22 12:12:30 -07001295 std::shared_ptr<const CMD_BUFFER_STATE> GetCBStateShared() const { return cb_state_; }
1296
John Zulauffaea0ee2021-01-14 14:01:32 -07001297 const CMD_BUFFER_STATE &GetCBState() const {
1298 assert(cb_state_);
1299 return *(cb_state_.get());
1300 }
1301 CMD_BUFFER_STATE &GetCBState() {
1302 assert(cb_state_);
1303 return *(cb_state_.get());
1304 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001305
John Zulauf1bf30522021-09-03 15:39:06 -06001306 template <class T, class... Args>
1307 void RecordSyncOp(Args &&...args) {
1308 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1309 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
John Zulaufbb890452021-12-14 11:30:18 -07001310 RecordSyncOp(std::move(sync_op)); // Call the non-template version
John Zulauf1bf30522021-09-03 15:39:06 -06001311 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001312 const AccessLog &GetAccessLog() const { return access_log_; }
1313 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
John Zulauf06f6f1e2022-04-19 15:28:11 -06001314 const std::vector<SyncOpEntry> &GetSyncOps() const { return sync_ops_; };
John Zulauf8eda1562021-04-13 17:06:41 -06001315
John Zulauf3d84f1b2020-03-09 13:33:25 -06001316 private:
John Zulaufbb890452021-12-14 11:30:18 -07001317 // As this is passing around a shared pointer to record, move to avoid needless atomics.
1318 void RecordSyncOp(SyncOpPointer &&sync_op);
John Zulauf4fa68462021-04-26 21:04:22 -06001319 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1320 VkQueueFlags queue_flags_;
1321 bool destroyed_;
1322
John Zulauf3c788ef2022-02-22 12:12:30 -07001323 AccessLog access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001324 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001325 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001326 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001327 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001328
John Zulauf355e49b2020-04-24 15:11:15 -06001329 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001330 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001331 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001332
1333 // Don't need the following for an active proxy cb context
1334 std::vector<RenderPassAccessContext> render_pass_contexts_;
1335 RenderPassAccessContext *current_renderpass_context_;
1336 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001337};
1338
John Zulauf697c0e12022-04-19 16:31:12 -06001339class QueueSyncState;
1340
1341// Store the ResourceUsageRecords for the global tag range. The prev_ field allows for
1342// const Validation phase access from the cmd state "overlay" seamlessly.
1343class AccessLogger {
1344 public:
1345 struct BatchRecord {
1346 BatchRecord() = default;
1347 BatchRecord(const BatchRecord &other) = default;
1348 BatchRecord(BatchRecord &&other) = default;
1349 BatchRecord(const QueueSyncState *q, uint64_t submit, uint32_t batch)
1350 : queue(q), submit_index(submit), batch_index(batch) {}
1351 BatchRecord &operator=(const BatchRecord &other) = default;
1352 const QueueSyncState *queue;
1353 uint64_t submit_index;
1354 uint32_t batch_index;
1355 };
1356
1357 struct AccessRecord {
1358 const BatchRecord *batch;
1359 const ResourceUsageRecord *record;
1360 bool IsValid() const { return batch && record; }
1361 };
1362
1363 // BatchLog lookup is batch relative, thus the batch doesn't need to track it's offset
1364 class BatchLog {
1365 public:
1366 BatchLog() = default;
1367 BatchLog(const BatchLog &batch) = default;
1368 BatchLog(BatchLog &&other) = default;
1369 BatchLog &operator=(const BatchLog &other) = default;
1370 BatchLog &operator=(BatchLog &&other) = default;
1371 BatchLog(const BatchRecord &batch) : batch_(batch) {}
1372
1373 size_t Size() const { return log_.size(); }
1374 const BatchRecord &GetBatch() const { return batch_; }
1375 AccessRecord operator[](size_t index) const;
1376
1377 void Append(const CommandExecutionContext::AccessLog &other);
1378
1379 private:
1380 BatchRecord batch_;
1381 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
1382 CommandExecutionContext::AccessLog log_;
1383 };
1384
1385 using AccessLogRangeMap = sparse_container::range_map<ResourceUsageTag, BatchLog>;
1386
1387 AccessLogger(const AccessLogger *prev = nullptr) : prev_(prev) {}
1388 // AccessLogger lookup is based on global tags
1389 AccessRecord operator[](ResourceUsageTag tag) const;
1390 BatchLog *AddBatch(const QueueSyncState *queue_state, uint64_t submit_id, uint32_t batch_id, const ResourceUsageRange &range);
1391 void MergeMove(AccessLogger &&child);
1392 void Reset();
1393
1394 private:
1395 const AccessLogger *prev_;
1396 AccessLogRangeMap access_log_map_;
1397};
1398
John Zulauf697c0e12022-04-19 16:31:12 -06001399// TODO need a map from fence to submbit batch id
1400class QueueBatchContext : public CommandExecutionContext {
1401 public:
John Zulaufdab327f2022-07-08 12:02:05 -06001402 struct RenderPassReplayState {
1403 // A minimal subset of the functionality present in the RenderPassAccessContext. Since the accesses are recorded in the
1404 // first_use information of the recorded access contexts, s.t. all we need to support is the barrier/resolve operations
1405 RenderPassReplayState() { Reset(); }
1406 AccessContext *Begin(VkQueueFlags queue_flags, const SyncOpBeginRenderPass &begin_op_,
1407 const AccessContext &external_context);
1408 AccessContext *Next();
1409 void End(AccessContext &external_context);
1410
1411 const SyncOpBeginRenderPass *begin_op = nullptr;
1412 const AccessContext *replay_context = nullptr;
1413 uint32_t subpass = VK_SUBPASS_EXTERNAL;
1414 std::vector<AccessContext> subpass_contexts;
1415 void Reset() {
1416 begin_op = nullptr;
1417 replay_context = nullptr;
1418 subpass = VK_SUBPASS_EXTERNAL;
1419 subpass_contexts.clear();
1420 }
1421 operator bool() const { return begin_op != nullptr; }
1422 };
1423
John Zulauf1d5f9c12022-05-13 14:51:08 -06001424 using ConstBatchSet = layer_data::unordered_set<std::shared_ptr<const QueueBatchContext>>;
1425 using BatchSet = layer_data::unordered_set<std::shared_ptr<QueueBatchContext>>;
1426 static constexpr bool TruePred(const std::shared_ptr<const QueueBatchContext> &) { return true; }
John Zulauf697c0e12022-04-19 16:31:12 -06001427 struct CmdBufferEntry {
1428 uint32_t index = 0;
1429 std::shared_ptr<const CommandBufferAccessContext> cb;
1430 CmdBufferEntry(uint32_t index_, std::shared_ptr<const CommandBufferAccessContext> &&cb_)
1431 : index(index_), cb(std::move(cb_)) {}
1432 };
John Zulauf1d5f9c12022-05-13 14:51:08 -06001433
John Zulauf697c0e12022-04-19 16:31:12 -06001434 using CommandBuffers = std::vector<CmdBufferEntry>;
1435
1436 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulaufdab327f2022-07-08 12:02:05 -06001437 AccessContext *GetCurrentAccessContext() override { return current_access_context_; }
1438 const AccessContext *GetCurrentAccessContext() const override { return current_access_context_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001439 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1440 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1441 const QueueSyncState *GetQueueSyncState() const { return queue_state_; }
1442 VkQueueFlags GetQueueFlags() const;
John Zulauf00119522022-05-23 19:07:42 -06001443 QueueId GetQueueId() const override;
John Zulauf697c0e12022-04-19 16:31:12 -06001444
1445 void SetBatchLog(AccessLogger &loggger, uint64_t sumbit_id, uint32_t batch_id);
1446 void ResetAccessLog() {
1447 logger_ = nullptr;
1448 batch_log_ = nullptr;
1449 }
John Zulaufe0757ba2022-06-10 16:51:45 -06001450 void ResetEventsContext() { events_context_.Clear(); }
John Zulauf697c0e12022-04-19 16:31:12 -06001451 ResourceUsageTag GetTagLimit() const override { return batch_log_->Size() + tag_range_.begin; }
1452 // begin is the tag bias / .size() is the number of total records that should eventually be in access_log_
1453 ResourceUsageRange GetTagRange() const { return tag_range_; }
1454 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
1455
1456 void SetTagBias(ResourceUsageTag);
1457 CommandBuffers::const_iterator begin() const { return command_buffers_.cbegin(); }
1458 CommandBuffers::const_iterator end() const { return command_buffers_.cend(); }
1459
John Zulaufcb7e1672022-05-04 13:46:08 -06001460 QueueBatchContext(const SyncValidator &sync_state, const QueueSyncState &queue_state);
John Zulauf697c0e12022-04-19 16:31:12 -06001461 QueueBatchContext() = delete;
1462
John Zulaufcb7e1672022-05-04 13:46:08 -06001463 template <typename BatchInfo>
1464 void Setup(const std::shared_ptr<const QueueBatchContext> &prev_batch, const BatchInfo &batch_info,
1465 SignaledSemaphores &signaled);
1466
John Zulauf1d5f9c12022-05-13 14:51:08 -06001467 void ResolveSubmittedCommandBuffer(const AccessContext &recorded_context, ResourceUsageTag offset);
1468
John Zulauf697c0e12022-04-19 16:31:12 -06001469 VulkanTypedHandle Handle() const override;
1470
1471 template <typename BatchInfo, typename Fn>
1472 static void ForEachWaitSemaphore(const BatchInfo &batch_info, Fn &&func);
1473
John Zulauf1d5f9c12022-05-13 14:51:08 -06001474 void ApplyTaggedWait(QueueId queue_id, ResourceUsageTag tag);
1475 void ApplyDeviceWait();
1476
John Zulaufdab327f2022-07-08 12:02:05 -06001477 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range) override;
1478 void BeginRenderPassReplay(const SyncOpBeginRenderPass &begin_op, ResourceUsageTag tag) override;
1479 void NextSubpassReplay() override;
1480 void EndRenderPassReplay() override;
1481
John Zulauf697c0e12022-04-19 16:31:12 -06001482 private:
John Zulauf697c0e12022-04-19 16:31:12 -06001483 // The BatchInfo is either the Submit or Submit2 version with traits allowing generic acces
1484 template <typename BatchInfo>
1485 class SubmitInfoAccessor {};
1486 template <typename BatchInfo>
John Zulaufcb7e1672022-05-04 13:46:08 -06001487 void SetupAccessContext(const std::shared_ptr<const QueueBatchContext> &prev, const BatchInfo &batch_info,
1488 SignaledSemaphores &signaled_semaphores);
John Zulauf697c0e12022-04-19 16:31:12 -06001489 template <typename BatchInfo>
1490 void SetupCommandBufferInfo(const BatchInfo &batch_info);
1491
John Zulaufecf4ac52022-06-06 10:08:42 -06001492 std::shared_ptr<QueueBatchContext> ResolveOneWaitSemaphore(VkSemaphore sem, VkPipelineStageFlags2 wait_mask,
1493 SignaledSemaphores &signaled);
John Zulauf697c0e12022-04-19 16:31:12 -06001494
1495 const QueueSyncState *queue_state_ = nullptr;
1496 ResourceUsageRange tag_range_ = ResourceUsageRange(0, 0); // Range of tags referenced by cbs_referenced
1497
1498 AccessContext access_context_;
John Zulaufdab327f2022-07-08 12:02:05 -06001499 AccessContext *current_access_context_;
John Zulauf697c0e12022-04-19 16:31:12 -06001500 SyncEventsContext events_context_;
1501
1502 // Clear these after validation and import
1503 CommandBuffers command_buffers_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001504 ConstBatchSet async_batches_;
John Zulauf697c0e12022-04-19 16:31:12 -06001505 // When null use the global logger
1506 AccessLogger *logger_ = nullptr;
1507 AccessLogger::BatchLog *batch_log_ = nullptr;
John Zulaufdab327f2022-07-08 12:02:05 -06001508 RenderPassReplayState rp_replay_;
John Zulauf697c0e12022-04-19 16:31:12 -06001509};
John Zulaufbbda4572022-04-19 16:20:45 -06001510
1511class QueueSyncState {
1512 public:
John Zulauf1d5f9c12022-05-13 14:51:08 -06001513 constexpr static QueueId kQueueIdBase = QueueId(0);
1514 constexpr static QueueId kQueueIdInvalid = ~kQueueIdBase;
1515 QueueSyncState(const std::shared_ptr<QUEUE_STATE> &queue_state, VkQueueFlags queue_flags, QueueId id)
1516 : submit_index_(0), queue_state_(queue_state), last_batch_(), queue_flags_(queue_flags), id_(id) {}
John Zulaufbbda4572022-04-19 16:20:45 -06001517
1518 VulkanTypedHandle Handle() const {
1519 if (queue_state_) {
1520 return queue_state_->Handle();
1521 }
1522 return VulkanTypedHandle(static_cast<VkQueue>(VK_NULL_HANDLE), kVulkanObjectTypeQueue);
1523 }
1524 std::shared_ptr<const QueueBatchContext> LastBatch() const { return last_batch_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001525 std::shared_ptr<QueueBatchContext> LastBatch() { return last_batch_; }
John Zulauf697c0e12022-04-19 16:31:12 -06001526 void SetLastBatch(std::shared_ptr<QueueBatchContext> &&last);
John Zulaufbbda4572022-04-19 16:20:45 -06001527 QUEUE_STATE *GetQueueState() { return queue_state_.get(); }
1528 const QUEUE_STATE *GetQueueState() const { return queue_state_.get(); }
1529 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauf1d5f9c12022-05-13 14:51:08 -06001530 QueueId GetQueueId() const { return id_; }
John Zulaufbbda4572022-04-19 16:20:45 -06001531
John Zulauf697c0e12022-04-19 16:31:12 -06001532 uint64_t ReserveSubmitId() const; // Method is const but updates mutable sumbit_index atomically.
1533
John Zulaufbbda4572022-04-19 16:20:45 -06001534 private:
1535 mutable std::atomic<uint64_t> submit_index_;
1536 std::shared_ptr<QUEUE_STATE> queue_state_;
1537 std::shared_ptr<QueueBatchContext> last_batch_;
1538 const VkQueueFlags queue_flags_;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001539 QueueId id_;
John Zulaufbbda4572022-04-19 16:20:45 -06001540};
1541
John Zulauf9cb530d2019-09-30 14:14:10 -06001542class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1543 public:
John Zulauf9cb530d2019-09-30 14:14:10 -06001544 using StateTracker = ValidationStateTracker;
John Zulaufea943c52022-02-22 11:05:17 -07001545 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
John Zulauf888bb9d2022-05-20 16:13:00 -06001546 virtual ~SyncValidator() { ResetCommandBufferCallbacks(); };
John Zulauf9cb530d2019-09-30 14:14:10 -06001547
John Zulauf697c0e12022-04-19 16:31:12 -06001548 // Global tag range for submitted command buffers resource usage logs
1549 mutable std::atomic<ResourceUsageTag> tag_limit_{0}; // This is reserved in Validation phase, thus mutable and atomic
1550 ResourceUsageRange ReserveGlobalTagRange(size_t tag_count) const; // Note that the tag_limit_ is mutable this has side effects
1551 // This is a snapshot value only
John Zulauf697c0e12022-04-19 16:31:12 -06001552 AccessLogger global_access_log_;
1553
John Zulaufea943c52022-02-22 11:05:17 -07001554 layer_data::unordered_map<VkCommandBuffer, std::shared_ptr<CommandBufferAccessContext>> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001555
John Zulauf1d5f9c12022-05-13 14:51:08 -06001556 using QueueSyncStatesMap = layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>>;
John Zulaufbbda4572022-04-19 16:20:45 -06001557 layer_data::unordered_map<VkQueue, std::shared_ptr<QueueSyncState>> queue_sync_states_;
John Zulaufcb7e1672022-05-04 13:46:08 -06001558 SignaledSemaphores signaled_semaphores_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001559
John Zulauf3da08bb2022-08-01 17:56:56 -06001560 using SignaledFences = layer_data::unordered_map<VkFence, FenceSyncState>;
1561 using SignaledFence = SignaledFences::value_type;
1562 SignaledFences waitable_fences_;
1563
1564 void ApplyTaggedWait(QueueId queue_id, ResourceUsageTag tag);
1565
1566 void UpdateFenceWaitInfo(VkFence fence, QueueId queue_id, ResourceUsageTag tag);
1567 void WaitForFence(VkFence fence);
1568
John Zulaufbbda4572022-04-19 16:20:45 -06001569 const QueueSyncState *GetQueueSyncState(VkQueue queue) const;
1570 QueueSyncState *GetQueueSyncState(VkQueue queue);
1571 std::shared_ptr<const QueueSyncState> GetQueueSyncStateShared(VkQueue queue) const;
1572 std::shared_ptr<QueueSyncState> GetQueueSyncStateShared(VkQueue queue);
1573
John Zulaufe0757ba2022-06-10 16:51:45 -06001574 QueueBatchContext::BatchSet GetQueueBatchSnapshot();
1575
John Zulauf1d5f9c12022-05-13 14:51:08 -06001576 template <typename Predicate>
1577 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot(Predicate &&pred) const;
1578 QueueBatchContext::ConstBatchSet GetQueueLastBatchSnapshot() const {
1579 return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred);
1580 };
1581
1582 template <typename Predicate>
1583 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot(Predicate &&pred);
1584 QueueBatchContext::BatchSet GetQueueLastBatchSnapshot() { return GetQueueLastBatchSnapshot(QueueBatchContext::TruePred); };
John Zulaufbbda4572022-04-19 16:20:45 -06001585
1586 std::shared_ptr<CommandBufferAccessContext> AccessContextFactory(VkCommandBuffer command_buffer);
John Zulaufea943c52022-02-22 11:05:17 -07001587 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer);
1588 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer);
1589 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const;
1590 std::shared_ptr<CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer);
1591 std::shared_ptr<const CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001592
John Zulaufd1f85d42020-04-15 12:23:15 -06001593 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1594 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001595 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sjfricke0bea06e2022-06-05 09:22:26 +09001596 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd_type);
John Zulauf64ffe552021-02-06 10:25:07 -07001597 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001598 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
sjfricke0bea06e2022-06-05 09:22:26 +09001599 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type);
John Zulauf33fc1d52020-07-17 11:01:10 -06001600 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001601
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001602 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001603
John Zulauf355e49b2020-04-24 15:11:15 -06001604 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sjfricke0bea06e2022-06-05 09:22:26 +09001605 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd_type) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001606
1607 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001608 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001609
1610 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001611 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001612
1613 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001614 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001615
John Zulauf9cb530d2019-09-30 14:14:10 -06001616 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001617 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001618
1619 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001620 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001621
John Zulauf4a6105a2020-11-17 15:11:05 -07001622 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001623 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001624 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1625 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001626
Tony-LunarGef035472021-11-02 10:23:33 -06001627 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001628 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001629 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001630
John Zulauf5c5e88d2019-12-26 11:22:02 -07001631 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1632 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001633 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001634
1635 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001636 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001637
Tony-LunarGb61514a2021-11-02 12:36:51 -06001638 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001639 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001640 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001641
Tony-LunarGb61514a2021-11-02 12:36:51 -06001642 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001643 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001644 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001645
John Zulauf9cb530d2019-09-30 14:14:10 -06001646 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1647 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1648 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1649 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1650 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001651 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001652
1653 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1654 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1655 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1656 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001657 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001658
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001659 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1660 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001661 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001662 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001663 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001664
John Zulauf3d84f1b2020-03-09 13:33:25 -06001665 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001666 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001667
1668 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001669 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001670 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001671 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001672 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001673 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001674
Mike Schuchardt2df08912020-12-15 16:28:09 -08001675 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sjfricke0bea06e2022-06-05 09:22:26 +09001676 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001677 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001678 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1679 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1680 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1681 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001682
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001683 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001684 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001685 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001686 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001687 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001688
sjfricke0bea06e2022-06-05 09:22:26 +09001689 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001690 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001691 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1692 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001693
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001694 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1695 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1696 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001697
sfricke-samsung71f04e32022-03-16 01:21:21 -05001698 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001699 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001700 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001701 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001702 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1703 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001704 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001705 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001706 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001707 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1708 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001709
sfricke-samsung71f04e32022-03-16 01:21:21 -05001710 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001711 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001712 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001713 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001714 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001715 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001716 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001717 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001718 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1719 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001720
sfricke-samsung71f04e32022-03-16 01:21:21 -05001721 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001722 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001723 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001724 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001725 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001726 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001727 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001728 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001729 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1730 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001731
sfricke-samsung71f04e32022-03-16 01:21:21 -05001732 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001733 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001734 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001735 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001736 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001737 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001738 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001739 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1740 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001741
1742 template <typename RegionType>
1743 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1744 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
sjfricke0bea06e2022-06-05 09:22:26 +09001745 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001746
1747 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1748 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001749 const VkImageBlit *pRegions, VkFilter filter) const override;
1750 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001751 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001752
Jeff Leger178b1e52020-10-05 12:22:23 -04001753 template <typename RegionType>
1754 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1755 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1756 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001757 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1758 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001759 VkFilter filter) override;
1760 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001761 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001762
John Zulauffaea0ee2021-01-14 14:01:32 -07001763 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1764 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1765 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
sjfricke0bea06e2022-06-05 09:22:26 +09001766 CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001767 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1768 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001769
John Zulauffaea0ee2021-01-14 14:01:32 -07001770 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
sjfricke0bea06e2022-06-05 09:22:26 +09001771 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, CMD_TYPE cmd_type) const;
John Zulauf14940722021-04-12 15:19:02 -06001772 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001773
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001774 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1775 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001776
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001777 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1778 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001779
1780 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001781 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001782 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001783 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001784
1785 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001786 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001787 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001788 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001789
1790 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001791 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001792 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001793 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001794
1795 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001796 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001797 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001798 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001799
locke-lunargff255f92020-05-13 18:53:52 -06001800 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1801 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
sjfricke0bea06e2022-06-05 09:22:26 +09001802 CMD_TYPE cmd_type) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001803 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1804 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001805 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001806 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1807 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001808 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1809 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001810 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001811 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1812 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001813 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001814 void PreCallRecordCmdDrawIndirectCountKHR(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) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001817 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1818 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001819 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001820 void PreCallRecordCmdDrawIndirectCountAMD(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
locke-lunargff255f92020-05-13 18:53:52 -06001824 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1825 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sjfricke0bea06e2022-06-05 09:22:26 +09001826 uint32_t stride, CMD_TYPE cmd_type) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001827 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1828 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001829 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001830 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1831 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1832 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001833 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1834 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001835 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001836 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1837 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001838 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001839 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1840 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001841 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001842 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1843 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001844 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001845 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1846 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001847 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001848
1849 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1850 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001851 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001852 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1853 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001854 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001855
1856 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1857 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001858 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001859 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1860 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001861 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001862
1863 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1864 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001865 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001866 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1867 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001868 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001869
1870 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001871 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001872 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001873 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001874
1875 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1876 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001877 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001878
locke-lunarge1a67022020-04-29 00:15:36 -06001879 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1880 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001881 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001882
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001883 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001884 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1885 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001886 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001887 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1888 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001889
locke-lunarge1a67022020-04-29 00:15:36 -06001890 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001891 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001892 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001893 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001894
1895 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001896 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001897 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001898 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001899
1900 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1901 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1902
John Zulauf4edde622021-02-15 08:54:50 -07001903 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1904 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001905 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1906 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001907 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1908 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001909 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001910
John Zulauf49beb112020-11-04 16:06:31 -07001911 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1912 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1913
John Zulauf4edde622021-02-15 08:54:50 -07001914 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1915 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001916 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1917 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001918 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001919 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001920
John Zulauf49beb112020-11-04 16:06:31 -07001921 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1922 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1923 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1924 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1925 uint32_t imageMemoryBarrierCount,
1926 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1927 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1928 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1929 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1930 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1931 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001932 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1933 const VkDependencyInfoKHR *pDependencyInfos) const override;
1934 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1935 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001936 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1937 const VkDependencyInfo *pDependencyInfos) const override;
1938 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1939 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001940 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1941 VkDeviceSize dstOffset, uint32_t marker) const override;
1942 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1943 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001944 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1945 const VkCommandBuffer *pCommandBuffers) const override;
1946 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1947 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf1d5f9c12022-05-13 14:51:08 -06001948 void PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) override;
1949 void PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) override;
John Zulaufbbda4572022-04-19 16:20:45 -06001950 bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1951 VkFence fence) const override;
1952 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence,
1953 VkResult result) override;
1954 bool PreCallValidateQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1955 VkFence fence) const override;
1956 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits, VkFence fence,
1957 VkResult result) override;
John Zulauf3da08bb2022-08-01 17:56:56 -06001958 void PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) override;
1959 void PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
1960 uint64_t timeout, VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001961};