blob: c05c475aff12f27174252023aaf058ed45f9c169 [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 Zulaufe7f6a5e2021-01-16 14:31:18 -070035using CommandBufferAccessContextShared = std::shared_ptr<CommandBufferAccessContext>;
John Zulauf64ffe552021-02-06 10:25:07 -070036class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070037class ResourceAccessState;
John Zulauf4fa68462021-04-26 21:04:22 -060038struct ResourceFirstAccess;
John Zulaufd5115702021-01-18 12:34:33 -070039class SyncValidator;
John Zulauf355e49b2020-04-24 15:11:15 -060040
John Zulaufd0ec59f2021-03-13 14:25:08 -070041using ImageRangeEncoder = subresource_adapter::ImageRangeEncoder;
42using ImageRangeGen = subresource_adapter::ImageRangeGenerator;
43
John Zulauf2f952d22020-02-10 11:34:51 -070044enum SyncHazard {
45 NONE = 0,
46 READ_AFTER_WRITE,
47 WRITE_AFTER_READ,
48 WRITE_AFTER_WRITE,
49 READ_RACING_WRITE,
50 WRITE_RACING_WRITE,
51 WRITE_RACING_READ,
52};
John Zulauf9cb530d2019-09-30 14:14:10 -060053
John Zulauf8e3c3e92021-01-06 11:19:36 -070054enum class SyncOrdering : uint8_t {
55 kNonAttachment = 0,
56 kColorAttachment = 1,
57 kDepthStencilAttachment = 2,
58 kRaster = 3,
59 kNumOrderings = 4,
60};
61
John Zulauf9cb530d2019-09-30 14:14:10 -060062// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
63struct SyncStageAccess {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070064 static inline SyncStageAccessFlags FlagBit(SyncStageAccessIndex stage_access) {
John Zulauf9cb530d2019-09-30 14:14:10 -060065 return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
66 }
John Zulauf1507ee42020-05-18 11:33:09 -060067 static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
68 return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
69 }
John Zulauf9cb530d2019-09-30 14:14:10 -060070
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070071 static bool IsRead(const SyncStageAccessFlags &stage_access_bit) { return (stage_access_bit & syncStageAccessReadMask).any(); }
John Zulauf9cb530d2019-09-30 14:14:10 -060072 static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
73
Jeremy Gebbend0de1f82020-11-09 08:21:07 -070074 static bool IsWrite(const SyncStageAccessFlags &stage_access_bit) {
75 return (stage_access_bit & syncStageAccessWriteMask).any();
76 }
77 static bool HasWrite(const SyncStageAccessFlags &stage_access_mask) {
78 return (stage_access_mask & syncStageAccessWriteMask).any();
79 }
John Zulauf9cb530d2019-09-30 14:14:10 -060080 static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
Jeremy Gebben40a22942020-12-22 14:22:06 -070081 static VkPipelineStageFlags2KHR PipelineStageBit(SyncStageAccessIndex stage_access_index) {
John Zulauf9cb530d2019-09-30 14:14:10 -060082 return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
83 }
Jeremy Gebben40a22942020-12-22 14:22:06 -070084 static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags2KHR stages);
85 static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags2KHR access);
86 static SyncStageAccessFlags AccessScope(VkPipelineStageFlags2KHR stages, VkAccessFlags2KHR access);
87 static SyncStageAccessFlags AccessScope(const SyncStageAccessFlags &stage_scope, VkAccessFlags2KHR accesses) {
John Zulauf9cb530d2019-09-30 14:14:10 -060088 return stage_scope & AccessScopeByAccess(accesses);
89 }
90};
91
John Zulauf14940722021-04-12 15:19:02 -060092struct ResourceUsageRecord {
John Zulauf41a9c7c2021-12-07 15:59:53 -070093 enum class SubcommandType { kNone, kSubpassTransition, kLoadOp, kStoreOp, kResolveOp, kIndex };
94
John Zulauf14940722021-04-12 15:19:02 -060095 using TagIndex = size_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070096 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070097 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauf3c2a0b32021-07-14 11:14:52 -060098 constexpr static Count kMaxCount = std::numeric_limits<Count>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070099 CMD_TYPE command = CMD_NONE;
100 Count seq_num = 0U;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700101 SubcommandType sub_command_type = SubcommandType::kNone;
John Zulauffaea0ee2021-01-14 14:01:32 -0700102 Count sub_command = 0U;
John Zulauf3c2a0b32021-07-14 11:14:52 -0600103
104 // This is somewhat repetitive, but it prevents the need for Exec/Submit time touchup, after which usage records can be
105 // from different command buffers and resets.
John Zulauf4fa68462021-04-26 21:04:22 -0600106 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 -0600107 Count reset_count;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700108
John Zulauf14940722021-04-12 15:19:02 -0600109 ResourceUsageRecord() = default;
John Zulauf41a9c7c2021-12-07 15:59:53 -0700110 ResourceUsageRecord(CMD_TYPE command_, Count seq_num_, SubcommandType sub_type_, Count sub_command_,
111 const CMD_BUFFER_STATE *cb_state_, Count reset_count_)
112 : command(command_),
113 seq_num(seq_num_),
114 sub_command_type(sub_type_),
115 sub_command(sub_command_),
116 cb_state(cb_state_),
117 reset_count(reset_count_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600118};
119
John Zulauf3c2a0b32021-07-14 11:14:52 -0600120// The resource tag index is relative to the command buffer or queue in which it's found
John Zulauf14940722021-04-12 15:19:02 -0600121using ResourceUsageTag = ResourceUsageRecord::TagIndex;
John Zulaufae842002021-04-15 18:20:55 -0600122using ResourceUsageRange = sparse_container::range<ResourceUsageTag>;
John Zulauf14940722021-04-12 15:19:02 -0600123
John Zulauf9cb530d2019-09-30 14:14:10 -0600124struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600125 std::unique_ptr<const ResourceAccessState> access_state;
John Zulauf4fa68462021-04-26 21:04:22 -0600126 std::unique_ptr<const ResourceFirstAccess> recorded_access;
John Zulauf59e25072020-07-17 10:55:21 -0600127 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600128 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600129 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600130 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600131 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
John Zulauf14940722021-04-12 15:19:02 -0600132 const SyncStageAccessFlags &prior_, ResourceUsageTag tag_);
John Zulauf4fa68462021-04-26 21:04:22 -0600133 void AddRecordedAccess(const ResourceFirstAccess &first_access);
John Zulauf9cb530d2019-09-30 14:14:10 -0600134};
135
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700136struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700137 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
138 VkPipelineStageFlags2KHR
139 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
140 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 -0700141 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
142
143 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
144
Jeremy Gebben40a22942020-12-22 14:22:06 -0700145 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
146 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700147};
148
John Zulauf3d84f1b2020-03-09 13:33:25 -0600149struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700150 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600151 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700152 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600153 SyncStageAccessFlags dst_access_scope;
154 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700155 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600156 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700157
158 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
159
160 template <typename Barrier>
161 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
162
163 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700164 // template constructor for sync2 barriers
165 template <typename Barrier>
166 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700167
John Zulaufa0a98292020-09-18 09:30:10 -0600168 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700169 // Note that after merge, only the exec_scope and access_scope fields are fully valid
170 // TODO: Do we need to update any of the other fields? Merging has limited application.
171 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600172 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700173 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600174 dst_access_scope |= other.dst_access_scope;
175 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600176};
John Zulauf69133422020-05-20 14:55:53 -0600177
John Zulauf43cc7462020-12-03 12:33:12 -0700178enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
179
John Zulauf4a6105a2020-11-17 15:11:05 -0700180struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700181 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700182 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700183 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
184 EventPointer event;
185 CMD_TYPE last_command; // Only Event commands are valid here.
John Zulauf610e28c2021-08-03 17:46:23 -0600186 ResourceUsageTag last_command_tag; // Needed to filter replay validation
John Zulauf4a6105a2020-11-17 15:11:05 -0700187 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700188 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700189 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700190 ResourceUsageTag first_scope_tag;
John Zulauf78b1f892021-09-20 15:02:09 -0600191 bool first_scope_set;
John Zulaufd5115702021-01-18 12:34:33 -0700192 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700193 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700194 template <typename EventPointerType>
195 SyncEventState(EventPointerType &&event_state)
196 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700197 last_command(CMD_NONE),
John Zulauf610e28c2021-08-03 17:46:23 -0600198 last_command_tag(0),
John Zulaufd5115702021-01-18 12:34:33 -0700199 unsynchronized_set(CMD_NONE),
200 barriers(0U),
201 scope(),
202 first_scope_tag(),
John Zulauf78b1f892021-09-20 15:02:09 -0600203 first_scope_set(false),
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600204 destroyed((event_state.get() == nullptr) || event_state->Destroyed()) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700205 SyncEventState() : SyncEventState(EventPointer()) {}
206 void ResetFirstScope();
207 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700208 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700209 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700210};
John Zulaufd5115702021-01-18 12:34:33 -0700211using SyncEventStateShared = std::shared_ptr<SyncEventState>;
212using SyncEventStateConstShared = std::shared_ptr<const SyncEventState>;
John Zulauf669dfd52021-01-27 17:15:28 -0700213class SyncEventsContext {
214 public:
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700215 using Map = layer_data::unordered_map<const EVENT_STATE *, SyncEventStateShared>;
John Zulauf669dfd52021-01-27 17:15:28 -0700216 using iterator = Map::iterator;
217 using const_iterator = Map::const_iterator;
218
219 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
220 const auto find_it = map_.find(event_state.get());
221 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700222 if (!event_state.get()) return nullptr;
223
John Zulauf669dfd52021-01-27 17:15:28 -0700224 const auto *event_plain_ptr = event_state.get();
225 auto sync_state = SyncEventStateShared(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700226 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700227 return insert_pair.first->second.get();
228 }
229 return find_it->second.get();
230 }
231
232 const SyncEventState *Get(const EVENT_STATE *event_state) const {
233 const auto find_it = map_.find(event_state);
234 if (find_it == map_.end()) {
235 return nullptr;
236 }
237 return find_it->second.get();
238 }
John Zulauf6ce24372021-01-30 05:56:25 -0700239 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700240
John Zulauf8eda1562021-04-13 17:06:41 -0600241 void ApplyBarrier(const SyncExecScope &src, const SyncExecScope &dst);
242
John Zulauf669dfd52021-01-27 17:15:28 -0700243 // stl style naming for range-for support
244 inline iterator begin() { return map_.begin(); }
245 inline const_iterator begin() const { return map_.begin(); }
246 inline iterator end() { return map_.end(); }
247 inline const_iterator end() const { return map_.end(); }
248
249 void Destroy(const EVENT_STATE *event_state) {
250 auto sync_it = map_.find(event_state);
251 if (sync_it != map_.end()) {
252 sync_it->second->destroyed = true;
253 map_.erase(sync_it);
254 }
255 }
256 void Clear() { map_.clear(); }
257
258 private:
259 Map map_;
260};
John Zulauf4a6105a2020-11-17 15:11:05 -0700261
John Zulauf4fa68462021-04-26 21:04:22 -0600262struct ResourceFirstAccess {
263 ResourceUsageTag tag;
264 SyncStageAccessIndex usage_index;
265 SyncOrdering ordering_rule;
266 ResourceFirstAccess(ResourceUsageTag tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
267 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
268 ResourceFirstAccess(const ResourceFirstAccess &other) = default;
269 ResourceFirstAccess(ResourceFirstAccess &&other) = default;
270 ResourceFirstAccess &operator=(const ResourceFirstAccess &rhs) = default;
271 ResourceFirstAccess &operator=(ResourceFirstAccess &&rhs) = default;
272 bool operator==(const ResourceFirstAccess &rhs) const {
273 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
274 }
275};
John Zulauf3d84f1b2020-03-09 13:33:25 -0600276
John Zulauf9cb530d2019-09-30 14:14:10 -0600277class ResourceAccessState : public SyncStageAccess {
278 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700279 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700280 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700281 SyncStageAccessFlags access_scope;
282 OrderingBarrier() = default;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700283 OrderingBarrier(const OrderingBarrier &) = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700284 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700285 OrderingBarrier &operator=(const OrderingBarrier &) = default;
John Zulauf4fa68462021-04-26 21:04:22 -0600286 OrderingBarrier &operator|=(const OrderingBarrier &rhs) {
287 exec_scope |= rhs.exec_scope;
288 access_scope |= rhs.access_scope;
289 return *this;
John Zulauffaea0ee2021-01-14 14:01:32 -0700290 }
291 };
John Zulauf4fa68462021-04-26 21:04:22 -0600292 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
293 using FirstAccesses = small_vector<ResourceFirstAccess, 3>;
John Zulauffaea0ee2021-01-14 14:01:32 -0700294
John Zulauf9cb530d2019-09-30 14:14:10 -0600295 // Mutliple read operations can be simlutaneously (and independently) synchronized,
296 // given the only the second execution scope creates a dependency chain, we have to track each,
297 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
298 // and applicable one for hazard detection
299 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700300 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600301 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600302 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700303 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600304 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700305 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
306 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600307 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700308 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600309 ResourceUsageTag tag_)
John Zulaufab7756b2020-12-29 16:10:16 -0700310 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600311 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600312 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600313 return same;
314 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700315 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700316 // If the read stage is not in the src sync scope
317 // *AND* not execution chained with an existing sync barrier (that's the or)
318 // then the barrier access is unsafe (R/W after R)
319 return (src_exec_scope & (stage | barriers)) == 0;
320 }
321
John Zulaufe5da6e52020-03-18 15:32:18 -0600322 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700323 inline void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf14940722021-04-12 15:19:02 -0600324 ResourceUsageTag tag_) {
John Zulauf4285ee92020-09-23 10:20:52 -0600325 stage = stage_;
326 access = access_;
327 barriers = barriers_;
328 tag = tag_;
John Zulauf89311b42020-09-29 16:28:47 -0600329 pending_dep_chain = 0; // If this is a new read, we aren't applying a barrier set.
John Zulauf4285ee92020-09-23 10:20:52 -0600330 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600331 };
332
333 public:
334 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf4fa68462021-04-26 21:04:22 -0600335 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule) const;
336 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering) const;
John Zulaufae842002021-04-15 18:20:55 -0600337 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
338
339 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
340 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
341 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600342
Jeremy Gebben40a22942020-12-22 14:22:06 -0700343 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700344 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700345 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600346 const SyncStageAccessFlags &source_access_scope, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600347
John Zulauf14940722021-04-12 15:19:02 -0600348 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
349 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600350 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600351 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600352 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, ResourceUsageTag tag);
John Zulauf89311b42020-09-29 16:28:47 -0600353 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600354 void ApplyBarrier(ResourceUsageTag scope_tag, const SyncBarrier &barrier, bool layout_transition);
355 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufae842002021-04-15 18:20:55 -0600356 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600357
John Zulauf4fa68462021-04-26 21:04:22 -0600358 void OffsetTag(ResourceUsageTag offset) {
359 if (last_write.any()) write_tag += offset;
360 for (auto &read_access : last_reads) {
361 read_access.tag += offset;
362 }
363 for (auto &first : first_accesses_) {
364 first.tag += offset;
365 }
366 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600367 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600368 : write_barriers(~SyncStageAccessFlags(0)),
369 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600370 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600371 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600372 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600373 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600374 read_execution_barriers(0),
375 pending_write_dep_chain(0),
376 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700377 pending_write_barriers(0),
John Zulauf4fa68462021-04-26 21:04:22 -0600378 pending_layout_ordering_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700379 first_accesses_(),
John Zulauf4fa68462021-04-26 21:04:22 -0600380 first_read_stages_(0U),
381 first_write_layout_ordering_() {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600382
John Zulaufb02c1eb2020-10-06 16:33:36 -0600383 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700384 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600385 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600386 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600387 bool operator==(const ResourceAccessState &rhs) const {
388 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700389 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
390 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700391 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600392 return same;
393 }
394 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700395 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600396 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700397 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700398 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
399 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600400
John Zulauf9cb530d2019-09-30 14:14:10 -0600401 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700402 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700403 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700404 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
405 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600406 // If the previous write is *not* a layout transition
407 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700408 // *AND* the current barrier is not in the dependency chain
409 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
410 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600411 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
412 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700413 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700414 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700415 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
416 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700417 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700418 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600419 }
John Zulaufd14743a2020-07-03 09:42:39 -0600420
Jeremy Gebben40a22942020-12-22 14:22:06 -0700421 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600422 return stage_mask != (stage_mask & barriers);
423 }
424
Jeremy Gebben40a22942020-12-22 14:22:06 -0700425 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600426 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700427 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700428 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700429
John Zulauf14940722021-04-12 15:19:02 -0600430 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600431 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700432
John Zulauf8e3c3e92021-01-06 11:19:36 -0700433 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
434 return kOrderingRules[static_cast<size_t>(ordering_enum)];
435 }
John Zulaufd14743a2020-07-03 09:42:39 -0600436
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700437 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600438
John Zulauf9cb530d2019-09-30 14:14:10 -0600439 // With reads, each must be "safe" relative to it's prior write, so we need only
440 // save the most recent write operation (as anything *transitively* unsafe would arleady
441 // be included
442 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700443 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600444 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600445 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600446
John Zulauff51fbb62020-10-02 14:43:24 -0600447 // TODO Input Attachment cleanup for multiple reads in a given stage
448 // Tracks whether the fragment shader read is input attachment read
449 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600450
Jeremy Gebben40a22942020-12-22 14:22:06 -0700451 VkPipelineStageFlags2KHR last_read_stages;
452 VkPipelineStageFlags2KHR read_execution_barriers;
Artem Bolgar09b01542021-06-01 23:49:14 -0700453 small_vector<ReadState, 3, uint32_t> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600454
455 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700456 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600457 bool pending_layout_transition;
458 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600459 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700460 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700461 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600462 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700463
464 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600465};
John Zulauf22aefed2021-03-11 18:14:35 -0700466using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
467using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600468
John Zulauf16adfc92020-04-08 10:28:33 -0600469using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700470using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700471using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600472using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600473
John Zulaufd0ec59f2021-03-13 14:25:08 -0700474class AttachmentViewGen {
475 public:
476 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
477 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
478 AttachmentViewGen(const AttachmentViewGen &other) = default;
479 AttachmentViewGen(AttachmentViewGen &&other) = default;
480 AccessAddressType GetAddressType() const;
481 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
482 const ImageRangeGen *GetRangeGen(Gen type) const;
483 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
484 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
485
486 private:
487 using RangeGenStore = layer_data::optional<ImageRangeGen>;
488 const IMAGE_VIEW_STATE *view_ = nullptr;
489 VkImageAspectFlags view_mask_ = 0U;
490 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
491};
492
493using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
494
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700495using SyncMemoryBarrier = SyncBarrier;
496struct SyncBufferMemoryBarrier {
497 using Buffer = std::shared_ptr<const BUFFER_STATE>;
498 Buffer buffer;
499 SyncBarrier barrier;
500 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700501 bool IsLayoutTransition() const { return false; }
502 const ResourceAccessRange &Range() const { return range; };
503 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700504 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
505 : buffer(buffer_), barrier(barrier_), range(range_) {}
506 SyncBufferMemoryBarrier() = default;
507};
508
509struct SyncImageMemoryBarrier {
510 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600511
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700512 Image image;
513 uint32_t index;
514 SyncBarrier barrier;
515 VkImageLayout old_layout;
516 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600517 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700518
519 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600520 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700521 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700522 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
523 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
524 : image(image_),
525 index(index_),
526 barrier(barrier_),
527 old_layout(old_layout_),
528 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600529 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700530 SyncImageMemoryBarrier() = default;
531};
532
533class SyncOpBase {
534 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700535 SyncOpBase() : cmd_(CMD_NONE) {}
536 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600537 virtual ~SyncOpBase() = default;
538
sfricke-samsung85584a72021-09-30 21:43:38 -0700539 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700540 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600541 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
542 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600543 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -0600544 virtual void DoRecord(ResourceUsageTag tag, AccessContext *access_context, SyncEventsContext *events_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700545
546 protected:
547 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700548};
549
John Zulaufd5115702021-01-18 12:34:33 -0700550class SyncOpBarriers : public SyncOpBase {
551 protected:
552 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600553 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700554 AccessContext *context);
555 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600556 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700557 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700558
John Zulauf36ef9282021-02-02 11:47:24 -0700559 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700560 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
561 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
562 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
563 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700564 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
565 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700566
John Zulauf8eda1562021-04-13 17:06:41 -0600567 ~SyncOpBarriers() override = default;
568
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700569 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700570 struct BarrierSet {
571 VkDependencyFlags dependency_flags;
572 SyncExecScope src_exec_scope;
573 SyncExecScope dst_exec_scope;
574 std::vector<SyncMemoryBarrier> memory_barriers;
575 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
576 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
577 bool single_exec_scope;
578 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
579 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
580 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
581 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
582 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
583 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
584 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
585 const VkImageMemoryBarrier *pImageMemoryBarriers);
586 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700587 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700588 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700589 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700590 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700591 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700592 };
593 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700594};
595
John Zulaufd5115702021-01-18 12:34:33 -0700596class SyncOpPipelineBarrier : public SyncOpBarriers {
597 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700598 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
599 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
600 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700601 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
602 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700603 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
604 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600605 ~SyncOpPipelineBarrier() override = default;
606
John Zulaufd5115702021-01-18 12:34:33 -0700607 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600608 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
609 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600610 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600611 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700612};
613
614class SyncOpWaitEvents : public SyncOpBarriers {
615 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700616 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
617 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
618 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700619 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
620 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700621
622 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
623 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600624 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700625
John Zulaufd5115702021-01-18 12:34:33 -0700626 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600627 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
628 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600629 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600630 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700631
632 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600633 static const char *const kIgnored;
634 bool DoValidate(const CommandBufferAccessContext &cb_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700635 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
636 // 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 -0700637 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
638 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700639};
640
John Zulauf6ce24372021-01-30 05:56:25 -0700641class SyncOpResetEvent : public SyncOpBase {
642 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700643 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700644 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600645 ~SyncOpResetEvent() override = default;
646
John Zulauf6ce24372021-01-30 05:56:25 -0700647 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600648 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
649 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600650 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600651 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700652
653 private:
John Zulauf1bf30522021-09-03 15:39:06 -0600654 bool DoValidate(const CommandBufferAccessContext& cb_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700655 std::shared_ptr<const EVENT_STATE> event_;
656 SyncExecScope exec_scope_;
657};
658
659class SyncOpSetEvent : public SyncOpBase {
660 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700661 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700662 VkPipelineStageFlags2KHR stageMask);
663 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
664 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600665 ~SyncOpSetEvent() override = default;
666
John Zulauf6ce24372021-01-30 05:56:25 -0700667 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600668 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
669 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600670 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700671
672 private:
John Zulauf610e28c2021-08-03 17:46:23 -0600673 bool DoValidate(const CommandBufferAccessContext &cb_context, const ResourceUsageTag base_tag) const;
674 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700675 std::shared_ptr<const EVENT_STATE> event_;
676 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700677 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600678 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700679};
John Zulauf64ffe552021-02-06 10:25:07 -0700680
681class SyncOpBeginRenderPass : public SyncOpBase {
682 public:
683 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700684 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600685 ~SyncOpBeginRenderPass() override = default;
686
John Zulauf64ffe552021-02-06 10:25:07 -0700687 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600688 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
689 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600690 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600691 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700692
693 protected:
694 safe_VkRenderPassBeginInfo renderpass_begin_info_;
695 safe_VkSubpassBeginInfo subpass_begin_info_;
696 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
697 std::vector<const IMAGE_VIEW_STATE *> attachments_;
698 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
699};
700
701class SyncOpNextSubpass : public SyncOpBase {
702 public:
703 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700704 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600705 ~SyncOpNextSubpass() override = default;
706
John Zulauf64ffe552021-02-06 10:25:07 -0700707 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600708 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
709 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600710 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600711 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700712
713 protected:
714 safe_VkSubpassBeginInfo subpass_begin_info_;
715 safe_VkSubpassEndInfo subpass_end_info_;
716};
717
718class SyncOpEndRenderPass : public SyncOpBase {
719 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700720 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600721 ~SyncOpEndRenderPass() override = default;
722
John Zulauf64ffe552021-02-06 10:25:07 -0700723 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600724 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
725 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600726 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600727 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700728
729 protected:
730 safe_VkSubpassEndInfo subpass_end_info_;
731};
732
John Zulauf540266b2020-04-06 18:54:53 -0600733class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700734 public:
John Zulauf69133422020-05-20 14:55:53 -0600735 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600736 kDetectPrevious = 1U << 0,
737 kDetectAsync = 1U << 1,
738 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600739 };
John Zulauf43cc7462020-12-03 12:33:12 -0700740 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600741
John Zulauf3d84f1b2020-03-09 13:33:25 -0600742 struct TrackBack {
John Zulaufa0a98292020-09-18 09:30:10 -0600743 std::vector<SyncBarrier> barriers;
John Zulauf1a224292020-06-30 14:52:13 -0600744 const AccessContext *context;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700745 TrackBack(const TrackBack &) = default;
John Zulaufbaea94f2020-09-15 17:55:16 -0600746 TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_,
John Zulaufa0a98292020-09-18 09:30:10 -0600747 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
748 : barriers(), context(context_) {
749 barriers.reserve(subpass_dependencies_.size());
750 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
751 assert(dependency);
752 barriers.emplace_back(queue_flags_, *dependency);
753 }
754 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600755 TrackBack &operator=(const TrackBack &) = default;
756 TrackBack() = default;
757 };
John Zulauf5c5e88d2019-12-26 11:22:02 -0700758
John Zulauf355e49b2020-04-24 15:11:15 -0600759 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600760 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600761 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
762 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600763 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700764 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
765 DetectOptions options) const;
766 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600767 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
768 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600769 template <typename Detector>
770 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
771 DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600772 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf110413c2021-03-20 05:38:38 -0600773 const VkImageSubresourceRange &subresource_range) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700774 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
775 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
776
John Zulauf69133422020-05-20 14:55:53 -0600777 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700778 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600779 const VkOffset3D &offset, const VkExtent3D &extent) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700780 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700781 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700782 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
783 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700784 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
785 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700786 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700787 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700788 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700789 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700790 const SyncStageAccessFlags &src_stage_accesses,
791 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700792 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700793 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600794
John Zulaufb02c1eb2020-10-06 16:33:36 -0600795 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600796 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600797
John Zulaufae842002021-04-15 18:20:55 -0600798 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context) const;
799
John Zulaufe5da6e52020-03-18 15:32:18 -0600800 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600801 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600802 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600803 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600804 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700805 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600806 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700807 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600808 for (auto &map : access_state_maps_) {
809 map.clear();
810 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600811 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600812
813 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
814 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600815 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
816 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700817 template <typename BarrierAction>
818 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
819 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700820 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700821 const ResourceAccessState *infill_state,
822 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700823 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600824 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700825 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
826 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600827 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700828 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600829 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
830 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600831
John Zulauf8e3c3e92021-01-06 11:19:36 -0700832 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600833 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700834 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600835 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
836 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600837 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600838 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700839 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600840 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700841 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600842 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600843 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700844 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600845 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700846 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600847 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600848
John Zulauf540266b2020-04-06 18:54:53 -0600849 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600850
John Zulauf4fa68462021-04-26 21:04:22 -0600851 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700852 template <typename Action, typename RangeGen>
853 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600854 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700855 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600856 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700857 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700858 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600859
John Zulauf540266b2020-04-06 18:54:53 -0600860 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600861 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600862
863 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600864 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600865
John Zulauf43cc7462020-12-03 12:33:12 -0700866 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
867 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
868 return access_state_maps_[static_cast<size_t>(type)];
869 }
870 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
871 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
872 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
873 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600874 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
875 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700876 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600877 } else {
878 assert(subpass < prev_by_subpass_.size());
879 return prev_by_subpass_[subpass];
880 }
881 }
John Zulauf16adfc92020-04-08 10:28:33 -0600882
John Zulauf64ffe552021-02-06 10:25:07 -0700883 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700884 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
885 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700886 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700887 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
888 const char *func_name) const;
889 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
890
891 const RENDER_PASS_STATE &rp_state,
892
893 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
894 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700895 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700896 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700897 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600898
John Zulauf14940722021-04-12 15:19:02 -0600899 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700900 template <typename Action>
901 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700902
John Zulauf3d84f1b2020-03-09 13:33:25 -0600903 private:
904 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700905 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600906 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600907 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700908 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600909 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700910 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700911 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600912 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600913
914 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600915 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600916 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700917 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700918 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600919 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700920 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600921};
922
John Zulauf355e49b2020-04-24 15:11:15 -0600923class RenderPassAccessContext {
924 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700925 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
926 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700927 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
928 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
929 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600930
John Zulauf64ffe552021-02-06 10:25:07 -0700931 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
932 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -0600933 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700934 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
935 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
936 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600937
John Zulauf14940722021-04-12 15:19:02 -0600938 void RecordLayoutTransitions(ResourceUsageTag tag);
939 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -0700940 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
941 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
942 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600943
John Zulauf540266b2020-04-06 18:54:53 -0600944 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
945 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600946 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
947 uint32_t GetCurrentSubpass() const { return current_subpass_; }
948 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700949 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -0600950
951 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600952 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700953 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600954 uint32_t current_subpass_;
955 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700956 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600957};
958
John Zulauf64ffe552021-02-06 10:25:07 -0700959// Command execution context is the base class for command buffer and queue contexts
960// Preventing unintented leakage of subclass specific state, storing enough information
961// for message logging.
962// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
963class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600964 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700965 CommandExecutionContext() : sync_state_(nullptr) {}
966 CommandExecutionContext(SyncValidator *sync_validator) : sync_state_(sync_validator) {}
967 virtual ~CommandExecutionContext() = default;
968 const SyncValidator &GetSyncState() const {
969 assert(sync_state_);
970 return *sync_state_;
971 }
972 SyncValidator &GetSyncState() {
973 assert(sync_state_);
974 return *sync_state_;
975 }
John Zulauf4fa68462021-04-26 21:04:22 -0600976 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
977 virtual std::string FormatUsage(const ResourceFirstAccess &access) const = 0;
John Zulauf64ffe552021-02-06 10:25:07 -0700978 virtual std::string FormatUsage(const HazardResult &hazard) const = 0;
979
980 protected:
981 SyncValidator *sync_state_;
982};
983
984class CommandBufferAccessContext : public CommandExecutionContext {
985 public:
John Zulauf8eda1562021-04-13 17:06:41 -0600986 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
987 struct SyncOpEntry {
988 ResourceUsageTag tag;
989 SyncOpPointer sync_op;
990 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
991 SyncOpEntry() = default;
992 SyncOpEntry(const SyncOpEntry &other) = default;
993 };
994
John Zulauf64ffe552021-02-06 10:25:07 -0700995 CommandBufferAccessContext(SyncValidator *sync_validator = nullptr)
996 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -0600997 cb_state_(),
998 queue_flags_(),
999 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -06001000 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -06001001 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -07001002 command_number_(0),
1003 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001004 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -06001005 cb_access_context_(),
1006 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001007 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001008 render_pass_contexts_(),
1009 current_renderpass_context_(),
1010 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001011 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001012 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001013 cb_state_ = cb_state;
1014 queue_flags_ = queue_flags;
1015 }
John Zulauf4fa68462021-04-26 21:04:22 -06001016
1017 struct AsProxyContext {};
1018 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1019
John Zulauf64ffe552021-02-06 10:25:07 -07001020 ~CommandBufferAccessContext() override = default;
1021 CommandExecutionContext &GetExecutionContext() { return *this; }
1022 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001023
1024 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001025 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001026 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001027 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001028 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001029 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001030 reset_count_++;
1031 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001032 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001033 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001034 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001035 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001036 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001037 void MarkDestroyed() { destroyed_ = true; }
1038 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001039
John Zulauf4fa68462021-04-26 21:04:22 -06001040 std::string FormatUsage(ResourceUsageTag tag) const override;
1041 std::string FormatUsage(const ResourceFirstAccess &access) const override;
John Zulauf64ffe552021-02-06 10:25:07 -07001042 std::string FormatUsage(const HazardResult &hazard) const override;
John Zulauf540266b2020-04-06 18:54:53 -06001043 AccessContext *GetCurrentAccessContext() { return current_context_; }
John Zulauf669dfd52021-01-27 17:15:28 -07001044 SyncEventsContext *GetCurrentEventsContext() { return &events_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001045 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf540266b2020-04-06 18:54:53 -06001046 const AccessContext *GetCurrentAccessContext() const { return current_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001047 const SyncEventsContext *GetCurrentEventsContext() const { return &events_context_; }
1048 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
John Zulauf41a9c7c2021-12-07 15:59:53 -07001049 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
1050 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
Jeremy Gebben9893daf2021-01-04 10:40:50 -07001051 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -07001052
locke-lunarg61870c22020-06-09 14:51:50 -06001053 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001054 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001055 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001056 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001057 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001058 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001059 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001060 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001061 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd);
1062 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd);
John Zulauf4a6105a2020-11-17 15:11:05 -07001063 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001064
John Zulauf4fa68462021-04-26 21:04:22 -06001065 bool ValidateFirstUse(CommandBufferAccessContext *proxy_context, const char *func_name, uint32_t index) const;
1066 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context, CMD_TYPE cmd);
1067
1068 void ResolveRecordedContext(const AccessContext &recorded_context, ResourceUsageTag offset);
1069 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulaufae842002021-04-15 18:20:55 -06001070
John Zulauf3d84f1b2020-03-09 13:33:25 -06001071 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1072 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001073
John Zulauf41a9c7c2021-12-07 15:59:53 -07001074 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
1075 ResourceUsageTag GetTagLimit() const { return access_log_.size(); }
John Zulauffaea0ee2021-01-14 14:01:32 -07001076
John Zulauf41a9c7c2021-12-07 15:59:53 -07001077 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1078 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1079 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001080
John Zulauffaea0ee2021-01-14 14:01:32 -07001081 const CMD_BUFFER_STATE &GetCBState() const {
1082 assert(cb_state_);
1083 return *(cb_state_.get());
1084 }
1085 CMD_BUFFER_STATE &GetCBState() {
1086 assert(cb_state_);
1087 return *(cb_state_.get());
1088 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001089
John Zulauf1bf30522021-09-03 15:39:06 -06001090 template <class T, class... Args>
1091 void RecordSyncOp(Args &&...args) {
1092 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1093 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
1094 auto tag = sync_op->Record(this);
1095 AddSyncOp(tag, std::move(sync_op));
1096 }
John Zulauf8eda1562021-04-13 17:06:41 -06001097
John Zulauf3d84f1b2020-03-09 13:33:25 -06001098 private:
John Zulauf1bf30522021-09-03 15:39:06 -06001099 void AddSyncOp(ResourceUsageTag tag, SyncOpPointer &&sync_op) { sync_ops_.emplace_back(tag, std::move(sync_op)); }
John Zulauf4fa68462021-04-26 21:04:22 -06001100 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1101 VkQueueFlags queue_flags_;
1102 bool destroyed_;
1103
John Zulauf14940722021-04-12 15:19:02 -06001104 std::vector<ResourceUsageRecord> access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001105 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001106 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001107 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001108 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001109
John Zulauf355e49b2020-04-24 15:11:15 -06001110 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001111 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001112 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001113
1114 // Don't need the following for an active proxy cb context
1115 std::vector<RenderPassAccessContext> render_pass_contexts_;
1116 RenderPassAccessContext *current_renderpass_context_;
1117 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001118};
1119
1120class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1121 public:
1122 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
1123 using StateTracker = ValidationStateTracker;
1124
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001125 layer_data::unordered_map<VkCommandBuffer, CommandBufferAccessContextShared> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001126
1127 CommandBufferAccessContextShared GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
John Zulauf9cb530d2019-09-30 14:14:10 -06001128 auto found_it = cb_access_state.find(command_buffer);
1129 if (found_it == cb_access_state.end()) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001130 if (!do_insert) return CommandBufferAccessContextShared();
John Zulauf9cb530d2019-09-30 14:14:10 -06001131 // If we don't have one, make it.
Jeremy Gebben9f537102021-10-05 16:37:12 -06001132 auto cb_state = Get<CMD_BUFFER_STATE>(command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001133 assert(cb_state.get());
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06001134 auto queue_flags = cb_state->GetQueueFlags();
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001135 std::shared_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001136 auto insert_pair = cb_access_state.emplace(command_buffer, std::move(context));
John Zulauf9cb530d2019-09-30 14:14:10 -06001137 found_it = insert_pair.first;
1138 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001139 return found_it->second;
John Zulauf9cb530d2019-09-30 14:14:10 -06001140 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001141
John Zulauf3d84f1b2020-03-09 13:33:25 -06001142 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001143 return GetAccessContextImpl(command_buffer, true).get(); // true -> do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001144 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001145 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001146 return GetAccessContextImpl(command_buffer, false).get(); // false -> don't do_insert on not found
1147 }
1148
1149 CommandBufferAccessContextShared GetAccessContextShared(VkCommandBuffer command_buffer) {
1150 return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
1151 }
1152 CommandBufferAccessContextShared GetAccessContextSharedNoInsert(VkCommandBuffer command_buffer) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001153 return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001154 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001155
1156 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
John Zulauf9cb530d2019-09-30 14:14:10 -06001157 const auto found_it = cb_access_state.find(command_buffer);
1158 if (found_it == cb_access_state.end()) {
1159 return nullptr;
1160 }
1161 return found_it->second.get();
1162 }
1163
John Zulaufd1f85d42020-04-15 12:23:15 -06001164 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1165 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001166 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001167 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001168 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001169 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1170 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001171 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001172
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001173 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001174
John Zulauf355e49b2020-04-24 15:11:15 -06001175 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001176 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001177
1178 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001179 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001180
1181 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001182 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001183
1184 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001185 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001186
John Zulauf9cb530d2019-09-30 14:14:10 -06001187 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001188 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001189
1190 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001191 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001192
John Zulauf4a6105a2020-11-17 15:11:05 -07001193 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001194 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001195 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1196 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001197
Tony-LunarGef035472021-11-02 10:23:33 -06001198 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001199 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001200 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001201
John Zulauf5c5e88d2019-12-26 11:22:02 -07001202 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1203 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001204 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001205
1206 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001207 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001208
Tony-LunarGb61514a2021-11-02 12:36:51 -06001209 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001210 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001211 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001212
Tony-LunarGb61514a2021-11-02 12:36:51 -06001213 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001214 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001215 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001216
John Zulauf9cb530d2019-09-30 14:14:10 -06001217 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1218 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1219 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1220 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1221 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001222 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001223
1224 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1225 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1226 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1227 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001228 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001229
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001230 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1231 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001232 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001233 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001234 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001235
John Zulauf3d84f1b2020-03-09 13:33:25 -06001236 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001237 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001238
1239 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001240 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001241 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001242 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001243 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001244 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001245
Mike Schuchardt2df08912020-12-15 16:28:09 -08001246 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001247 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001248 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001249 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1250 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1251 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1252 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001253
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001254 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001255 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001256 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001257 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001258 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001259
sfricke-samsung85584a72021-09-30 21:43:38 -07001260 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001261 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001262 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1263 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001264
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001265 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1266 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1267 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001268
sfricke-samsung71f04e32022-03-16 01:21:21 -05001269 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001270 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001271 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001272 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001273 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1274 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001275 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001276 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001277 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001278 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1279 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001280
sfricke-samsung71f04e32022-03-16 01:21:21 -05001281 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001282 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001283 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001284 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001285 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001286 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001287 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001288 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001289 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1290 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001291
sfricke-samsung71f04e32022-03-16 01:21:21 -05001292 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001293 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001294 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001295 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001296 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001297 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001298 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001299 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001300 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1301 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001302
sfricke-samsung71f04e32022-03-16 01:21:21 -05001303 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001304 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001305 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001306 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001307 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001308 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001309 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001310 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1311 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001312
1313 template <typename RegionType>
1314 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1315 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1316 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001317
1318 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1319 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001320 const VkImageBlit *pRegions, VkFilter filter) const override;
1321 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001322 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001323
Jeff Leger178b1e52020-10-05 12:22:23 -04001324 template <typename RegionType>
1325 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1326 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1327 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001328 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1329 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001330 VkFilter filter) override;
1331 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001332 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001333
John Zulauffaea0ee2021-01-14 14:01:32 -07001334 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1335 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1336 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001337 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001338 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1339 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001340
John Zulauffaea0ee2021-01-14 14:01:32 -07001341 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1342 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001343 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001344
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001345 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1346 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001347
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001348 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1349 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001350
1351 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001352 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001353 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001354 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001355
1356 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001357 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001358 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001359 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001360
1361 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001362 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001363 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001364 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001365
1366 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001367 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001368 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001369 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001370
locke-lunargff255f92020-05-13 18:53:52 -06001371 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1372 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1373 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001374 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1375 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001376 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001377 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1378 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001379 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1380 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001381 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001382 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1383 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001384 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001385 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1386 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001387 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001388 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1389 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001390 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001391 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1392 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001393 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001394
locke-lunargff255f92020-05-13 18:53:52 -06001395 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1396 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1397 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001398 bool PreCallValidateCmdDrawIndexedIndirectCount(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 RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1402 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1403 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001404 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1405 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001406 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001407 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1408 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001409 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001410 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1411 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001412 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001413 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1414 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001415 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001416 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1417 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001418 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001419
1420 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1421 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001422 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001423 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1424 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001425 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001426
1427 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1428 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001429 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001430 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1431 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001432 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001433
1434 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1435 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001436 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001437 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1438 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001439 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001440
1441 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001442 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001443 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001444 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001445
1446 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1447 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001448 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001449
locke-lunarge1a67022020-04-29 00:15:36 -06001450 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1451 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001452 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001453
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001454 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001455 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1456 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001457 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001458 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1459 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001460
locke-lunarge1a67022020-04-29 00:15:36 -06001461 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001462 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001463 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001464 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001465
1466 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001467 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001468 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001469 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001470
1471 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1472 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1473
John Zulauf4edde622021-02-15 08:54:50 -07001474 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1475 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001476 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1477 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001478 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1479 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001480 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001481
John Zulauf49beb112020-11-04 16:06:31 -07001482 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1483 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1484
John Zulauf4edde622021-02-15 08:54:50 -07001485 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1486 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001487 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1488 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001489 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001490 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001491
John Zulauf49beb112020-11-04 16:06:31 -07001492 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1493 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1494 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1495 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1496 uint32_t imageMemoryBarrierCount,
1497 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1498 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1499 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1500 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1501 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1502 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001503 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1504 const VkDependencyInfoKHR *pDependencyInfos) const override;
1505 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1506 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001507 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1508 const VkDependencyInfo *pDependencyInfos) const override;
1509 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1510 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001511 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1512 VkDeviceSize dstOffset, uint32_t marker) const override;
1513 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1514 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001515 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1516 const VkCommandBuffer *pCommandBuffers) const override;
1517 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1518 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001519};