blob: 8f364d54f06d82a0fd51824afb03675905f619df [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); }
John Zulaufee984022022-04-13 16:39:50 -0600323 void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
324 ResourceUsageTag tag_);
John Zulauf9cb530d2019-09-30 14:14:10 -0600325 };
326
327 public:
328 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf4fa68462021-04-26 21:04:22 -0600329 HazardResult DetectHazard(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule) const;
330 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const OrderingBarrier &ordering) const;
John Zulaufae842002021-04-15 18:20:55 -0600331 HazardResult DetectHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range) const;
332
333 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, ResourceUsageTag start_tag) const;
334 HazardResult DetectAsyncHazard(const ResourceAccessState &recorded_use, const ResourceUsageRange &tag_range,
335 ResourceUsageTag start_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600336
Jeremy Gebben40a22942020-12-22 14:22:06 -0700337 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700338 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700339 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf14940722021-04-12 15:19:02 -0600340 const SyncStageAccessFlags &source_access_scope, ResourceUsageTag event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600341
John Zulauf14940722021-04-12 15:19:02 -0600342 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, ResourceUsageTag tag);
343 void SetWrite(const SyncStageAccessFlags &usage_bit, ResourceUsageTag tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600344 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600345 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600346 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, ResourceUsageTag tag);
John Zulauf89311b42020-09-29 16:28:47 -0600347 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf14940722021-04-12 15:19:02 -0600348 void ApplyBarrier(ResourceUsageTag scope_tag, const SyncBarrier &barrier, bool layout_transition);
349 void ApplyPendingBarriers(ResourceUsageTag tag);
John Zulaufae842002021-04-15 18:20:55 -0600350 bool FirstAccessInTagRange(const ResourceUsageRange &tag_range) const;
John Zulauf9cb530d2019-09-30 14:14:10 -0600351
John Zulauf4fa68462021-04-26 21:04:22 -0600352 void OffsetTag(ResourceUsageTag offset) {
353 if (last_write.any()) write_tag += offset;
354 for (auto &read_access : last_reads) {
355 read_access.tag += offset;
356 }
357 for (auto &first : first_accesses_) {
358 first.tag += offset;
359 }
360 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600361 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600362 : write_barriers(~SyncStageAccessFlags(0)),
363 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600364 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600365 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600366 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600367 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600368 read_execution_barriers(0),
369 pending_write_dep_chain(0),
370 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700371 pending_write_barriers(0),
John Zulauf4fa68462021-04-26 21:04:22 -0600372 pending_layout_ordering_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700373 first_accesses_(),
John Zulauf4fa68462021-04-26 21:04:22 -0600374 first_read_stages_(0U),
375 first_write_layout_ordering_() {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600376
John Zulaufb02c1eb2020-10-06 16:33:36 -0600377 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700378 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600379 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600380 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600381 bool operator==(const ResourceAccessState &rhs) const {
382 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700383 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
384 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700385 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600386 return same;
387 }
388 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700389 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600390 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700391 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700392 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
393 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600394
John Zulauf9cb530d2019-09-30 14:14:10 -0600395 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700396 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700397 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700398 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
399 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf6b583642021-10-05 17:25:31 -0600400 // If the previous write is *not* a layout transition
401 // *AND* is *not* in the 1st access scope
John Zulauf4a6105a2020-11-17 15:11:05 -0700402 // *AND* the current barrier is not in the dependency chain
403 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
404 // then the barrier access is unsafe (R/W after W)
John Zulauf6b583642021-10-05 17:25:31 -0600405 return (last_write != SYNC_IMAGE_LAYOUT_TRANSITION_BIT) && (last_write & src_access_scope).none() &&
406 (((src_exec_scope & write_dependency_chain) == 0) || (write_barriers & src_access_scope).none());
John Zulauf4a6105a2020-11-17 15:11:05 -0700407 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700408 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700409 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
410 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700411 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700412 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600413 }
John Zulaufd14743a2020-07-03 09:42:39 -0600414
Jeremy Gebben40a22942020-12-22 14:22:06 -0700415 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600416 return stage_mask != (stage_mask & barriers);
417 }
418
Jeremy Gebben40a22942020-12-22 14:22:06 -0700419 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600420 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700421 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700422 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700423
John Zulauf14940722021-04-12 15:19:02 -0600424 void UpdateFirst(ResourceUsageTag tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
John Zulauf4fa68462021-04-26 21:04:22 -0600425 void TouchupFirstForLayoutTransition(ResourceUsageTag tag, const OrderingBarrier &layout_ordering);
John Zulauffaea0ee2021-01-14 14:01:32 -0700426
John Zulauf8e3c3e92021-01-06 11:19:36 -0700427 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
428 return kOrderingRules[static_cast<size_t>(ordering_enum)];
429 }
John Zulaufd14743a2020-07-03 09:42:39 -0600430
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700431 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600432
John Zulauf9cb530d2019-09-30 14:14:10 -0600433 // With reads, each must be "safe" relative to it's prior write, so we need only
434 // save the most recent write operation (as anything *transitively* unsafe would arleady
435 // be included
436 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700437 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600438 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600439 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600440
John Zulauff51fbb62020-10-02 14:43:24 -0600441 // TODO Input Attachment cleanup for multiple reads in a given stage
442 // Tracks whether the fragment shader read is input attachment read
443 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600444
Jeremy Gebben40a22942020-12-22 14:22:06 -0700445 VkPipelineStageFlags2KHR last_read_stages;
446 VkPipelineStageFlags2KHR read_execution_barriers;
Artem Bolgar09b01542021-06-01 23:49:14 -0700447 small_vector<ReadState, 3, uint32_t> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600448
449 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700450 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600451 bool pending_layout_transition;
452 SyncStageAccessFlags pending_write_barriers;
John Zulauf4fa68462021-04-26 21:04:22 -0600453 OrderingBarrier pending_layout_ordering_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700454 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700455 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf4fa68462021-04-26 21:04:22 -0600456 OrderingBarrier first_write_layout_ordering_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700457
458 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600459};
John Zulauf22aefed2021-03-11 18:14:35 -0700460using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
461using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600462
John Zulauf16adfc92020-04-08 10:28:33 -0600463using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700464using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700465using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600466using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600467
John Zulaufd0ec59f2021-03-13 14:25:08 -0700468class AttachmentViewGen {
469 public:
470 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
471 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
472 AttachmentViewGen(const AttachmentViewGen &other) = default;
473 AttachmentViewGen(AttachmentViewGen &&other) = default;
474 AccessAddressType GetAddressType() const;
475 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
476 const ImageRangeGen *GetRangeGen(Gen type) const;
477 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
478 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
479
480 private:
481 using RangeGenStore = layer_data::optional<ImageRangeGen>;
482 const IMAGE_VIEW_STATE *view_ = nullptr;
483 VkImageAspectFlags view_mask_ = 0U;
484 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
485};
486
487using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
488
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700489using SyncMemoryBarrier = SyncBarrier;
490struct SyncBufferMemoryBarrier {
491 using Buffer = std::shared_ptr<const BUFFER_STATE>;
492 Buffer buffer;
493 SyncBarrier barrier;
494 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700495 bool IsLayoutTransition() const { return false; }
496 const ResourceAccessRange &Range() const { return range; };
497 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700498 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
499 : buffer(buffer_), barrier(barrier_), range(range_) {}
500 SyncBufferMemoryBarrier() = default;
501};
502
503struct SyncImageMemoryBarrier {
504 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulauf110413c2021-03-20 05:38:38 -0600505
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700506 Image image;
507 uint32_t index;
508 SyncBarrier barrier;
509 VkImageLayout old_layout;
510 VkImageLayout new_layout;
John Zulauf110413c2021-03-20 05:38:38 -0600511 VkImageSubresourceRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700512
513 bool IsLayoutTransition() const { return old_layout != new_layout; }
John Zulauf110413c2021-03-20 05:38:38 -0600514 const VkImageSubresourceRange &Range() const { return range; };
John Zulaufd5115702021-01-18 12:34:33 -0700515 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700516 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
517 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
518 : image(image_),
519 index(index_),
520 barrier(barrier_),
521 old_layout(old_layout_),
522 new_layout(new_layout_),
John Zulauf110413c2021-03-20 05:38:38 -0600523 range(subresource_range_) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700524 SyncImageMemoryBarrier() = default;
525};
526
527class SyncOpBase {
528 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700529 SyncOpBase() : cmd_(CMD_NONE) {}
530 SyncOpBase(CMD_TYPE cmd) : cmd_(cmd) {}
John Zulauf8eda1562021-04-13 17:06:41 -0600531 virtual ~SyncOpBase() = default;
532
sfricke-samsung85584a72021-09-30 21:43:38 -0700533 const char *CmdName() const { return CommandTypeString(cmd_); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700534 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf8eda1562021-04-13 17:06:41 -0600535 virtual ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const = 0;
536 virtual bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600537 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const = 0;
John Zulauf4fa68462021-04-26 21:04:22 -0600538 virtual void DoRecord(ResourceUsageTag tag, AccessContext *access_context, SyncEventsContext *events_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700539
540 protected:
541 CMD_TYPE cmd_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700542};
543
John Zulaufd5115702021-01-18 12:34:33 -0700544class SyncOpBarriers : public SyncOpBase {
545 protected:
546 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600547 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700548 AccessContext *context);
549 template <typename Barriers, typename FunctorFactory>
John Zulauf14940722021-04-12 15:19:02 -0600550 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, ResourceUsageTag tag,
John Zulaufd5115702021-01-18 12:34:33 -0700551 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700552
John Zulauf36ef9282021-02-02 11:47:24 -0700553 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700554 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
555 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
556 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
557 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700558 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
559 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700560
John Zulauf8eda1562021-04-13 17:06:41 -0600561 ~SyncOpBarriers() override = default;
562
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700563 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700564 struct BarrierSet {
565 VkDependencyFlags dependency_flags;
566 SyncExecScope src_exec_scope;
567 SyncExecScope dst_exec_scope;
568 std::vector<SyncMemoryBarrier> memory_barriers;
569 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
570 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
571 bool single_exec_scope;
572 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
573 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
574 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
575 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
576 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
577 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
578 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
579 const VkImageMemoryBarrier *pImageMemoryBarriers);
580 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700581 const VkMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700582 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700583 uint32_t barrier_count, const VkBufferMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700584 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
Tony-LunarG3f6eceb2021-11-18 14:34:49 -0700585 uint32_t barrier_count, const VkImageMemoryBarrier2 *barriers);
John Zulauf4edde622021-02-15 08:54:50 -0700586 };
587 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700588};
589
John Zulaufd5115702021-01-18 12:34:33 -0700590class SyncOpPipelineBarrier : public SyncOpBarriers {
591 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700592 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
593 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
594 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700595 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
596 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700597 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
598 const VkDependencyInfoKHR &pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600599 ~SyncOpPipelineBarrier() override = default;
600
John Zulaufd5115702021-01-18 12:34:33 -0700601 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600602 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
603 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600604 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600605 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700606};
607
608class SyncOpWaitEvents : public SyncOpBarriers {
609 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700610 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
611 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
612 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700613 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
614 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700615
616 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
617 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600618 ~SyncOpWaitEvents() override = default;
John Zulauf4edde622021-02-15 08:54:50 -0700619
John Zulaufd5115702021-01-18 12:34:33 -0700620 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600621 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
622 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600623 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600624 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700625
626 protected:
John Zulauf610e28c2021-08-03 17:46:23 -0600627 static const char *const kIgnored;
628 bool DoValidate(const CommandBufferAccessContext &cb_context, const ResourceUsageTag base_tag) const;
John Zulaufd5115702021-01-18 12:34:33 -0700629 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
630 // 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 -0700631 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
632 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700633};
634
John Zulauf6ce24372021-01-30 05:56:25 -0700635class SyncOpResetEvent : public SyncOpBase {
636 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700637 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700638 VkPipelineStageFlags2KHR stageMask);
John Zulauf8eda1562021-04-13 17:06:41 -0600639 ~SyncOpResetEvent() override = default;
640
John Zulauf6ce24372021-01-30 05:56:25 -0700641 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600642 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
643 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600644 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600645 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700646
647 private:
John Zulauf1bf30522021-09-03 15:39:06 -0600648 bool DoValidate(const CommandBufferAccessContext& cb_context, const ResourceUsageTag base_tag) const;
John Zulauf6ce24372021-01-30 05:56:25 -0700649 std::shared_ptr<const EVENT_STATE> event_;
650 SyncExecScope exec_scope_;
651};
652
653class SyncOpSetEvent : public SyncOpBase {
654 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700655 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700656 VkPipelineStageFlags2KHR stageMask);
657 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
658 const VkDependencyInfoKHR &dep_info);
John Zulauf8eda1562021-04-13 17:06:41 -0600659 ~SyncOpSetEvent() override = default;
660
John Zulauf6ce24372021-01-30 05:56:25 -0700661 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600662 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
663 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600664 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700665
666 private:
John Zulauf610e28c2021-08-03 17:46:23 -0600667 bool DoValidate(const CommandBufferAccessContext &cb_context, const ResourceUsageTag base_tag) const;
668 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700669 std::shared_ptr<const EVENT_STATE> event_;
670 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700671 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
Tony-LunarG273f32f2021-09-28 08:56:30 -0600672 std::shared_ptr<safe_VkDependencyInfo> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700673};
John Zulauf64ffe552021-02-06 10:25:07 -0700674
675class SyncOpBeginRenderPass : public SyncOpBase {
676 public:
677 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -0700678 const VkSubpassBeginInfo *pSubpassBeginInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600679 ~SyncOpBeginRenderPass() override = default;
680
John Zulauf64ffe552021-02-06 10:25:07 -0700681 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600682 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
683 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600684 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600685 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700686
687 protected:
688 safe_VkRenderPassBeginInfo renderpass_begin_info_;
689 safe_VkSubpassBeginInfo subpass_begin_info_;
690 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
691 std::vector<const IMAGE_VIEW_STATE *> attachments_;
692 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
693};
694
695class SyncOpNextSubpass : public SyncOpBase {
696 public:
697 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -0700698 const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600699 ~SyncOpNextSubpass() override = default;
700
John Zulauf64ffe552021-02-06 10:25:07 -0700701 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600702 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
703 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600704 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600705 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700706
707 protected:
708 safe_VkSubpassBeginInfo subpass_begin_info_;
709 safe_VkSubpassEndInfo subpass_end_info_;
710};
711
712class SyncOpEndRenderPass : public SyncOpBase {
713 public:
sfricke-samsung85584a72021-09-30 21:43:38 -0700714 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo);
John Zulauf8eda1562021-04-13 17:06:41 -0600715 ~SyncOpEndRenderPass() override = default;
716
John Zulauf64ffe552021-02-06 10:25:07 -0700717 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf8eda1562021-04-13 17:06:41 -0600718 ResourceUsageTag Record(CommandBufferAccessContext *cb_context) const override;
719 bool ReplayValidate(ResourceUsageTag recorded_tag, const CommandBufferAccessContext &recorded_context,
John Zulauf610e28c2021-08-03 17:46:23 -0600720 ResourceUsageTag base_tag, CommandBufferAccessContext *active_context) const override;
John Zulauf4fa68462021-04-26 21:04:22 -0600721 void DoRecord(ResourceUsageTag recorded_tag, AccessContext *access_context, SyncEventsContext *events_context) const override;
John Zulauf64ffe552021-02-06 10:25:07 -0700722
723 protected:
724 safe_VkSubpassEndInfo subpass_end_info_;
725};
726
John Zulauf540266b2020-04-06 18:54:53 -0600727class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700728 public:
John Zulauf69133422020-05-20 14:55:53 -0600729 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600730 kDetectPrevious = 1U << 0,
731 kDetectAsync = 1U << 1,
732 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600733 };
John Zulauf43cc7462020-12-03 12:33:12 -0700734 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600735
John Zulauf3d84f1b2020-03-09 13:33:25 -0600736 struct TrackBack {
John Zulaufa0a98292020-09-18 09:30:10 -0600737 std::vector<SyncBarrier> barriers;
John Zulauf1a224292020-06-30 14:52:13 -0600738 const AccessContext *context;
Nathaniel Cesariob38a6672021-11-15 12:05:48 -0700739 TrackBack(const TrackBack &) = default;
John Zulaufbaea94f2020-09-15 17:55:16 -0600740 TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_,
John Zulaufa0a98292020-09-18 09:30:10 -0600741 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
742 : barriers(), context(context_) {
743 barriers.reserve(subpass_dependencies_.size());
744 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
745 assert(dependency);
746 barriers.emplace_back(queue_flags_, *dependency);
747 }
748 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600749 TrackBack &operator=(const TrackBack &) = default;
750 TrackBack() = default;
751 };
John Zulauf5c5e88d2019-12-26 11:22:02 -0700752
John Zulauf355e49b2020-04-24 15:11:15 -0600753 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600754 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600755 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
756 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600757 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700758 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
759 DetectOptions options) const;
760 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600761 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
762 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf110413c2021-03-20 05:38:38 -0600763 template <typename Detector>
764 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
765 DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600766 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf110413c2021-03-20 05:38:38 -0600767 const VkImageSubresourceRange &subresource_range) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700768 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
769 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
770
John Zulauf69133422020-05-20 14:55:53 -0600771 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700772 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600773 const VkOffset3D &offset, const VkExtent3D &extent) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700774 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700775 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700776 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
777 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700778 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
779 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700780 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700781 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700782 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700783 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700784 const SyncStageAccessFlags &src_stage_accesses,
785 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700786 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700787 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600788
John Zulaufb02c1eb2020-10-06 16:33:36 -0600789 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulauf14940722021-04-12 15:19:02 -0600790 const AttachmentViewGenVector &attachment_views, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600791
John Zulaufae842002021-04-15 18:20:55 -0600792 HazardResult DetectFirstUseHazard(const ResourceUsageRange &tag_range, const AccessContext &access_context) const;
793
John Zulaufe5da6e52020-03-18 15:32:18 -0600794 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600795 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600796 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600797 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600798 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700799 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600800 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700801 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600802 for (auto &map : access_state_maps_) {
803 map.clear();
804 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600805 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600806
807 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
808 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600809 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
810 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700811 template <typename BarrierAction>
812 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
813 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700814 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700815 const ResourceAccessState *infill_state,
816 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700817 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600818 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700819 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
820 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600821 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700822 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600823 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
824 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600825
John Zulauf8e3c3e92021-01-06 11:19:36 -0700826 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600827 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700828 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf110413c2021-03-20 05:38:38 -0600829 const VkImageSubresourceRange &subresource_range, const ResourceUsageTag &tag);
830 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600831 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600832 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700833 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
John Zulauf14940722021-04-12 15:19:02 -0600834 SyncOrdering ordering_rule, ResourceUsageTag tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700835 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600836 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
John Zulauf14940722021-04-12 15:19:02 -0600837 ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700838 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600839 uint32_t subpass, ResourceUsageTag tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700840 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
John Zulauf14940722021-04-12 15:19:02 -0600841 uint32_t subpass, ResourceUsageTag tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600842
John Zulauf540266b2020-04-06 18:54:53 -0600843 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600844
John Zulauf4fa68462021-04-26 21:04:22 -0600845 void ImportAsyncContexts(const AccessContext &from);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700846 template <typename Action, typename RangeGen>
847 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600848 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700849 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600850 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700851 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700852 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600853
John Zulauf540266b2020-04-06 18:54:53 -0600854 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600855 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600856
857 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600858 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600859
John Zulauf43cc7462020-12-03 12:33:12 -0700860 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
861 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
862 return access_state_maps_[static_cast<size_t>(type)];
863 }
864 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
865 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
866 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
867 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600868 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
869 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700870 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600871 } else {
872 assert(subpass < prev_by_subpass_.size());
873 return prev_by_subpass_[subpass];
874 }
875 }
John Zulauf16adfc92020-04-08 10:28:33 -0600876
John Zulauf64ffe552021-02-06 10:25:07 -0700877 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700878 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
879 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700880 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700881 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
882 const char *func_name) const;
883 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
884
885 const RENDER_PASS_STATE &rp_state,
886
887 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
888 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700889 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700890 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700891 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600892
John Zulauf14940722021-04-12 15:19:02 -0600893 void SetStartTag(ResourceUsageTag tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700894 template <typename Action>
895 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700896
John Zulauf3d84f1b2020-03-09 13:33:25 -0600897 private:
898 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700899 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600900 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600901 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700902 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600903 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700904 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700905 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf14940722021-04-12 15:19:02 -0600906 const ResourceAccessRange &range, ResourceUsageTag tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600907
908 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600909 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600910 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700911 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700912 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600913 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700914 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600915};
916
John Zulauf355e49b2020-04-24 15:11:15 -0600917class RenderPassAccessContext {
918 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700919 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
920 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700921 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
922 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
923 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600924
John Zulauf64ffe552021-02-06 10:25:07 -0700925 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
926 const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -0600927 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, ResourceUsageTag tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700928 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
929 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
930 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600931
John Zulauf14940722021-04-12 15:19:02 -0600932 void RecordLayoutTransitions(ResourceUsageTag tag);
933 void RecordLoadOperations(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -0700934 void RecordBeginRenderPass(ResourceUsageTag tag, ResourceUsageTag load_tag);
935 void RecordNextSubpass(ResourceUsageTag store_tag, ResourceUsageTag barrier_tag, ResourceUsageTag load_tag);
936 void RecordEndRenderPass(AccessContext *external_context, ResourceUsageTag store_tag, ResourceUsageTag barrier_tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600937
John Zulauf540266b2020-04-06 18:54:53 -0600938 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
939 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600940 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
941 uint32_t GetCurrentSubpass() const { return current_subpass_; }
942 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700943 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -0600944
945 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600946 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700947 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600948 uint32_t current_subpass_;
949 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700950 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600951};
952
John Zulauf64ffe552021-02-06 10:25:07 -0700953// Command execution context is the base class for command buffer and queue contexts
954// Preventing unintented leakage of subclass specific state, storing enough information
955// for message logging.
956// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
957class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600958 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700959 CommandExecutionContext() : sync_state_(nullptr) {}
960 CommandExecutionContext(SyncValidator *sync_validator) : sync_state_(sync_validator) {}
961 virtual ~CommandExecutionContext() = default;
962 const SyncValidator &GetSyncState() const {
963 assert(sync_state_);
964 return *sync_state_;
965 }
966 SyncValidator &GetSyncState() {
967 assert(sync_state_);
968 return *sync_state_;
969 }
John Zulauf4fa68462021-04-26 21:04:22 -0600970 virtual std::string FormatUsage(ResourceUsageTag tag) const = 0;
971 virtual std::string FormatUsage(const ResourceFirstAccess &access) const = 0;
John Zulauf64ffe552021-02-06 10:25:07 -0700972 virtual std::string FormatUsage(const HazardResult &hazard) const = 0;
973
974 protected:
975 SyncValidator *sync_state_;
976};
977
978class CommandBufferAccessContext : public CommandExecutionContext {
979 public:
John Zulauf8eda1562021-04-13 17:06:41 -0600980 using SyncOpPointer = std::shared_ptr<SyncOpBase>;
981 struct SyncOpEntry {
982 ResourceUsageTag tag;
983 SyncOpPointer sync_op;
984 SyncOpEntry(ResourceUsageTag tag_, SyncOpPointer &&sync_op_) : tag(tag_), sync_op(std::move(sync_op_)) {}
985 SyncOpEntry() = default;
986 SyncOpEntry(const SyncOpEntry &other) = default;
987 };
988
John Zulauf64ffe552021-02-06 10:25:07 -0700989 CommandBufferAccessContext(SyncValidator *sync_validator = nullptr)
990 : CommandExecutionContext(sync_validator),
John Zulauf4fa68462021-04-26 21:04:22 -0600991 cb_state_(),
992 queue_flags_(),
993 destroyed_(false),
John Zulauf14940722021-04-12 15:19:02 -0600994 access_log_(),
John Zulauf3c2a0b32021-07-14 11:14:52 -0600995 cbs_referenced_(),
John Zulauffaea0ee2021-01-14 14:01:32 -0700996 command_number_(0),
997 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600998 reset_count_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600999 cb_access_context_(),
1000 current_context_(&cb_access_context_),
John Zulauf669dfd52021-01-27 17:15:28 -07001001 events_context_(),
John Zulauf4fa68462021-04-26 21:04:22 -06001002 render_pass_contexts_(),
1003 current_renderpass_context_(),
1004 sync_ops_() {}
John Zulauf355e49b2020-04-24 15:11:15 -06001005 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -07001006 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001007 cb_state_ = cb_state;
1008 queue_flags_ = queue_flags;
1009 }
John Zulauf4fa68462021-04-26 21:04:22 -06001010
1011 struct AsProxyContext {};
1012 CommandBufferAccessContext(const CommandBufferAccessContext &real_context, AsProxyContext dummy);
1013
John Zulauf64ffe552021-02-06 10:25:07 -07001014 ~CommandBufferAccessContext() override = default;
1015 CommandExecutionContext &GetExecutionContext() { return *this; }
1016 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001017
1018 void Reset() {
John Zulauf14940722021-04-12 15:19:02 -06001019 access_log_.clear();
John Zulauf3c2a0b32021-07-14 11:14:52 -06001020 cbs_referenced_.clear();
John Zulauf8eda1562021-04-13 17:06:41 -06001021 sync_ops_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001022 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -07001023 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -06001024 reset_count_++;
1025 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -06001026 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -06001027 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001028 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -07001029 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -07001030 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001031 void MarkDestroyed() { destroyed_ = true; }
1032 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -07001033
John Zulauf4fa68462021-04-26 21:04:22 -06001034 std::string FormatUsage(ResourceUsageTag tag) const override;
1035 std::string FormatUsage(const ResourceFirstAccess &access) const override;
John Zulauf64ffe552021-02-06 10:25:07 -07001036 std::string FormatUsage(const HazardResult &hazard) const override;
John Zulauf540266b2020-04-06 18:54:53 -06001037 AccessContext *GetCurrentAccessContext() { return current_context_; }
John Zulauf669dfd52021-01-27 17:15:28 -07001038 SyncEventsContext *GetCurrentEventsContext() { return &events_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001039 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf540266b2020-04-06 18:54:53 -06001040 const AccessContext *GetCurrentAccessContext() const { return current_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -07001041 const SyncEventsContext *GetCurrentEventsContext() const { return &events_context_; }
1042 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
John Zulauf41a9c7c2021-12-07 15:59:53 -07001043 ResourceUsageTag RecordBeginRenderPass(CMD_TYPE cmd, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
1044 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
Jeremy Gebben9893daf2021-01-04 10:40:50 -07001045 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -07001046
locke-lunarg61870c22020-06-09 14:51:50 -06001047 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001048 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001049 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001050 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001051 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001052 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, ResourceUsageTag tag);
locke-lunarg61870c22020-06-09 14:51:50 -06001053 bool ValidateDrawSubpassAttachment(const char *func_name) const;
John Zulauf14940722021-04-12 15:19:02 -06001054 void RecordDrawSubpassAttachment(ResourceUsageTag tag);
John Zulauf41a9c7c2021-12-07 15:59:53 -07001055 ResourceUsageTag RecordNextSubpass(CMD_TYPE cmd);
1056 ResourceUsageTag RecordEndRenderPass(CMD_TYPE cmd);
John Zulauf4a6105a2020-11-17 15:11:05 -07001057 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -07001058
John Zulauf4fa68462021-04-26 21:04:22 -06001059 bool ValidateFirstUse(CommandBufferAccessContext *proxy_context, const char *func_name, uint32_t index) const;
1060 void RecordExecutedCommandBuffer(const CommandBufferAccessContext &recorded_context, CMD_TYPE cmd);
1061
1062 void ResolveRecordedContext(const AccessContext &recorded_context, ResourceUsageTag offset);
1063 ResourceUsageRange ImportRecordedAccessLog(const CommandBufferAccessContext &recorded_context);
John Zulaufae842002021-04-15 18:20:55 -06001064
John Zulauf3d84f1b2020-03-09 13:33:25 -06001065 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
1066 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -07001067
John Zulauf41a9c7c2021-12-07 15:59:53 -07001068 ResourceUsageTag NextSubcommandTag(CMD_TYPE command, ResourceUsageRecord::SubcommandType subcommand);
1069 ResourceUsageTag GetTagLimit() const { return access_log_.size(); }
John Zulauffaea0ee2021-01-14 14:01:32 -07001070
John Zulauf41a9c7c2021-12-07 15:59:53 -07001071 ResourceUsageTag NextCommandTag(CMD_TYPE command,
1072 ResourceUsageRecord::SubcommandType subcommand = ResourceUsageRecord::SubcommandType::kNone);
1073 ResourceUsageTag NextIndexedCommandTag(CMD_TYPE command, uint32_t index);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001074
John Zulauffaea0ee2021-01-14 14:01:32 -07001075 const CMD_BUFFER_STATE &GetCBState() const {
1076 assert(cb_state_);
1077 return *(cb_state_.get());
1078 }
1079 CMD_BUFFER_STATE &GetCBState() {
1080 assert(cb_state_);
1081 return *(cb_state_.get());
1082 }
John Zulauffaea0ee2021-01-14 14:01:32 -07001083
John Zulauf1bf30522021-09-03 15:39:06 -06001084 template <class T, class... Args>
1085 void RecordSyncOp(Args &&...args) {
1086 // T must be as derived from SyncOpBase or the compiler will flag the next line as an error.
1087 SyncOpPointer sync_op(std::make_shared<T>(std::forward<Args>(args)...));
1088 auto tag = sync_op->Record(this);
1089 AddSyncOp(tag, std::move(sync_op));
1090 }
John Zulauf8eda1562021-04-13 17:06:41 -06001091
John Zulauf3d84f1b2020-03-09 13:33:25 -06001092 private:
John Zulauf1bf30522021-09-03 15:39:06 -06001093 void AddSyncOp(ResourceUsageTag tag, SyncOpPointer &&sync_op) { sync_ops_.emplace_back(tag, std::move(sync_op)); }
John Zulauf4fa68462021-04-26 21:04:22 -06001094 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
1095 VkQueueFlags queue_flags_;
1096 bool destroyed_;
1097
John Zulauf14940722021-04-12 15:19:02 -06001098 std::vector<ResourceUsageRecord> access_log_;
John Zulauf3c2a0b32021-07-14 11:14:52 -06001099 layer_data::unordered_set<std::shared_ptr<const CMD_BUFFER_STATE>> cbs_referenced_;
John Zulauf355e49b2020-04-24 15:11:15 -06001100 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -07001101 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -06001102 uint32_t reset_count_;
John Zulauf4fa68462021-04-26 21:04:22 -06001103
John Zulauf355e49b2020-04-24 15:11:15 -06001104 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -06001105 AccessContext *current_context_;
John Zulauf669dfd52021-01-27 17:15:28 -07001106 SyncEventsContext events_context_;
John Zulauf4fa68462021-04-26 21:04:22 -06001107
1108 // Don't need the following for an active proxy cb context
1109 std::vector<RenderPassAccessContext> render_pass_contexts_;
1110 RenderPassAccessContext *current_renderpass_context_;
1111 std::vector<SyncOpEntry> sync_ops_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001112};
1113
1114class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1115 public:
1116 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
1117 using StateTracker = ValidationStateTracker;
1118
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001119 layer_data::unordered_map<VkCommandBuffer, CommandBufferAccessContextShared> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001120
1121 CommandBufferAccessContextShared GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
John Zulauf9cb530d2019-09-30 14:14:10 -06001122 auto found_it = cb_access_state.find(command_buffer);
1123 if (found_it == cb_access_state.end()) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001124 if (!do_insert) return CommandBufferAccessContextShared();
John Zulauf9cb530d2019-09-30 14:14:10 -06001125 // If we don't have one, make it.
Jeremy Gebben9f537102021-10-05 16:37:12 -06001126 auto cb_state = Get<CMD_BUFFER_STATE>(command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001127 assert(cb_state.get());
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06001128 auto queue_flags = cb_state->GetQueueFlags();
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001129 std::shared_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001130 auto insert_pair = cb_access_state.emplace(command_buffer, std::move(context));
John Zulauf9cb530d2019-09-30 14:14:10 -06001131 found_it = insert_pair.first;
1132 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001133 return found_it->second;
John Zulauf9cb530d2019-09-30 14:14:10 -06001134 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001135
John Zulauf3d84f1b2020-03-09 13:33:25 -06001136 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001137 return GetAccessContextImpl(command_buffer, true).get(); // true -> do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001138 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001139 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001140 return GetAccessContextImpl(command_buffer, false).get(); // false -> don't do_insert on not found
1141 }
1142
1143 CommandBufferAccessContextShared GetAccessContextShared(VkCommandBuffer command_buffer) {
1144 return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
1145 }
1146 CommandBufferAccessContextShared GetAccessContextSharedNoInsert(VkCommandBuffer command_buffer) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001147 return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001148 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001149
1150 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
John Zulauf9cb530d2019-09-30 14:14:10 -06001151 const auto found_it = cb_access_state.find(command_buffer);
1152 if (found_it == cb_access_state.end()) {
1153 return nullptr;
1154 }
1155 return found_it->second.get();
1156 }
1157
John Zulaufd1f85d42020-04-15 12:23:15 -06001158 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1159 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001160 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001161 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd);
John Zulauf64ffe552021-02-06 10:25:07 -07001162 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001163 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
1164 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd);
John Zulauf33fc1d52020-07-17 11:01:10 -06001165 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001166
Jeremy Gebben36a3b832022-03-23 10:54:18 -06001167 void CreateDevice(const VkDeviceCreateInfo *pCreateInfo) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001168
John Zulauf355e49b2020-04-24 15:11:15 -06001169 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
sfricke-samsung85584a72021-09-30 21:43:38 -07001170 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001171
1172 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001173 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001174
1175 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001176 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001177
1178 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001179 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001180
John Zulauf9cb530d2019-09-30 14:14:10 -06001181 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001182 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001183
1184 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001185 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001186
John Zulauf4a6105a2020-11-17 15:11:05 -07001187 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001188 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Tony-LunarGef035472021-11-02 10:23:33 -06001189 bool PreCallValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) const override;
1190 bool ValidateCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos, CMD_TYPE cmd_type) const;
Jeff Leger178b1e52020-10-05 12:22:23 -04001191
Tony-LunarGef035472021-11-02 10:23:33 -06001192 void RecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001193 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Tony-LunarGef035472021-11-02 10:23:33 -06001194 void PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001195
John Zulauf5c5e88d2019-12-26 11:22:02 -07001196 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1197 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001198 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001199
1200 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001201 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001202
Tony-LunarGb61514a2021-11-02 12:36:51 -06001203 bool ValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001204 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001205 bool PreCallValidateCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001206
Tony-LunarGb61514a2021-11-02 12:36:51 -06001207 void RecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo, CMD_TYPE cmd_type);
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001208 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Tony-LunarGb61514a2021-11-02 12:36:51 -06001209 void PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001210
John Zulauf9cb530d2019-09-30 14:14:10 -06001211 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1212 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1213 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1214 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1215 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001216 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001217
1218 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1219 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1220 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1221 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001222 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001223
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001224 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1225 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001226 bool PreCallValidateCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) const override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001227 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07001228 void PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001229
John Zulauf3d84f1b2020-03-09 13:33:25 -06001230 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001231 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001232
1233 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001234 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001235 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001236 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001237 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001238 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001239
Mike Schuchardt2df08912020-12-15 16:28:09 -08001240 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
sfricke-samsung85584a72021-09-30 21:43:38 -07001241 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001242 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001243 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1244 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1245 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1246 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001247
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001248 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001249 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001250 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001251 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001252 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001253
sfricke-samsung85584a72021-09-30 21:43:38 -07001254 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001255 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001256 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1257 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001258
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001259 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1260 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1261 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001262
sfricke-samsung71f04e32022-03-16 01:21:21 -05001263 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001264 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001265 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001266 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001267 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1268 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001269 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001270 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001271 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001272 bool PreCallValidateCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1273 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001274
sfricke-samsung71f04e32022-03-16 01:21:21 -05001275 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001276 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001277 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions,
Tony Barbour845d29b2021-11-09 11:43:14 -07001278 CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001279 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001280 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001281 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001282 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
Tony Barbour845d29b2021-11-09 11:43:14 -07001283 void PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
1284 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001285
sfricke-samsung71f04e32022-03-16 01:21:21 -05001286 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001287 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001288 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions,
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001289 CMD_TYPE cmd_type) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001290 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001291 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001292 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001293 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001294 bool PreCallValidateCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1295 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001296
sfricke-samsung71f04e32022-03-16 01:21:21 -05001297 template <typename RegionType>
Jeff Leger178b1e52020-10-05 12:22:23 -04001298 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
sfricke-samsung71f04e32022-03-16 01:21:21 -05001299 VkBuffer dstBuffer, uint32_t regionCount, const RegionType *pRegions, CMD_TYPE cmd_type);
locke-lunarga19c71d2020-03-02 18:17:04 -07001300 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001301 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001302 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001303 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Tony-LunarGaf3632a2021-11-10 15:51:57 -07001304 void PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
1305 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001306
1307 template <typename RegionType>
1308 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1309 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1310 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001311
1312 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1313 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001314 const VkImageBlit *pRegions, VkFilter filter) const override;
1315 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001316 bool PreCallValidateCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001317
Jeff Leger178b1e52020-10-05 12:22:23 -04001318 template <typename RegionType>
1319 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1320 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1321 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001322 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1323 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001324 VkFilter filter) override;
1325 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
Tony-LunarG542ae912021-11-04 16:06:44 -06001326 void PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001327
John Zulauffaea0ee2021-01-14 14:01:32 -07001328 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1329 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1330 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001331 const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001332 void RecordIndirectBuffer(AccessContext &context, ResourceUsageTag tag, const VkDeviceSize struct_size, const VkBuffer buffer,
1333 const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001334
John Zulauffaea0ee2021-01-14 14:01:32 -07001335 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1336 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
John Zulauf14940722021-04-12 15:19:02 -06001337 void RecordCountBuffer(AccessContext &context, ResourceUsageTag tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001338
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001339 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1340 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001341
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001342 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1343 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001344
1345 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001346 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001347 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001348 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001349
1350 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001351 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001352 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001353 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001354
1355 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001356 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001357 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001358 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001359
1360 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001361 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001362 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001363 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001364
locke-lunargff255f92020-05-13 18:53:52 -06001365 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1366 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1367 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001368 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1369 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001370 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001371 void RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1372 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001373 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1374 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001375 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001376 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1377 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001378 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001379 void PreCallRecordCmdDrawIndirectCountKHR(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 PreCallValidateCmdDrawIndirectCountAMD(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 PreCallRecordCmdDrawIndirectCountAMD(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
locke-lunargff255f92020-05-13 18:53:52 -06001389 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1390 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1391 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001392 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1393 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001394 uint32_t stride) const override;
sfricke-samsung85584a72021-09-30 21:43:38 -07001395 void RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1396 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1397 uint32_t stride, CMD_TYPE cmd_type);
locke-lunarge1a67022020-04-29 00:15:36 -06001398 void PreCallRecordCmdDrawIndexedIndirectCount(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) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001401 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1402 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001403 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001404 void PreCallRecordCmdDrawIndexedIndirectCountKHR(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 PreCallValidateCmdDrawIndexedIndirectCountAMD(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 PreCallRecordCmdDrawIndexedIndirectCountAMD(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
1414 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1415 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001416 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001417 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1418 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001419 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001420
1421 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1422 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001423 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001424 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1425 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001426 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001427
1428 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1429 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001430 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001431 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1432 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001433 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001434
1435 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001436 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001437 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001438 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001439
1440 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1441 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001442 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001443
locke-lunarge1a67022020-04-29 00:15:36 -06001444 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1445 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001446 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001447
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001448 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001449 bool PreCallValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) const override;
1450 bool ValidateCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001451 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Tony-LunarG562fc102021-11-12 13:58:35 -07001452 void PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo) override;
1453 void RecordCmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo, CMD_TYPE cmd_type);
Jeff Leger178b1e52020-10-05 12:22:23 -04001454
locke-lunarge1a67022020-04-29 00:15:36 -06001455 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001456 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001457 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001458 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001459
1460 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001461 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001462 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001463 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001464
1465 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1466 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1467
John Zulauf4edde622021-02-15 08:54:50 -07001468 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1469 const VkDependencyInfoKHR *pDependencyInfo) const override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001470 bool PreCallValidateCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1471 const VkDependencyInfo *pDependencyInfo) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001472 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1473 const VkDependencyInfoKHR *pDependencyInfo) override;
Tony-LunarGc43525f2021-11-15 16:12:38 -07001474 void PostCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo *pDependencyInfo) override;
John Zulauf4edde622021-02-15 08:54:50 -07001475
John Zulauf49beb112020-11-04 16:06:31 -07001476 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1477 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1478
John Zulauf4edde622021-02-15 08:54:50 -07001479 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1480 VkPipelineStageFlags2KHR stageMask) const override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001481 bool PreCallValidateCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
1482 VkPipelineStageFlags2 stageMask) const override;
John Zulauf4edde622021-02-15 08:54:50 -07001483 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
Tony-LunarGa2662db2021-11-16 07:26:24 -07001484 void PostCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask) override;
John Zulauf4edde622021-02-15 08:54:50 -07001485
John Zulauf49beb112020-11-04 16:06:31 -07001486 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1487 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1488 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1489 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1490 uint32_t imageMemoryBarrierCount,
1491 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1492 void PostCallRecordCmdWaitEvents(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, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001497 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1498 const VkDependencyInfoKHR *pDependencyInfos) const override;
1499 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1500 const VkDependencyInfoKHR *pDependencyInfos) override;
Tony-LunarG1364cf52021-11-17 16:10:11 -07001501 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1502 const VkDependencyInfo *pDependencyInfos) const override;
1503 void PostCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1504 const VkDependencyInfo *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001505 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1506 VkDeviceSize dstOffset, uint32_t marker) const override;
1507 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1508 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufae842002021-04-15 18:20:55 -06001509 bool PreCallValidateCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1510 const VkCommandBuffer *pCommandBuffers) const override;
1511 void PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
1512 const VkCommandBuffer *pCommandBuffers) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001513};