blob: 53121885e4584b231e18424a2c8d8af01fff9e43 [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
Tony-LunarG4c253372022-01-18 13:51:07 -07002 * Copyright (c) 2019-2022 Valve Corporation
3 * Copyright (c) 2019-2022 LunarG, Inc.
John Zulauf9cb530d2019-09-30 14:14:10 -06004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 * Author: John Zulauf <jzulauf@lunarg.com>
John Zulaufab7756b2020-12-29 16:10:16 -070018 * Author: Locke Lin <locke@lunarg.com>
19 * Author: Jeremy Gebben <jeremyg@lunarg.com>
John Zulauf9cb530d2019-09-30 14:14:10 -060020 */
21
22#pragma once
23
John Zulauf7635de32020-05-29 17:14:15 -060024#include <limits>
John Zulauf9cb530d2019-09-30 14:14:10 -060025#include <memory>
John Zulauf9cb530d2019-09-30 14:14:10 -060026#include <vulkan/vulkan.h>
27
28#include "synchronization_validation_types.h"
29#include "state_tracker.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060030#include "cmd_buffer_state.h"
31#include "render_pass_state.h"
John Zulauf9cb530d2019-09-30 14:14:10 -060032
John Zulaufd5115702021-01-18 12:34:33 -070033class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070034class CommandBufferAccessContext;
John Zulauf64ffe552021-02-06 10:25:07 -070035class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070036class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060037struct ResourceFirstAccess;
John Zulaufd5115702021-01-18 12:34:33 -070038class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060039
John Zulaufd0ec59f2021-03-13 14:25:08 -070040using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
41using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
42
John Zulauf2f952d22020-02-10 11:34:51 -070043enum SyncHazard {
44 NONE = 0,
45 READ_AFTER_WRITE,
46 WRITE_AFTER_READ,
47 WRITE_AFTER_WRITE,
48 READ_RACING_WRITE,
49 WRITE_RACING_WRITE,
50 WRITE_RACING_READ,
51};
John Zulauf9cb530d2019-09-30 14:14:10 -060052
John Zulauf8e3c3e92021-01-06 11:19:36 -070053enum class SyncOrdering : uint8_t {
54 kNonAttachment = 0,
55 kColorAttachment = 1,
56 kDepthStencilAttachment = 2,
57 kRaster = 3,
58 kNumOrderings = 4,
59};
60
John Zulauf9cb530d2019-09-30 14:14:10 -060061// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
62struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070063 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060064 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
65 }
John Zulauf1507ee42020-05-18 11:33:09 -060066 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
67 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
68 }
John Zulauf9cb530d2019-09-30 14:14:10 -060069
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070070 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060071 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
72
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070073 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
74 return (stage_access_bit & syncStageAccessWriteMask).any();
75 }
76 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
77 return (stage_access_mask & syncStageAccessWriteMask).any();
78 }
John Zulauf9cb530d2019-09-30 14:14:10 -060079 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070080 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060081 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
82 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070083 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
84 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
85 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
86 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060087 return stage_scope & AccessScopeByAccess(accesses);
88 }
89};
90
John Zulauf14940722021-04-12 15:19:02 -060091struct ResourceUsageRecord {
John Zulauf41a9c7c2021-12-07 15:59:53 -070092 enum class SubcommandType { kNone, kSubpassTransition, kLoadOp, kStoreOp, kResolveOp, kIndex };
93
John Zulauf14940722021-04-12 15:19:02 -060094 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070095 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070096 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -060097 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070098 CMD_TYPE command = CMD_NONE;
99 Count seq_num = 0U;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700100 SubcommandType sub_command_type = SubcommandType::kNone;
John Zulauffaea0ee2021-01-14 14:01:32 -0700101 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600102
103 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
104 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600105 const CMD_BUFFER_STATE *cb_state = nullptr; // plain pointer as a shared pointer is held by the context storing this record
John Zulauf3c2a0b32021-07-14 11:14:52 -0600106 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700107
John Zulauf14940722021-04-12 15:19:02 -0600108 ResourceUsageRecord() = default;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700109 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, SubcommandType sub_type_, Count sub_command_,
110 const CMD_BUFFER_STATE *cb_state_, Count reset_count_)
111 : command(command_),
112 seq_num(seq_num_),
113 sub_command_type(sub_type_),
114 sub_command(sub_command_),
115 cb_state(cb_state_),
116 reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600117};
118
John Zulauf3c2a0b32021-07-14 11:14:52 -0600119// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600120using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600121using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600122
John Zulauf9cb530d2019-09-30 14:14:10 -0600123struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600124 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600125 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600126 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600127 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600128 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600129 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600130 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600131 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600132 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulauf9cb530d2019-09-30 14:14:10 -0600133};
134
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700135struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700136 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
137 VkPipelineStageFlags2KHR
138 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
139 VkPipelineStageFlags2KHR exec_scope; // all earlier or later stages that would be affected by a barrier using this scope.
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700140 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
141
142 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
143
Jeremy Gebben40a22942020-12-22 14:22:06 -0700144 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
145 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700146};
147
John Zulauf3d84f1b2020-03-09 13:33:25 -0600148struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700149 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600150 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700151 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600152 SyncStageAccessFlags dst_access_scope;
153 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700154 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600155 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700156
157 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
158
159 template <typename Barrier>
160 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
161
162 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700163 // template constructor for sync2 barriers
164 template <typename Barrier>
165 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700166
John Zulaufa0a98292020-09-18 09:30:10 -0600167 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700168 // Note that after merge, only the exec_scope and access_scope fields are fully valid
169 // TODO: Do we need to update any of the other fields? Merging has limited application.
170 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600171 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700172 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600173 dst_access_scope |= other.dst_access_scope;
174 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600175};
John Zulauf69133422020-05-20 14:55:53 -0600176
John Zulauf43cc7462020-12-03 12:33:12 -0700177enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
178
John Zulauf4a6105a2020-11-17 15:11:05 -0700179struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700180 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700181 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700182 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
183 EventPointer event;
184 CMD_TYPE last_command; // Only Event commands are valid here.
John Zulauf610e28c2021-08-03 17:46:23 -0600185 ResourceUsageTag last_command_tag; // Needed to filter replay validation
John Zulauf4a6105a2020-11-17 15:11:05 -0700186 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700187 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700188 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700189 ResourceUsageTag first_scope_tag;
John Zulauf78b1f892021-09-20 15:02:09 -0600190 bool first_scope_set;
John Zulaufd5115702021-01-18 12:34:33 -0700191 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700192 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700193 template <typename EventPointerType>
194 SyncEventState(EventPointerType &&event_state)
195 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700196 last_command(CMD_NONE),
John Zulauf610e28c2021-08-03 17:46:23 -0600197 last_command_tag(0),
John Zulaufd5115702021-01-18 12:34:33 -0700198 unsynchronized_set(CMD_NONE),
199 barriers(0U),
200 scope(),
201 first_scope_tag(),
John Zulauf78b1f892021-09-20 15:02:09 -0600202 first_scope_set(false),
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600203 destroyed((event_state.get() == nullptr) || event_state->Destroyed()) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700204 SyncEventState() : SyncEventState(EventPointer()) {}
205 void ResetFirstScope();
206 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700207 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700208 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700209};
John Zulaufea943c52022-02-22 11:05:17 -0700210
John Zulauf669dfd52021-01-27 17:15:28 -0700211class SyncEventsContext {
212 public:
John Zulaufea943c52022-02-22 11:05:17 -0700213 using Map = layer_data::unordered_map<const EVENT_STATE *, std::shared_ptr<SyncEventState>>;
John Zulauf669dfd52021-01-27 17:15:28 -0700214 using iterator = Map::iterator;
215 using const_iterator = Map::const_iterator;
216
217 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
218 const auto find_it = map_.find(event_state.get());
219 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700220 if (!event_state.get()) return nullptr;
221
John Zulauf669dfd52021-01-27 17:15:28 -0700222 const auto *event_plain_ptr = event_state.get();
John Zulaufea943c52022-02-22 11:05:17 -0700223 auto sync_state = std::shared_ptr<SyncEventState>(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700224 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700225 return insert_pair.first->second.get();
226 }
227 return find_it->second.get();
228 }
229
230 const SyncEventState *Get(const EVENT_STATE *event_state) const {
231 const auto find_it = map_.find(event_state);
232 if (find_it == map_.end()) {
233 return nullptr;
234 }
235 return find_it->second.get();
236 }
John Zulauf6ce24372021-01-30 05:56:25 -0700237 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700238
John Zulauf8eda1562021-04-13 17:06:41 -0600239 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst);
240
John Zulauf669dfd52021-01-27 17:15:28 -0700241 // stl style naming for range-for support
242 inline iterator begin() { return map_.begin(); }
243 inline const_iterator begin() const { return map_.begin(); }
244 inline iterator end() { return map_.end(); }
245 inline const_iterator end() const { return map_.end(); }
246
247 void Destroy(const EVENT_STATE *event_state) {
248 auto sync_it = map_.find(event_state);
249 if (sync_it != map_.end()) {
250 sync_it->second->destroyed = true;
251 map_.erase(sync_it);
252 }
253 }
254 void Clear() { map_.clear(); }
255
256 private:
257 Map map_;
258};
John Zulauf4a6105a2020-11-17 15:11:05 -0700259
John Zulauf4fa68462021-04-26 21:04:22 -0600260struct ResourceFirstAccess {
261 ResourceUsageTag tag;
262 SyncStageAccessIndex usage_index;
263 SyncOrdering ordering_rule;
264 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
265 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
266 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
267 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
268 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
269 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
270 bool operator==(const ResourceFirstAccess &rhs) const {
271 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
272 }
273};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600274
John Zulauf9cb530d2019-09-30 14:14:10 -0600275class ResourceAccessState : public SyncStageAccess {
276 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700277 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700278 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700279 SyncStageAccessFlags access_scope;
280 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700281 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700282 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700283 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600284 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
285 exec_scope |= rhs.exec_scope;
286 access_scope |= rhs.access_scope;
287 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700288 }
289 };
John Zulauf4fa68462021-04-26 21:04:22 -0600290 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
291 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700292
John Zulauf9cb530d2019-09-30 14:14:10 -0600293 // Mutliple read operations can be simlutaneously (and independently) synchronized,
294 // given the only the second execution scope creates a dependency chain, we have to track each,
295 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
296 // and applicable one for hazard detection
297 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700298 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600299 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600300 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700301 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600302 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700303 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
304 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600305 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700306 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600307 ResourceUsageTag tag_)
John Zulaufab7756b2020-12-29 16:10:16 -0700308 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600309 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600310 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600311 return same;
312 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700313 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700314 // If the read stage is not in the src sync scope
315 // *AND* not execution chained with an existing sync barrier (that's the or)
316 // then the barrier access is unsafe (R/W after R)
317 return (src_exec_scope & (stage | barriers)) == 0;
318 }
319
John Zulaufe5da6e52020-03-18 15:32:18 -0600320 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
John Zulaufee984022022-04-13 16:39:50 -0600321 void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
322 ResourceUsageTag tag_);
John Zulauf9cb530d2019-09-30 14:14:10 -0600323 };
324
325 public:
326 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf4fa68462021-04-26 21:04:22 -0600327 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule) const;
328 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering) const;
John Zulaufae842002021-04-15 18:20:55 -0600329 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
330
331 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
332 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
333 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600334
Jeremy Gebben40a22942020-12-22 14:22:06 -0700335 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700336 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700337 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600338 const SyncStageAccessFlags &source_access_scope, 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 Zulauf5f13a792020-03-10 07:31:21 -0600342 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600343 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulaufbb890452021-12-14 11:30:18 -0700344 void ApplyBarriersImmediate(const std::vector<SyncBarrier> &barriers);
John Zulauf89311b42020-09-29 16:28:47 -0600345 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600346 void ApplyBarrier(ResourceUsageTag scope_tag, const SyncBarrier &barrier, bool layout_transition);
347 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufae842002021-04-15 18:20:55 -0600348 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600349
John Zulauf4fa68462021-04-26 21:04:22 -0600350 void OffsetTag(ResourceUsageTag offset) {
351 if (last_write.any()) write_tag += offset;
352 for (auto &read_access : last_reads) {
353 read_access.tag += offset;
354 }
355 for (auto &first : first_accesses_) {
356 first.tag += offset;
357 }
358 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600359 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600360 : write_barriers(~SyncStageAccessFlags(0)),
361 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600362 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600363 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600364 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600365 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600366 read_execution_barriers(0),
367 pending_write_dep_chain(0),
368 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700369 pending_write_barriers(0),
John Zulauf4fa68462021-04-26 21:04:22 -0600370 pending_layout_ordering_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700371 first_accesses_(),
John Zulauf4fa68462021-04-26 21:04:22 -0600372 first_read_stages_(0U),
373 first_write_layout_ordering_() {}
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 Zulauf3d84f1b2020-03-09 13:33:25 -0600392
John Zulauf9cb530d2019-09-30 14:14:10 -0600393 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700394 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700395 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700396 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
397 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600398 // If the previous write is *not* a layout transition
399 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700400 // *AND* the current barrier is not in the dependency chain
401 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
402 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600403 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
404 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700405 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700406 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700407 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
408 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700409 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700410 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600411 }
John Zulaufd14743a2020-07-03 09:42:39 -0600412
Jeremy Gebben40a22942020-12-22 14:22:06 -0700413 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600414 return stage_mask != (stage_mask & barriers);
415 }
416
Jeremy Gebben40a22942020-12-22 14:22:06 -0700417 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600418 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700419 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700420 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700421
John Zulauf14940722021-04-12 15:19:02 -0600422 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600423 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700424
John Zulauf8e3c3e92021-01-06 11:19:36 -0700425 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
426 return kOrderingRules[static_cast<size_t>(ordering_enum)];
427 }
John Zulaufd14743a2020-07-03 09:42:39 -0600428
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700429 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600430
John Zulauf9cb530d2019-09-30 14:14:10 -0600431 // With reads, each must be "safe" relative to it's prior write, so we need only
432 // save the most recent write operation (as anything *transitively* unsafe would arleady
433 // be included
434 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700435 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600436 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600437 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600438
John Zulauff51fbb62020-10-02 14:43:24 -0600439 // TODO Input Attachment cleanup for multiple reads in a given stage
440 // Tracks whether the fragment shader read is input attachment read
441 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600442
Jeremy Gebben40a22942020-12-22 14:22:06 -0700443 VkPipelineStageFlags2KHR last_read_stages;
444 VkPipelineStageFlags2KHR read_execution_barriers;
Artem Bolgar09b01542021-06-01 23:49:14 -0700445 small_vector<ReadState, 3, uint32_t> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600446
447 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700448 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600449 bool pending_layout_transition;
450 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600451 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700452 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700453 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600454 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700455
456 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600457};
John Zulauf22aefed2021-03-11 18:14:35 -0700458using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
459using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600460
John Zulauf16adfc92020-04-08 10:28:33 -0600461using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700462using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700463using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600464using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600465
John Zulaufd0ec59f2021-03-13 14:25:08 -0700466class AttachmentViewGen {
467 public:
468 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
469 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
470 AttachmentViewGen(const AttachmentViewGen &other) = default;
471 AttachmentViewGen(AttachmentViewGen &&other) = default;
472 AccessAddressType GetAddressType() const;
473 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
474 const ImageRangeGen *GetRangeGen(Gen type) const;
475 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
476 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
477
478 private:
479 using RangeGenStore = layer_data::optional<ImageRangeGen>;
480 const IMAGE_VIEW_STATE *view_ = nullptr;
481 VkImageAspectFlags view_mask_ = 0U;
482 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
483};
484
485using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
486
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700487using SyncMemoryBarrier = SyncBarrier;
488struct SyncBufferMemoryBarrier {
489 using Buffer = std::shared_ptr<const BUFFER_STATE>;
490 Buffer buffer;
491 SyncBarrier barrier;
492 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700493 bool IsLayoutTransition() const { return false; }
494 const ResourceAccessRange &Range() const { return range; };
495 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700496 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
497 : buffer(buffer_), barrier(barrier_), range(range_) {}
498 SyncBufferMemoryBarrier() = default;
499};
500
501struct SyncImageMemoryBarrier {
502 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600503
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700504 Image image;
505 uint32_t index;
506 SyncBarrier barrier;
507 VkImageLayout old_layout;
508 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600509 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700510
511 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600512 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700513 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700514 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
515 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
516 : image(image_),
517 index(index_),
518 barrier(barrier_),
519 old_layout(old_layout_),
520 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600521 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700522 SyncImageMemoryBarrier() = default;
523};
524
John Zulaufbb890452021-12-14 11:30:18 -0700525template <typename SubpassNode>
526struct SubpassBarrierTrackback {
527 std::vector<SyncBarrier> barriers;
528 const SubpassNode *source_subpass = nullptr;
529 SubpassBarrierTrackback() = default;
530 SubpassBarrierTrackback(const SubpassBarrierTrackback &) = default;
531 SubpassBarrierTrackback(const SubpassNode *source_subpass_, VkQueueFlags queue_flags_,
532 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
533 : barriers(), source_subpass(source_subpass_) {
534 barriers.reserve(subpass_dependencies_.size());
535 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
536 assert(dependency);
537 barriers.emplace_back(queue_flags_, *dependency);
538 }
539 }
540 SubpassBarrierTrackback &operator=(const SubpassBarrierTrackback &) = default;
541};
542
543struct ReplayTrackbackBarriersAction {
544 struct TrackbackBarriers : public SubpassBarrierTrackback<ReplayTrackbackBarriersAction> {
545 using Base = SubpassBarrierTrackback<ReplayTrackbackBarriersAction>;
546 TrackbackBarriers(const ReplayTrackbackBarriersAction *source_subpass_, VkQueueFlags queue_flags_,
547 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_);
548 void operator()(ResourceAccessState *access) const;
549 };
550
551 ReplayTrackbackBarriersAction() = default;
552 ReplayTrackbackBarriersAction(VkQueueFlags queue_flags, const SubpassDependencyGraphNode &dependencies,
553 const std::vector<ReplayTrackbackBarriersAction> &contexts);
554
555 void operator()(ResourceAccessState *access) const;
556 std::vector<TrackbackBarriers> trackback_barriers;
557};
558
559struct ReplayRenderpassContext {
560 std::vector<ReplayTrackbackBarriersAction> subpass_contexts;
561};
562
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700563class SyncOpBase {
564 public:
John Zulaufbb890452021-12-14 11:30:18 -0700565 using ReplayContextPtr = std::shared_ptr<ReplayRenderpassContext>;
sfricke-samsung85584a72021-09-30 21:43:38 -0700566 SyncOpBase() : cmd_(CMD_NONE) {}
567 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600568 virtual ~SyncOpBase() = default;
569
sfricke-samsung85584a72021-09-30 21:43:38 -0700570 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufbb890452021-12-14 11:30:18 -0700571 const ReplayTrackbackBarriersAction *GetReplayTrackback() const;
572
573 void SetReplayContext(uint32_t subpass, ReplayContextPtr &&replay);
574
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700575 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600576 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
577 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700578 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const = 0;
579 virtual void ReplayRecord(ResourceUsageTag tag, AccessContext *access_context, SyncEventsContext *events_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700580
581 protected:
John Zulaufbb890452021-12-14 11:30:18 -0700582 // Only non-null and valid for SyncOps within a render pass instance WIP -- think about how to manage for non RPI calls within
583 // RPI and 2ndarys...
584 ReplayContextPtr replay_context_;
585 uint32_t subpass_ = VK_SUBPASS_EXTERNAL;
John Zulauf36ef9282021-02-02 11:47:24 -0700586 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700587};
588
John Zulaufd5115702021-01-18 12:34:33 -0700589class SyncOpBarriers : public SyncOpBase {
590 protected:
591 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600592 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700593 AccessContext *context);
594 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600595 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700596 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700597
John Zulauf36ef9282021-02-02 11:47:24 -0700598 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700599 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
600 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
601 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
602 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700603 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
604 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700605
John Zulauf8eda1562021-04-13 17:06:41 -0600606 ~SyncOpBarriers() override = default;
607
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700608 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700609 struct BarrierSet {
610 VkDependencyFlags dependency_flags;
611 SyncExecScope src_exec_scope;
612 SyncExecScope dst_exec_scope;
613 std::vector<SyncMemoryBarrier> memory_barriers;
614 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
615 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
616 bool single_exec_scope;
617 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
618 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
619 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
620 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
621 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
622 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
623 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
624 const VkImageMemoryBarrier *pImageMemoryBarriers);
625 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700626 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700627 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700628 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700629 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700630 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700631 };
632 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700633};
634
John Zulaufd5115702021-01-18 12:34:33 -0700635class SyncOpPipelineBarrier : public SyncOpBarriers {
636 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700637 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
638 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
639 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700640 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
641 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700642 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
643 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600644 ~SyncOpPipelineBarrier() override = default;
645
John Zulaufd5115702021-01-18 12:34:33 -0700646 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600647 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
648 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700649 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
650 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
651 SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700652};
653
654class SyncOpWaitEvents : public SyncOpBarriers {
655 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700656 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
657 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
658 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700659 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
660 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700661
662 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
663 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600664 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700665
John Zulaufd5115702021-01-18 12:34:33 -0700666 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600667 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
668 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700669 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
670 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
671 SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700672
673 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600674 static const char *const kIgnored;
John Zulaufbb890452021-12-14 11:30:18 -0700675 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700676 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
677 // 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 -0700678 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
679 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700680};
681
John Zulauf6ce24372021-01-30 05:56:25 -0700682class SyncOpResetEvent : public SyncOpBase {
683 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700684 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700685 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600686 ~SyncOpResetEvent() override = default;
687
John Zulauf6ce24372021-01-30 05:56:25 -0700688 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600689 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
690 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700691 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
692 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
693 SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700694
695 private:
John Zulaufbb890452021-12-14 11:30:18 -0700696 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700697 std::shared_ptr<const EVENT_STATE> event_;
698 SyncExecScope exec_scope_;
699};
700
701class SyncOpSetEvent : public SyncOpBase {
702 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700703 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700704 VkPipelineStageFlags2KHR stageMask);
705 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
706 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600707 ~SyncOpSetEvent() override = default;
708
John Zulauf6ce24372021-01-30 05:56:25 -0700709 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600710 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
711 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700712 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700713
714 private:
John Zulaufbb890452021-12-14 11:30:18 -0700715 bool DoValidate(const CommandExecutionContext &ex_context, const ResourceUsageTag base_tag) const;
716 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
717 SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700718 std::shared_ptr<const EVENT_STATE> event_;
719 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700720 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600721 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700722};
John Zulauf64ffe552021-02-06 10:25:07 -0700723
724class SyncOpBeginRenderPass : public SyncOpBase {
725 public:
726 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700727 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600728 ~SyncOpBeginRenderPass() override = default;
729
John Zulauf64ffe552021-02-06 10:25:07 -0700730 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600731 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
732 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700733 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
734 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
735 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700736
737 protected:
738 safe_VkRenderPassBeginInfo renderpass_begin_info_;
739 safe_VkSubpassBeginInfo subpass_begin_info_;
740 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
741 std::vector<const IMAGE_VIEW_STATE *> attachments_;
742 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
John Zulaufbb890452021-12-14 11:30:18 -0700743 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Shared across all subpasses for same renderpass instance
John Zulauf64ffe552021-02-06 10:25:07 -0700744};
745
746class SyncOpNextSubpass : public SyncOpBase {
747 public:
748 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700749 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600750 ~SyncOpNextSubpass() override = default;
751
John Zulauf64ffe552021-02-06 10:25:07 -0700752 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600753 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
754 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700755 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
756 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
757 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700758
759 protected:
760 safe_VkSubpassBeginInfo subpass_begin_info_;
761 safe_VkSubpassEndInfo subpass_end_info_;
John Zulaufbb890452021-12-14 11:30:18 -0700762 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Shared across all subpasses for same renderpass instance
John Zulauf64ffe552021-02-06 10:25:07 -0700763};
764
765class SyncOpEndRenderPass : public SyncOpBase {
766 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700767 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600768 ~SyncOpEndRenderPass() override = default;
769
John Zulauf64ffe552021-02-06 10:25:07 -0700770 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600771 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
772 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulaufbb890452021-12-14 11:30:18 -0700773 ResourceUsageTag base_tag, CommandExecutionContext *exec_context) const override;
774 void ReplayRecord(ResourceUsageTag recorded_tag, AccessContext *access_context,
775 SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700776
777 protected:
778 safe_VkSubpassEndInfo subpass_end_info_;
779};
780
John Zulauf540266b2020-04-06 18:54:53 -0600781class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700782 public:
John Zulauf69133422020-05-20 14:55:53 -0600783 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600784 kDetectPrevious = 1U << 0,
785 kDetectAsync = 1U << 1,
786 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600787 };
John Zulauf43cc7462020-12-03 12:33:12 -0700788 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600789
John Zulaufbb890452021-12-14 11:30:18 -0700790 using TrackBack = SubpassBarrierTrackback<AccessContext>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700791
John Zulauf355e49b2020-04-24 15:11:15 -0600792 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600793 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600794 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
795 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600796 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700797 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
798 DetectOptions options) const;
799 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600800 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
801 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600802 template <typename Detector>
803 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
804 DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600805 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf110413c2021-03-20 05:38:38 -0600806 const VkImageSubresourceRange &subresource_range) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700807 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
808 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
809
John Zulauf69133422020-05-20 14:55:53 -0600810 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700811 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600812 const VkOffset3D &offset, const VkExtent3D &extent) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700813 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700814 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700815 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
816 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700817 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
818 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700819 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700820 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700821 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700822 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700823 const SyncStageAccessFlags &src_stage_accesses,
824 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700825 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700826 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600827
John Zulaufb02c1eb2020-10-06 16:33:36 -0600828 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600829 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600830
John Zulaufbb890452021-12-14 11:30:18 -0700831 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context,
832 const ReplayTrackbackBarriersAction *replay_barrier) const;
John Zulaufae842002021-04-15 18:20:55 -0600833
John Zulaufe5da6e52020-03-18 15:32:18 -0600834 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600835 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600836 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600837 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600838 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700839 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600840 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700841 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600842 for (auto &map : access_state_maps_) {
843 map.clear();
844 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600845 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600846
847 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
848 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600849 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
850 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700851 template <typename BarrierAction>
852 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
853 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700854 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700855 const ResourceAccessState *infill_state,
856 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700857 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600858 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700859 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
860 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600861 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700862 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600863 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
864 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600865
John Zulauf8e3c3e92021-01-06 11:19:36 -0700866 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600867 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700868 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600869 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
870 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600871 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600872 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700873 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600874 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700875 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600876 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600877 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700878 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600879 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700880 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600881 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600882
John Zulauf540266b2020-04-06 18:54:53 -0600883 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600884
John Zulauf4fa68462021-04-26 21:04:22 -0600885 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700886 template <typename Action, typename RangeGen>
887 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600888 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700889 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600890 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700891 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700892 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600893
John Zulauf540266b2020-04-06 18:54:53 -0600894 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600895 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600896
897 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600898 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600899
John Zulauf43cc7462020-12-03 12:33:12 -0700900 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
901 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
902 return access_state_maps_[static_cast<size_t>(type)];
903 }
904 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
905 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
906 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
907 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600908 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
909 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700910 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600911 } else {
912 assert(subpass < prev_by_subpass_.size());
913 return prev_by_subpass_[subpass];
914 }
915 }
John Zulauf16adfc92020-04-08 10:28:33 -0600916
John Zulauf64ffe552021-02-06 10:25:07 -0700917 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700918 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
919 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700920 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700921 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
922 const char *func_name) const;
923 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
924
925 const RENDER_PASS_STATE &rp_state,
926
927 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
928 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700929 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700930 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700931 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600932
John Zulauf14940722021-04-12 15:19:02 -0600933 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700934 template <typename Action>
935 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700936
John Zulauf3d84f1b2020-03-09 13:33:25 -0600937 private:
938 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700939 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600940 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600941 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700942 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600943 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700944 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700945 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600946 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600947
948 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600949 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600950 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700951 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700952 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600953 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700954 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600955};
956
John Zulauf355e49b2020-04-24 15:11:15 -0600957class RenderPassAccessContext {
958 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700959 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
960 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700961 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
962 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
963 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600964
John Zulauf64ffe552021-02-06 10:25:07 -0700965 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
966 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -0600967 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700968 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
969 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
970 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600971
John Zulauf14940722021-04-12 15:19:02 -0600972 void RecordLayoutTransitions(ResourceUsageTag tag);
973 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -0700974 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
975 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
976 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600977
John Zulauf540266b2020-04-06 18:54:53 -0600978 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
979 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600980 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
981 uint32_t GetCurrentSubpass() const { return current_subpass_; }
982 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700983 AccessContext *CreateStoreResolveProxy() const;
John Zulaufbb890452021-12-14 11:30:18 -0700984 std::shared_ptr<ReplayRenderpassContext> GetReplayContext() const { return replay_context_; }
John Zulauf355e49b2020-04-24 15:11:15 -0600985
986 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600987 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700988 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600989 uint32_t current_subpass_;
990 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700991 AttachmentViewGenVector attachment_views_;
John Zulaufbb890452021-12-14 11:30:18 -0700992 std::shared_ptr<ReplayRenderpassContext> replay_context_; // Each SyncOp for this renderpass instance will have a copy
John Zulauf3d84f1b2020-03-09 13:33:25 -0600993};
994
John Zulauf64ffe552021-02-06 10:25:07 -0700995// Command execution context is the base class for command buffer and queue contexts
996// Preventing unintented leakage of subclass specific state, storing enough information
997// for message logging.
998// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
999class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001000 public:
John Zulauf3c788ef2022-02-22 12:12:30 -07001001 using AccessLog = std::vector<ResourceUsageRecord>;
John Zulauf64ffe552021-02-06 10:25:07 -07001002 CommandExecutionContext() : sync_state_(nullptr) {}
John Zulauf3c788ef2022-02-22 12:12:30 -07001003 CommandExecutionContext(const SyncValidator *sync_validator) : sync_state_(sync_validator) {}
John Zulauf64ffe552021-02-06 10:25:07 -07001004 virtual ~CommandExecutionContext() = default;
John Zulaufbb890452021-12-14 11:30:18 -07001005 virtual AccessContext *GetCurrentAccessContext() = 0;
1006 virtual SyncEventsContext *GetCurrentEventsContext() = 0;
1007 virtual const AccessContext *GetCurrentAccessContext() const = 0;
1008 virtual const SyncEventsContext *GetCurrentEventsContext() const = 0;
1009
John Zulauf64ffe552021-02-06 10:25:07 -07001010 const SyncValidator &GetSyncState() const {
1011 assert(sync_state_);
1012 return *sync_state_;
1013 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001014
1015 void ResolveRecordedContext(const AccessContext &recorded_context, ResourceUsageTag offset);
1016
1017 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulaufbb890452021-12-14 11:30:18 -07001018 virtual ResourceUsageTag GetTagLimit() const = 0;
1019 virtual VulkanTypedHandle Handle() const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -06001020 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
John Zulauf3c788ef2022-02-22 12:12:30 -07001021 virtual void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) = 0;
John Zulauf64ffe552021-02-06 10:25:07 -07001022
John Zulauf397e68b2022-04-19 11:44:07 -06001023 std::string FormatHazard(const HazardResult &hazard) const;
1024
John Zulauf64ffe552021-02-06 10:25:07 -07001025 protected:
John Zulauf3c788ef2022-02-22 12:12:30 -07001026 const SyncValidator *sync_state_;
John Zulauf64ffe552021-02-06 10:25:07 -07001027};
1028
1029class CommandBufferAccessContext : public CommandExecutionContext {
1030 public:
John Zulauf8eda1562021-04-13 17:06:41 -06001031 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
1032 struct SyncOpEntry {
1033 ResourceUsageTag tag;
1034 SyncOpPointer sync_op;
1035 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
1036 SyncOpEntry() = default;
1037 SyncOpEntry(const SyncOpEntry &other) = default;
1038 };
1039
John Zulauf3c788ef2022-02-22 12:12:30 -07001040 CommandBufferAccessContext(const SyncValidator *sync_validator = nullptr)
John Zulauf64ffe552021-02-06 10:25:07 -07001041 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -06001042 cb_state_(),
1043 queue_flags_(),
1044 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -06001045 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -06001046 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -07001047 command_number_(0),
1048 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001049 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001050 cb_access_context_(),
1051 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001052 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001053 render_pass_contexts_(),
1054 current_renderpass_context_(),
1055 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001056 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001057 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001058 cb_state_ = cb_state;
1059 queue_flags_ = queue_flags;
1060 }
John Zulauf4fa68462021-04-26 21:04:22 -06001061
1062 struct AsProxyContext {};
1063 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1064
John Zulauf64ffe552021-02-06 10:25:07 -07001065 ~CommandBufferAccessContext() override = default;
1066 CommandExecutionContext &GetExecutionContext() { return *this; }
1067 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001068
1069 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001070 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001071 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001072 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001073 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001074 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001075 reset_count_++;
1076 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001077 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001078 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001079 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001080 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001081 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001082 void MarkDestroyed() { destroyed_ = true; }
1083 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001084
John Zulauf4fa68462021-04-26 21:04:22 -06001085 std::string FormatUsage(ResourceUsageTag tag) const override;
John Zulauf397e68b2022-04-19 11:44:07 -06001086 std::string FormatUsage(const ResourceFirstAccess &access) const;
John Zulaufbb890452021-12-14 11:30:18 -07001087 AccessContext *GetCurrentAccessContext() override { return current_context_; }
1088 SyncEventsContext *GetCurrentEventsContext() override { return &events_context_; }
1089 const AccessContext *GetCurrentAccessContext() const override { return current_context_; }
1090 const SyncEventsContext *GetCurrentEventsContext() const override { return &events_context_; }
1091
John Zulauf64ffe552021-02-06 10:25:07 -07001092 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001093 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
John Zulauf41a9c7c2021-12-07 15:59:53 -07001094 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
1095 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
Jeremy Gebben9893daf2021-01-04 10:40:50 -07001096 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -07001097
locke-lunarg61870c22020-06-09 14:51:50 -06001098 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001099 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001100 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001101 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001102 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001103 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001104 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001105 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001106 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd);
1107 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd);
John Zulauf4a6105a2020-11-17 15:11:05 -07001108 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001109
John Zulaufbb890452021-12-14 11:30:18 -07001110 bool ValidateFirstUse(CommandExecutionContext *proxy_context, const char *func_name, uint32_t index) const;
John Zulauf4fa68462021-04-26 21:04:22 -06001111 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context, CMD_TYPE cmd);
1112
John Zulauf3d84f1b2020-03-09 13:33:25 -06001113 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1114 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001115
John Zulauf41a9c7c2021-12-07 15:59:53 -07001116 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
John Zulaufbb890452021-12-14 11:30:18 -07001117 ResourceUsageTag GetTagLimit() const override { return access_log_.size(); }
1118 VulkanTypedHandle Handle() const override {
1119 if (cb_state_) {
1120 return cb_state_->Handle();
1121 }
1122 return VulkanTypedHandle(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), kVulkanObjectTypeCommandBuffer);
1123 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001124
John Zulauf41a9c7c2021-12-07 15:59:53 -07001125 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1126 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1127 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001128
John Zulauf3c788ef2022-02-22 12:12:30 -07001129 std::shared_ptr<const CMD_BUFFER_STATE> GetCBStateShared() const { return cb_state_; }
1130
John Zulauffaea0ee2021-01-14 14:01:32 -07001131 const CMD_BUFFER_STATE &GetCBState() const {
1132 assert(cb_state_);
1133 return *(cb_state_.get());
1134 }
1135 CMD_BUFFER_STATE &GetCBState() {
1136 assert(cb_state_);
1137 return *(cb_state_.get());
1138 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001139
John Zulauf1bf30522021-09-03 15:39:06 -06001140 template <class T, class... Args>
1141 void RecordSyncOp(Args &&...args) {
1142 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1143 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
John Zulaufbb890452021-12-14 11:30:18 -07001144 RecordSyncOp(std::move(sync_op)); // Call the non-template version
John Zulauf1bf30522021-09-03 15:39:06 -06001145 }
John Zulauf3c788ef2022-02-22 12:12:30 -07001146 const AccessLog &GetAccessLog() const { return access_log_; }
1147 void InsertRecordedAccessLogEntries(const CommandBufferAccessContext &cb_context) override;
John Zulauf8eda1562021-04-13 17:06:41 -06001148
John Zulauf3d84f1b2020-03-09 13:33:25 -06001149 private:
John Zulaufbb890452021-12-14 11:30:18 -07001150 // As this is passing around a shared pointer to record, move to avoid needless atomics.
1151 void RecordSyncOp(SyncOpPointer &&sync_op);
John Zulauf4fa68462021-04-26 21:04:22 -06001152 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1153 VkQueueFlags queue_flags_;
1154 bool destroyed_;
1155
John Zulauf3c788ef2022-02-22 12:12:30 -07001156 AccessLog access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001157 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001158 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001159 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001160 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001161
John Zulauf355e49b2020-04-24 15:11:15 -06001162 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001163 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001164 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001165
1166 // Don't need the following for an active proxy cb context
1167 std::vector<RenderPassAccessContext> render_pass_contexts_;
1168 RenderPassAccessContext *current_renderpass_context_;
1169 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001170};
1171
1172class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1173 public:
John Zulauf9cb530d2019-09-30 14:14:10 -06001174 using StateTracker = ValidationStateTracker;
John Zulaufea943c52022-02-22 11:05:17 -07001175 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
John Zulauf888bb9d2022-05-20 16:13:00 -06001176 virtual ~SyncValidator() { ResetCommandBufferCallbacks(); };
John Zulauf9cb530d2019-09-30 14:14:10 -06001177
John Zulaufea943c52022-02-22 11:05:17 -07001178 layer_data::unordered_map<VkCommandBuffer, std::shared_ptr<CommandBufferAccessContext>> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001179
John Zulaufea943c52022-02-22 11:05:17 -07001180 std::shared_ptr<CommandBufferAccessContext> AccessContextFactory(VkCommandBuffer command_buffer);
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001181
John Zulaufea943c52022-02-22 11:05:17 -07001182 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer);
1183 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer);
1184 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const;
1185 std::shared_ptr<CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer);
1186 std::shared_ptr<const CommandBufferAccessContext> GetAccessContextShared(VkCommandBuffer command_buffer) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001187
John Zulaufd1f85d42020-04-15 12:23:15 -06001188 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1189 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001190 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001191 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001192 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001193 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1194 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001195 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001196
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001197 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001198
John Zulauf355e49b2020-04-24 15:11:15 -06001199 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001200 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001201
1202 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001203 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001204
1205 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001206 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001207
1208 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001209 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001210
John Zulauf9cb530d2019-09-30 14:14:10 -06001211 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001212 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001213
1214 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001215 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001216
John Zulauf4a6105a2020-11-17 15:11:05 -07001217 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001218 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001219 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1220 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001221
Tony-LunarGef035472021-11-02 10:23:33 -06001222 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001223 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001224 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001225
John Zulauf5c5e88d2019-12-26 11:22:02 -07001226 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1227 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001228 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001229
1230 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001231 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001232
Tony-LunarGb61514a2021-11-02 12:36:51 -06001233 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001234 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001235 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001236
Tony-LunarGb61514a2021-11-02 12:36:51 -06001237 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001238 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001239 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001240
John Zulauf9cb530d2019-09-30 14:14:10 -06001241 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1242 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1243 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1244 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1245 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001246 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001247
1248 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1249 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1250 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1251 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001252 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001253
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001254 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1255 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001256 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001257 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001258 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001259
John Zulauf3d84f1b2020-03-09 13:33:25 -06001260 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001261 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001262
1263 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001264 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001265 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001266 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001267 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001268 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001269
Mike Schuchardt2df08912020-12-15 16:28:09 -08001270 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001271 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001272 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001273 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1274 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1275 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1276 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001277
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001278 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001279 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001280 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001281 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001282 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001283
sfricke-samsung85584a72021-09-30 21:43:38 -07001284 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001285 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001286 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1287 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001288
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001289 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1290 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1291 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001292
sfricke-samsung71f04e32022-03-16 01:21:21 -05001293 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001294 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001295 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001296 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001297 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1298 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001299 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001300 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001301 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001302 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1303 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001304
sfricke-samsung71f04e32022-03-16 01:21:21 -05001305 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001306 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001307 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001308 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001309 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001310 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001311 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001312 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001313 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1314 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001315
sfricke-samsung71f04e32022-03-16 01:21:21 -05001316 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001317 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001318 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001319 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001320 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001321 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001322 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001323 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001324 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1325 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001326
sfricke-samsung71f04e32022-03-16 01:21:21 -05001327 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001328 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001329 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001330 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001331 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001332 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001333 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001334 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1335 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001336
1337 template <typename RegionType>
1338 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1339 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1340 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001341
1342 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1343 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001344 const VkImageBlit *pRegions, VkFilter filter) const override;
1345 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001346 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001347
Jeff Leger178b1e52020-10-05 12:22:23 -04001348 template <typename RegionType>
1349 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1350 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1351 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001352 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1353 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001354 VkFilter filter) override;
1355 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001356 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001357
John Zulauffaea0ee2021-01-14 14:01:32 -07001358 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1359 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1360 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001361 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001362 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1363 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001364
John Zulauffaea0ee2021-01-14 14:01:32 -07001365 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1366 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001367 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001368
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001369 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1370 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001371
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001372 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1373 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001374
1375 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001376 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001377 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001378 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001379
1380 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001381 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001382 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001383 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001384
1385 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001386 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001387 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001388 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001389
1390 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001391 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001392 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001393 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001394
locke-lunargff255f92020-05-13 18:53:52 -06001395 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1396 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1397 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001398 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1399 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001400 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001401 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1402 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001403 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1404 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001405 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001406 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1407 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001408 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001409 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1410 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001411 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001412 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1413 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001414 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001415 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1416 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001417 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001418
locke-lunargff255f92020-05-13 18:53:52 -06001419 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1420 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1421 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001422 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1423 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001424 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001425 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1426 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1427 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001428 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1429 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001430 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001431 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1432 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001433 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001434 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1435 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001436 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001437 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1438 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001439 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001440 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1441 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001442 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001443
1444 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1445 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001446 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001447 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1448 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001449 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001450
1451 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1452 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001453 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001454 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1455 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001456 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001457
1458 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1459 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001460 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001461 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1462 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001463 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001464
1465 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001466 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001467 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001468 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001469
1470 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1471 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001472 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001473
locke-lunarge1a67022020-04-29 00:15:36 -06001474 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1475 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001476 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001477
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001478 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001479 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1480 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001481 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001482 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1483 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001484
locke-lunarge1a67022020-04-29 00:15:36 -06001485 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001486 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001487 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001488 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001489
1490 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001491 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001492 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001493 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001494
1495 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1496 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1497
John Zulauf4edde622021-02-15 08:54:50 -07001498 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1499 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001500 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1501 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001502 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1503 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001504 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001505
John Zulauf49beb112020-11-04 16:06:31 -07001506 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1507 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1508
John Zulauf4edde622021-02-15 08:54:50 -07001509 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1510 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001511 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1512 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001513 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001514 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001515
John Zulauf49beb112020-11-04 16:06:31 -07001516 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1517 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1518 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1519 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1520 uint32_t imageMemoryBarrierCount,
1521 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1522 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1523 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1524 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1525 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1526 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001527 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1528 const VkDependencyInfoKHR *pDependencyInfos) const override;
1529 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1530 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001531 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1532 const VkDependencyInfo *pDependencyInfos) const override;
1533 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1534 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001535 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1536 VkDeviceSize dstOffset, uint32_t marker) const override;
1537 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1538 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001539 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1540 const VkCommandBuffer *pCommandBuffers) const override;
1541 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1542 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001543};