blob: 2f9049657a3edc92aa8a63174c6597aa4b0f4ecc [file] [log] [blame]
John Zulauf3d84f1b2020-03-09 13:33:25 -06001/*
John Zulaufab7756b2020-12-29 16:10:16 -07002 * Copyright (c) 2019-2021 Valve Corporation
3 * Copyright (c) 2019-2021 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"
30
John Zulaufd05c5842021-03-26 11:32:16 -060031// Do not commit enabled
32// #define SYNCVAL_DIAGNOSTICS
33
John Zulaufd5115702021-01-18 12:34:33 -070034class AccessContext;
John Zulauffaea0ee2021-01-14 14:01:32 -070035class CommandBufferAccessContext;
John Zulaufe7f6a5e2021-01-16 14:31:18 -070036using CommandBufferAccessContextShared = std::shared_ptr<CommandBufferAccessContext>;
John Zulauf64ffe552021-02-06 10:25:07 -070037class CommandExecutionContext;
John Zulaufd5115702021-01-18 12:34:33 -070038class ResourceAccessState;
39class 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 Zulauffaea0ee2021-01-14 14:01:32 -070092// The resource tag is relative to the command buffer or queue in which it's found
John Zulauf5f13a792020-03-10 07:31:21 -060093struct ResourceUsageTag {
John Zulauff4aecca2021-01-05 16:21:58 -070094 using TagIndex = uint64_t;
John Zulauffaea0ee2021-01-14 14:01:32 -070095 using Count = uint32_t;
John Zulauff4aecca2021-01-05 16:21:58 -070096 constexpr static TagIndex kMaxIndex = std::numeric_limits<TagIndex>::max();
John Zulauffaea0ee2021-01-14 14:01:32 -070097 constexpr static uint32_t kMaxCount = std::numeric_limits<Count>::max();
Jeremy Gebben4bb73502020-12-14 11:17:50 -070098
John Zulauffaea0ee2021-01-14 14:01:32 -070099 TagIndex index = 0U; // the index of the command within the command buffer itself (primary or secondary)
100 CMD_TYPE command = CMD_NONE;
101 Count seq_num = 0U;
102 Count sub_command = 0U;
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700103
John Zulauffaea0ee2021-01-14 14:01:32 -0700104 bool operator<(const ResourceUsageTag &rhs) const { return index < rhs.index; }
John Zulauf5f13a792020-03-10 07:31:21 -0600105 bool IsBefore(const ResourceUsageTag &rhs) const { return index < rhs.index; }
John Zulauffaea0ee2021-01-14 14:01:32 -0700106 bool operator==(const ResourceUsageTag &rhs) const { return (index == rhs.index); }
John Zulaufe5da6e52020-03-18 15:32:18 -0600107 bool operator!=(const ResourceUsageTag &rhs) const { return !(*this == rhs); }
Jeremy Gebben4bb73502020-12-14 11:17:50 -0700108
John Zulauffaea0ee2021-01-14 14:01:32 -0700109 ResourceUsageTag() = default;
110 ResourceUsageTag(TagIndex index_, Count seq_num_, Count sub_command_, CMD_TYPE command_)
111 : index(index_), command(command_), seq_num(seq_num_), sub_command(sub_command_) {}
John Zulauf5f13a792020-03-10 07:31:21 -0600112};
113
John Zulauf9cb530d2019-09-30 14:14:10 -0600114struct HazardResult {
John Zulauf59e25072020-07-17 10:55:21 -0600115 std::unique_ptr<const ResourceAccessState> access_state;
116 SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
John Zulauf9cb530d2019-09-30 14:14:10 -0600117 SyncHazard hazard = NONE;
John Zulauf37ceaed2020-07-03 16:18:15 -0600118 SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
John Zulauf9cb530d2019-09-30 14:14:10 -0600119 ResourceUsageTag tag = ResourceUsageTag();
John Zulauf59e25072020-07-17 10:55:21 -0600120 void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700121 const SyncStageAccessFlags &prior_, const ResourceUsageTag &tag_);
John Zulauf9cb530d2019-09-30 14:14:10 -0600122};
123
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700124struct SyncExecScope {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700125 VkPipelineStageFlags2KHR mask_param; // the xxxStageMask parameter passed by the caller
126 VkPipelineStageFlags2KHR
127 expanded_mask; // all stage bits covered by any 'catch all bits' in the parameter (eg. ALL_GRAPHICS_BIT).
128 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 -0700129 SyncStageAccessFlags valid_accesses; // all valid accesses that can be used with this scope.
130
131 SyncExecScope() : mask_param(0), expanded_mask(0), exec_scope(0), valid_accesses(0) {}
132
Jeremy Gebben40a22942020-12-22 14:22:06 -0700133 static SyncExecScope MakeSrc(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
134 static SyncExecScope MakeDst(VkQueueFlags queue_flags, VkPipelineStageFlags2KHR src_stage_mask);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700135};
136
John Zulauf3d84f1b2020-03-09 13:33:25 -0600137struct SyncBarrier {
John Zulaufc523bf62021-02-16 08:20:34 -0700138 SyncExecScope src_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600139 SyncStageAccessFlags src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700140 SyncExecScope dst_exec_scope;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600141 SyncStageAccessFlags dst_access_scope;
142 SyncBarrier() = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700143 SyncBarrier(const SyncBarrier &other) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600144 SyncBarrier &operator=(const SyncBarrier &) = default;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700145
146 SyncBarrier(const SyncExecScope &src, const SyncExecScope &dst);
147
148 template <typename Barrier>
149 SyncBarrier(const Barrier &barrier, const SyncExecScope &src, const SyncExecScope &dst);
150
151 SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700152 // template constructor for sync2 barriers
153 template <typename Barrier>
154 SyncBarrier(VkQueueFlags queue_flags, const Barrier &barrier);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700155
John Zulaufa0a98292020-09-18 09:30:10 -0600156 void Merge(const SyncBarrier &other) {
John Zulaufc523bf62021-02-16 08:20:34 -0700157 // Note that after merge, only the exec_scope and access_scope fields are fully valid
158 // TODO: Do we need to update any of the other fields? Merging has limited application.
159 src_exec_scope.exec_scope |= other.src_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600160 src_access_scope |= other.src_access_scope;
John Zulaufc523bf62021-02-16 08:20:34 -0700161 dst_exec_scope.exec_scope |= other.dst_exec_scope.exec_scope;
John Zulaufa0a98292020-09-18 09:30:10 -0600162 dst_access_scope |= other.dst_access_scope;
163 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600164};
John Zulauf69133422020-05-20 14:55:53 -0600165
John Zulauf43cc7462020-12-03 12:33:12 -0700166enum class AccessAddressType : uint32_t { kLinear = 0, kIdealized = 1, kMaxType = 1, kTypeCount = kMaxType + 1 };
167
John Zulauf4a6105a2020-11-17 15:11:05 -0700168struct SyncEventState {
John Zulauf4edde622021-02-15 08:54:50 -0700169 enum IgnoreReason { NotIgnored = 0, ResetWaitRace, Reset2WaitRace, SetRace, MissingStageBits, SetVsWait2 };
John Zulauf669dfd52021-01-27 17:15:28 -0700170 using EventPointer = std::shared_ptr<const EVENT_STATE>;
John Zulauf4a6105a2020-11-17 15:11:05 -0700171 using ScopeMap = sparse_container::range_map<VkDeviceSize, bool>;
172 EventPointer event;
173 CMD_TYPE last_command; // Only Event commands are valid here.
174 CMD_TYPE unsynchronized_set;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700175 VkPipelineStageFlags2KHR barriers;
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700176 SyncExecScope scope;
John Zulauf4a6105a2020-11-17 15:11:05 -0700177 ResourceUsageTag first_scope_tag;
John Zulaufd5115702021-01-18 12:34:33 -0700178 bool destroyed;
John Zulauf4a6105a2020-11-17 15:11:05 -0700179 std::array<ScopeMap, static_cast<size_t>(AccessAddressType::kTypeCount)> first_scope;
John Zulauf669dfd52021-01-27 17:15:28 -0700180 template <typename EventPointerType>
181 SyncEventState(EventPointerType &&event_state)
182 : event(std::forward<EventPointerType>(event_state)),
John Zulaufd5115702021-01-18 12:34:33 -0700183 last_command(CMD_NONE),
184 unsynchronized_set(CMD_NONE),
185 barriers(0U),
186 scope(),
187 first_scope_tag(),
188 destroyed((event_state.get() == nullptr) || event_state->destroyed) {}
John Zulauf4a6105a2020-11-17 15:11:05 -0700189 SyncEventState() : SyncEventState(EventPointer()) {}
190 void ResetFirstScope();
191 const ScopeMap &FirstScope(AccessAddressType address_type) const { return first_scope[static_cast<size_t>(address_type)]; }
John Zulauf4edde622021-02-15 08:54:50 -0700192 IgnoreReason IsIgnoredByWait(CMD_TYPE cmd, VkPipelineStageFlags2KHR srcStageMask) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700193 bool HasBarrier(VkPipelineStageFlags2KHR stageMask, VkPipelineStageFlags2KHR exec_scope) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700194};
John Zulaufd5115702021-01-18 12:34:33 -0700195using SyncEventStateShared = std::shared_ptr<SyncEventState>;
196using SyncEventStateConstShared = std::shared_ptr<const SyncEventState>;
John Zulauf669dfd52021-01-27 17:15:28 -0700197class SyncEventsContext {
198 public:
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700199 using Map = layer_data::unordered_map<const EVENT_STATE *, SyncEventStateShared>;
John Zulauf669dfd52021-01-27 17:15:28 -0700200 using iterator = Map::iterator;
201 using const_iterator = Map::const_iterator;
202
203 SyncEventState *GetFromShared(const SyncEventState::EventPointer &event_state) {
204 const auto find_it = map_.find(event_state.get());
205 if (find_it == map_.end()) {
John Zulauf6ce24372021-01-30 05:56:25 -0700206 if (!event_state.get()) return nullptr;
207
John Zulauf669dfd52021-01-27 17:15:28 -0700208 const auto *event_plain_ptr = event_state.get();
209 auto sync_state = SyncEventStateShared(new SyncEventState(event_state));
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700210 auto insert_pair = map_.emplace(event_plain_ptr, sync_state);
John Zulauf669dfd52021-01-27 17:15:28 -0700211 return insert_pair.first->second.get();
212 }
213 return find_it->second.get();
214 }
215
216 const SyncEventState *Get(const EVENT_STATE *event_state) const {
217 const auto find_it = map_.find(event_state);
218 if (find_it == map_.end()) {
219 return nullptr;
220 }
221 return find_it->second.get();
222 }
John Zulauf6ce24372021-01-30 05:56:25 -0700223 const SyncEventState *Get(const SyncEventState::EventPointer &event_state) const { return Get(event_state.get()); }
John Zulauf669dfd52021-01-27 17:15:28 -0700224
225 // stl style naming for range-for support
226 inline iterator begin() { return map_.begin(); }
227 inline const_iterator begin() const { return map_.begin(); }
228 inline iterator end() { return map_.end(); }
229 inline const_iterator end() const { return map_.end(); }
230
231 void Destroy(const EVENT_STATE *event_state) {
232 auto sync_it = map_.find(event_state);
233 if (sync_it != map_.end()) {
234 sync_it->second->destroyed = true;
235 map_.erase(sync_it);
236 }
237 }
238 void Clear() { map_.clear(); }
239
240 private:
241 Map map_;
242};
John Zulauf4a6105a2020-11-17 15:11:05 -0700243
John Zulauf69133422020-05-20 14:55:53 -0600244// To represent ordering guarantees such as rasterization and store
John Zulauf3d84f1b2020-03-09 13:33:25 -0600245
John Zulauf9cb530d2019-09-30 14:14:10 -0600246class ResourceAccessState : public SyncStageAccess {
247 protected:
John Zulauf8e3c3e92021-01-06 11:19:36 -0700248 struct OrderingBarrier {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700249 VkPipelineStageFlags2KHR exec_scope;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700250 SyncStageAccessFlags access_scope;
251 OrderingBarrier() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700252 OrderingBarrier(VkPipelineStageFlags2KHR es, SyncStageAccessFlags as) : exec_scope(es), access_scope(as) {}
John Zulauf8e3c3e92021-01-06 11:19:36 -0700253 OrderingBarrier &operator=(const OrderingBarrier &) = default;
254 };
255 using OrderingBarriers = std::array<OrderingBarrier, static_cast<size_t>(SyncOrdering::kNumOrderings)>;
256
John Zulauffaea0ee2021-01-14 14:01:32 -0700257 struct FirstAccess {
258 ResourceUsageTag tag;
259 SyncStageAccessIndex usage_index;
260 SyncOrdering ordering_rule;
261 FirstAccess(const ResourceUsageTag &tag_, SyncStageAccessIndex usage_index_, SyncOrdering ordering_rule_)
262 : tag(tag_), usage_index(usage_index_), ordering_rule(ordering_rule_){};
263 FirstAccess(const FirstAccess &other) = default;
264 FirstAccess(FirstAccess &&other) = default;
265 FirstAccess &operator=(const FirstAccess &rhs) = default;
266 FirstAccess &operator=(FirstAccess &&rhs) = default;
267
268 bool operator==(const FirstAccess &rhs) const {
269 return (tag == rhs.tag) && (usage_index == rhs.usage_index) && (ordering_rule == rhs.ordering_rule);
270 }
271 };
272 using FirstAccesses = small_vector<FirstAccess, 3>;
273
John Zulauf9cb530d2019-09-30 14:14:10 -0600274 // Mutliple read operations can be simlutaneously (and independently) synchronized,
275 // given the only the second execution scope creates a dependency chain, we have to track each,
276 // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
277 // and applicable one for hazard detection
278 struct ReadState {
Jeremy Gebben40a22942020-12-22 14:22:06 -0700279 VkPipelineStageFlags2KHR stage; // The stage of this read
John Zulauf37ceaed2020-07-03 16:18:15 -0600280 SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
John Zulauff51fbb62020-10-02 14:43:24 -0600281 // TODO: Revisit whether this needs to support multiple reads per stage
Jeremy Gebben40a22942020-12-22 14:22:06 -0700282 VkPipelineStageFlags2KHR barriers; // all applicable barriered stages
John Zulauf9cb530d2019-09-30 14:14:10 -0600283 ResourceUsageTag tag;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700284 VkPipelineStageFlags2KHR pending_dep_chain; // Should be zero except during barrier application
285 // Excluded from comparison
John Zulauf89311b42020-09-29 16:28:47 -0600286 ReadState() = default;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700287 ReadState(VkPipelineStageFlags2KHR stage_, SyncStageAccessFlags access_, VkPipelineStageFlags2KHR barriers_,
John Zulaufab7756b2020-12-29 16:10:16 -0700288 const ResourceUsageTag &tag_)
289 : stage(stage_), access(access_), barriers(barriers_), tag(tag_), pending_dep_chain(0) {}
John Zulaufe5da6e52020-03-18 15:32:18 -0600290 bool operator==(const ReadState &rhs) const {
John Zulauf37ceaed2020-07-03 16:18:15 -0600291 bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
John Zulaufe5da6e52020-03-18 15:32:18 -0600292 return same;
293 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700294 bool IsReadBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700295 // If the read stage is not in the src sync scope
296 // *AND* not execution chained with an existing sync barrier (that's the or)
297 // then the barrier access is unsafe (R/W after R)
298 return (src_exec_scope & (stage | barriers)) == 0;
299 }
300
John Zulaufe5da6e52020-03-18 15:32:18 -0600301 bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700302 inline void Set(VkPipelineStageFlags2KHR stage_, const SyncStageAccessFlags &access_, VkPipelineStageFlags2KHR barriers_,
John Zulauf4285ee92020-09-23 10:20:52 -0600303 const ResourceUsageTag &tag_) {
304 stage = stage_;
305 access = access_;
306 barriers = barriers_;
307 tag = tag_;
John Zulauf89311b42020-09-29 16:28:47 -0600308 pending_dep_chain = 0; // If this is a new read, we aren't applying a barrier set.
John Zulauf4285ee92020-09-23 10:20:52 -0600309 }
John Zulauf9cb530d2019-09-30 14:14:10 -0600310 };
311
312 public:
313 HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700314 HazardResult DetectHazard(SyncStageAccessIndex usage_index, const SyncOrdering &ordering_rule) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600315
Jeremy Gebben40a22942020-12-22 14:22:06 -0700316 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700317 const SyncStageAccessFlags &source_access_scope) const;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700318 HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index, const ResourceUsageTag &start_tag) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700319 HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags2KHR source_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700320 const SyncStageAccessFlags &source_access_scope, const ResourceUsageTag &event_tag) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600321
John Zulauf8e3c3e92021-01-06 11:19:36 -0700322 void Update(SyncStageAccessIndex usage_index, SyncOrdering ordering_rule, const ResourceUsageTag &tag);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700323 void SetWrite(const SyncStageAccessFlags &usage_bit, const ResourceUsageTag &tag);
John Zulauf5f13a792020-03-10 07:31:21 -0600324 void Resolve(const ResourceAccessState &other);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600325 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, bool layout_transition);
326 void ApplyBarriers(const std::vector<SyncBarrier> &barriers, const ResourceUsageTag &tag);
John Zulauf89311b42020-09-29 16:28:47 -0600327 void ApplyBarrier(const SyncBarrier &barrier, bool layout_transition);
John Zulauf4a6105a2020-11-17 15:11:05 -0700328 void ApplyBarrier(const ResourceUsageTag &scope_tag, const SyncBarrier &barrier, bool layout_transition);
John Zulauf89311b42020-09-29 16:28:47 -0600329 void ApplyPendingBarriers(const ResourceUsageTag &tag);
John Zulauf9cb530d2019-09-30 14:14:10 -0600330
331 ResourceAccessState()
John Zulauf355e49b2020-04-24 15:11:15 -0600332 : write_barriers(~SyncStageAccessFlags(0)),
333 write_dependency_chain(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600334 write_tag(),
John Zulaufd14743a2020-07-03 09:42:39 -0600335 last_write(0),
John Zulauff51fbb62020-10-02 14:43:24 -0600336 input_attachment_read(false),
John Zulauf361fb532020-07-22 10:45:39 -0600337 last_read_stages(0),
John Zulauf89311b42020-09-29 16:28:47 -0600338 read_execution_barriers(0),
339 pending_write_dep_chain(0),
340 pending_layout_transition(false),
John Zulauffaea0ee2021-01-14 14:01:32 -0700341 pending_write_barriers(0),
342 first_accesses_(),
343 first_read_stages_(0U) {}
John Zulauf9cb530d2019-09-30 14:14:10 -0600344
John Zulaufb02c1eb2020-10-06 16:33:36 -0600345 bool HasPendingState() const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700346 return (0 != pending_layout_transition) || pending_write_barriers.any() || (0 != pending_write_dep_chain);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600347 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600348 bool HasWriteOp() const { return last_write != 0; }
John Zulaufe5da6e52020-03-18 15:32:18 -0600349 bool operator==(const ResourceAccessState &rhs) const {
350 bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
John Zulaufab7756b2020-12-29 16:10:16 -0700351 (last_reads == rhs.last_reads) && (last_read_stages == rhs.last_read_stages) && (write_tag == rhs.write_tag) &&
352 (input_attachment_read == rhs.input_attachment_read) &&
John Zulauffaea0ee2021-01-14 14:01:32 -0700353 (read_execution_barriers == rhs.read_execution_barriers) && (first_accesses_ == rhs.first_accesses_);
John Zulaufe5da6e52020-03-18 15:32:18 -0600354 return same;
355 }
356 bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700357 VkPipelineStageFlags2KHR GetReadBarriers(const SyncStageAccessFlags &usage) const;
John Zulauf59e25072020-07-17 10:55:21 -0600358 SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700359 bool InSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700360 return ReadInSourceScopeOrChain(src_exec_scope) || WriteInSourceScopeOrChain(src_exec_scope, src_access_scope);
361 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600362
John Zulauf9cb530d2019-09-30 14:14:10 -0600363 private:
Jeremy Gebben40a22942020-12-22 14:22:06 -0700364 static constexpr VkPipelineStageFlags2KHR kInvalidAttachmentStage = ~VkPipelineStageFlags2KHR(0);
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700365 bool IsWriteHazard(SyncStageAccessFlags usage) const { return (usage & ~write_barriers).any(); }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700366 bool IsRAWHazard(VkPipelineStageFlags2KHR usage_stage, const SyncStageAccessFlags &usage) const;
367 bool IsWriteBarrierHazard(VkPipelineStageFlags2KHR src_exec_scope, const SyncStageAccessFlags &src_access_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700368 // If the previous write is *not* in the 1st access scope
369 // *AND* the current barrier is not in the dependency chain
370 // *AND* the there is no prior memory barrier for the previous write in the dependency chain
371 // then the barrier access is unsafe (R/W after W)
372 return ((last_write & src_access_scope) == 0) && ((src_exec_scope & write_dependency_chain) == 0) && (write_barriers == 0);
373 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700374 bool ReadInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope) const {
John Zulauf4a6105a2020-11-17 15:11:05 -0700375 return (0 != (src_exec_scope & (last_read_stages | read_execution_barriers)));
376 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700377 bool WriteInSourceScopeOrChain(VkPipelineStageFlags2KHR src_exec_scope, SyncStageAccessFlags src_access_scope) const {
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700378 return (src_access_scope & last_write).any() || (write_dependency_chain & src_exec_scope);
John Zulaufa0a98292020-09-18 09:30:10 -0600379 }
John Zulaufd14743a2020-07-03 09:42:39 -0600380
Jeremy Gebben40a22942020-12-22 14:22:06 -0700381 static bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const VkPipelineStageFlags2KHR barriers) {
John Zulaufd14743a2020-07-03 09:42:39 -0600382 return stage_mask != (stage_mask & barriers);
383 }
384
Jeremy Gebben40a22942020-12-22 14:22:06 -0700385 bool IsReadHazard(VkPipelineStageFlags2KHR stage_mask, const ReadState &read_access) const {
John Zulaufd14743a2020-07-03 09:42:39 -0600386 return IsReadHazard(stage_mask, read_access.barriers);
John Zulauf0cb5be22020-01-23 12:18:22 -0700387 }
Jeremy Gebben40a22942020-12-22 14:22:06 -0700388 VkPipelineStageFlags2KHR GetOrderedStages(const OrderingBarrier &ordering) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700389
John Zulauffaea0ee2021-01-14 14:01:32 -0700390 void UpdateFirst(const ResourceUsageTag &tag, SyncStageAccessIndex usage_index, SyncOrdering ordering_rule);
391
John Zulauf8e3c3e92021-01-06 11:19:36 -0700392 static const OrderingBarrier &GetOrderingRules(SyncOrdering ordering_enum) {
393 return kOrderingRules[static_cast<size_t>(ordering_enum)];
394 }
John Zulaufd14743a2020-07-03 09:42:39 -0600395
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700396 // TODO: Add a NONE (zero) enum to SyncStageAccessFlags for input_attachment_read and last_write
John Zulaufd14743a2020-07-03 09:42:39 -0600397
John Zulauf9cb530d2019-09-30 14:14:10 -0600398 // With reads, each must be "safe" relative to it's prior write, so we need only
399 // save the most recent write operation (as anything *transitively* unsafe would arleady
400 // be included
401 SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
Jeremy Gebben40a22942020-12-22 14:22:06 -0700402 VkPipelineStageFlags2KHR write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
John Zulauf9cb530d2019-09-30 14:14:10 -0600403 ResourceUsageTag write_tag;
John Zulauf355e49b2020-04-24 15:11:15 -0600404 SyncStageAccessFlags last_write; // only the most recent write
John Zulauf9cb530d2019-09-30 14:14:10 -0600405
John Zulauff51fbb62020-10-02 14:43:24 -0600406 // TODO Input Attachment cleanup for multiple reads in a given stage
407 // Tracks whether the fragment shader read is input attachment read
408 bool input_attachment_read;
John Zulaufd14743a2020-07-03 09:42:39 -0600409
Jeremy Gebben40a22942020-12-22 14:22:06 -0700410 VkPipelineStageFlags2KHR last_read_stages;
411 VkPipelineStageFlags2KHR read_execution_barriers;
John Zulaufab7756b2020-12-29 16:10:16 -0700412 small_vector<ReadState, 3> last_reads;
John Zulauf89311b42020-09-29 16:28:47 -0600413
414 // Pending execution state to support independent parallel barriers
Jeremy Gebben40a22942020-12-22 14:22:06 -0700415 VkPipelineStageFlags2KHR pending_write_dep_chain;
John Zulauf89311b42020-09-29 16:28:47 -0600416 bool pending_layout_transition;
417 SyncStageAccessFlags pending_write_barriers;
John Zulauffaea0ee2021-01-14 14:01:32 -0700418 FirstAccesses first_accesses_;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700419 VkPipelineStageFlags2KHR first_read_stages_;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700420
421 static OrderingBarriers kOrderingRules;
John Zulauf9cb530d2019-09-30 14:14:10 -0600422};
John Zulauf22aefed2021-03-11 18:14:35 -0700423using ResourceAccessStateFunction = std::function<void(ResourceAccessState *)>;
424using ResourceAccessStateConstFunction = std::function<void(const ResourceAccessState &)>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600425
John Zulauf16adfc92020-04-08 10:28:33 -0600426using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
John Zulauf5c5e88d2019-12-26 11:22:02 -0700427using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
John Zulauf22aefed2021-03-11 18:14:35 -0700428using ResourceAccessRangeIndex = typename ResourceAccessRange::index_type;
John Zulauf355e49b2020-04-24 15:11:15 -0600429using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
John Zulauf9cb530d2019-09-30 14:14:10 -0600430
John Zulaufd0ec59f2021-03-13 14:25:08 -0700431class AttachmentViewGen {
432 public:
433 enum Gen { kViewSubresource = 0, kRenderArea = 1, kDepthOnlyRenderArea = 2, kStencilOnlyRenderArea = 3, kGenSize = 4 };
434 AttachmentViewGen(const IMAGE_VIEW_STATE *view_, const VkOffset3D &offset, const VkExtent3D &extent);
435 AttachmentViewGen(const AttachmentViewGen &other) = default;
436 AttachmentViewGen(AttachmentViewGen &&other) = default;
437 AccessAddressType GetAddressType() const;
438 const IMAGE_VIEW_STATE *GetViewState() const { return view_; }
439 const ImageRangeGen *GetRangeGen(Gen type) const;
440 bool IsValid() const { return gen_store_[Gen::kViewSubresource]; }
441 Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
442
443 private:
444 using RangeGenStore = layer_data::optional<ImageRangeGen>;
445 const IMAGE_VIEW_STATE *view_ = nullptr;
446 VkImageAspectFlags view_mask_ = 0U;
447 std::array<RangeGenStore, Gen::kGenSize> gen_store_;
448};
449
450using AttachmentViewGenVector = std::vector<AttachmentViewGen>;
451
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700452using SyncMemoryBarrier = SyncBarrier;
453struct SyncBufferMemoryBarrier {
454 using Buffer = std::shared_ptr<const BUFFER_STATE>;
455 Buffer buffer;
456 SyncBarrier barrier;
457 ResourceAccessRange range;
John Zulaufd5115702021-01-18 12:34:33 -0700458 bool IsLayoutTransition() const { return false; }
459 const ResourceAccessRange &Range() const { return range; };
460 const BUFFER_STATE *GetState() const { return buffer.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700461 SyncBufferMemoryBarrier(const Buffer &buffer_, const SyncBarrier &barrier_, const ResourceAccessRange &range_)
462 : buffer(buffer_), barrier(barrier_), range(range_) {}
463 SyncBufferMemoryBarrier() = default;
464};
465
466struct SyncImageMemoryBarrier {
467 using Image = std::shared_ptr<const IMAGE_STATE>;
John Zulaufd5115702021-01-18 12:34:33 -0700468 struct SubImageRange {
469 VkImageSubresourceRange subresource_range;
470 VkOffset3D offset;
471 VkExtent3D extent;
472 };
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700473 Image image;
474 uint32_t index;
475 SyncBarrier barrier;
476 VkImageLayout old_layout;
477 VkImageLayout new_layout;
John Zulaufd5115702021-01-18 12:34:33 -0700478 SubImageRange range;
479
480 bool IsLayoutTransition() const { return old_layout != new_layout; }
481 const SubImageRange &Range() const { return range; };
482 const IMAGE_STATE *GetState() const { return image.get(); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700483 SyncImageMemoryBarrier(const Image &image_, uint32_t index_, const SyncBarrier &barrier_, VkImageLayout old_layout_,
484 VkImageLayout new_layout_, const VkImageSubresourceRange &subresource_range_)
485 : image(image_),
486 index(index_),
487 barrier(barrier_),
488 old_layout(old_layout_),
489 new_layout(new_layout_),
John Zulaufd5115702021-01-18 12:34:33 -0700490 range({subresource_range_, VkOffset3D{0, 0, 0}, image->createInfo.extent}) {}
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700491 SyncImageMemoryBarrier() = default;
492};
493
494class SyncOpBase {
495 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700496 SyncOpBase() : cmd_(CMD_NONE), name_override_(nullptr) {}
497 SyncOpBase(CMD_TYPE cmd, const char *name_override = nullptr) : cmd_(cmd), name_override_(name_override) {}
498 const char *CmdName() const { return name_override_ ? name_override_ : CommandTypeString(cmd_); }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700499 virtual bool Validate(const CommandBufferAccessContext &cb_context) const = 0;
John Zulauf36ef9282021-02-02 11:47:24 -0700500 virtual void Record(CommandBufferAccessContext *cb_context) const = 0;
501
502 protected:
503 CMD_TYPE cmd_;
John Zulauf64ffe552021-02-06 10:25:07 -0700504 // Some promoted commands alias CMD_TYPE for KHR and non-KHR versions, also callers to preserve the cmd name as needed
505 const char *name_override_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700506};
507
John Zulaufd5115702021-01-18 12:34:33 -0700508class SyncOpBarriers : public SyncOpBase {
509 protected:
510 template <typename Barriers, typename FunctorFactory>
511 static void ApplyBarriers(const Barriers &barriers, const FunctorFactory &factory, const ResourceUsageTag &tag,
512 AccessContext *context);
513 template <typename Barriers, typename FunctorFactory>
514 static void ApplyGlobalBarriers(const Barriers &barriers, const FunctorFactory &factory, const ResourceUsageTag &tag,
515 AccessContext *access_context);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700516
John Zulauf36ef9282021-02-02 11:47:24 -0700517 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
John Zulaufd5115702021-01-18 12:34:33 -0700518 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
519 const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
520 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
521 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700522 SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t event_count,
523 const VkDependencyInfoKHR *pDependencyInfo);
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700524
525 protected:
John Zulauf4edde622021-02-15 08:54:50 -0700526 struct BarrierSet {
527 VkDependencyFlags dependency_flags;
528 SyncExecScope src_exec_scope;
529 SyncExecScope dst_exec_scope;
530 std::vector<SyncMemoryBarrier> memory_barriers;
531 std::vector<SyncBufferMemoryBarrier> buffer_memory_barriers;
532 std::vector<SyncImageMemoryBarrier> image_memory_barriers;
533 bool single_exec_scope;
534 void MakeMemoryBarriers(const SyncExecScope &src, const SyncExecScope &dst, VkDependencyFlags dependencyFlags,
535 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
536 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
537 VkDependencyFlags dependencyFlags, uint32_t bufferMemoryBarrierCount,
538 const VkBufferMemoryBarrier *pBufferMemoryBarriers);
539 void MakeImageMemoryBarriers(const SyncValidator &sync_state, const SyncExecScope &src, const SyncExecScope &dst,
540 VkDependencyFlags dependencyFlags, uint32_t imageMemoryBarrierCount,
541 const VkImageMemoryBarrier *pImageMemoryBarriers);
542 void MakeMemoryBarriers(VkQueueFlags queue_flags, VkDependencyFlags dependency_flags, uint32_t barrier_count,
543 const VkMemoryBarrier2KHR *barriers);
544 void MakeBufferMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
545 uint32_t barrier_count, const VkBufferMemoryBarrier2KHR *barriers);
546 void MakeImageMemoryBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkDependencyFlags dependency_flags,
547 uint32_t barrier_count, const VkImageMemoryBarrier2KHR *barriers);
548 };
549 std::vector<BarrierSet> barriers_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700550};
551
John Zulaufd5115702021-01-18 12:34:33 -0700552class SyncOpPipelineBarrier : public SyncOpBarriers {
553 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700554 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
555 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
556 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700557 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
558 const VkImageMemoryBarrier *pImageMemoryBarriers);
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -0700559 SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
560 const VkDependencyInfoKHR &pDependencyInfo);
John Zulaufd5115702021-01-18 12:34:33 -0700561 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700562 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700563};
564
565class SyncOpWaitEvents : public SyncOpBarriers {
566 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700567 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
568 const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
569 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
John Zulaufd5115702021-01-18 12:34:33 -0700570 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
571 const VkImageMemoryBarrier *pImageMemoryBarriers);
John Zulauf4edde622021-02-15 08:54:50 -0700572
573 SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
574 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfo);
575
John Zulaufd5115702021-01-18 12:34:33 -0700576 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700577 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulaufd5115702021-01-18 12:34:33 -0700578
579 protected:
580 // TODO PHASE2 This is the wrong thing to use for "replay".. as the event state will have moved on since the record
581 // 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 -0700582 std::vector<std::shared_ptr<const EVENT_STATE>> events_;
583 void MakeEventsList(const SyncValidator &sync_state, uint32_t event_count, const VkEvent *events);
John Zulaufd5115702021-01-18 12:34:33 -0700584};
585
John Zulauf6ce24372021-01-30 05:56:25 -0700586class SyncOpResetEvent : public SyncOpBase {
587 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700588 SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700589 VkPipelineStageFlags2KHR stageMask);
John Zulauf6ce24372021-01-30 05:56:25 -0700590 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700591 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700592
593 private:
594 std::shared_ptr<const EVENT_STATE> event_;
595 SyncExecScope exec_scope_;
596};
597
598class SyncOpSetEvent : public SyncOpBase {
599 public:
John Zulauf36ef9282021-02-02 11:47:24 -0700600 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
John Zulauf4edde622021-02-15 08:54:50 -0700601 VkPipelineStageFlags2KHR stageMask);
602 SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
603 const VkDependencyInfoKHR &dep_info);
John Zulauf6ce24372021-01-30 05:56:25 -0700604 bool Validate(const CommandBufferAccessContext &cb_context) const override;
John Zulauf36ef9282021-02-02 11:47:24 -0700605 void Record(CommandBufferAccessContext *cb_context) const override;
John Zulauf6ce24372021-01-30 05:56:25 -0700606
607 private:
608 std::shared_ptr<const EVENT_STATE> event_;
609 SyncExecScope src_exec_scope_;
John Zulauf4edde622021-02-15 08:54:50 -0700610 // Note that the dep info is *not* dehandled, but retained for comparison with a future WaitEvents2
611 std::shared_ptr<safe_VkDependencyInfoKHR> dep_info_;
John Zulauf6ce24372021-01-30 05:56:25 -0700612};
John Zulauf64ffe552021-02-06 10:25:07 -0700613
614class SyncOpBeginRenderPass : public SyncOpBase {
615 public:
616 SyncOpBeginRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkRenderPassBeginInfo *pRenderPassBegin,
617 const VkSubpassBeginInfo *pSubpassBeginInfo, const char *command_name = nullptr);
618 bool Validate(const CommandBufferAccessContext &cb_context) const override;
619 void Record(CommandBufferAccessContext *cb_context) const override;
620
621 protected:
622 safe_VkRenderPassBeginInfo renderpass_begin_info_;
623 safe_VkSubpassBeginInfo subpass_begin_info_;
624 std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> shared_attachments_;
625 std::vector<const IMAGE_VIEW_STATE *> attachments_;
626 std::shared_ptr<const RENDER_PASS_STATE> rp_state_;
627};
628
629class SyncOpNextSubpass : public SyncOpBase {
630 public:
631 SyncOpNextSubpass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassBeginInfo *pSubpassBeginInfo,
632 const VkSubpassEndInfo *pSubpassEndInfo, const char *name_override = nullptr);
633 bool Validate(const CommandBufferAccessContext &cb_context) const override;
634 void Record(CommandBufferAccessContext *cb_context) const override;
635
636 protected:
637 safe_VkSubpassBeginInfo subpass_begin_info_;
638 safe_VkSubpassEndInfo subpass_end_info_;
639};
640
641class SyncOpEndRenderPass : public SyncOpBase {
642 public:
643 SyncOpEndRenderPass(CMD_TYPE cmd, const SyncValidator &sync_state, const VkSubpassEndInfo *pSubpassEndInfo,
644 const char *name_override = nullptr);
645 bool Validate(const CommandBufferAccessContext &cb_context) const override;
646 void Record(CommandBufferAccessContext *cb_context) const override;
647
648 protected:
649 safe_VkSubpassEndInfo subpass_end_info_;
650};
651
John Zulauf540266b2020-04-06 18:54:53 -0600652class AccessContext {
John Zulauf5c5e88d2019-12-26 11:22:02 -0700653 public:
John Zulauf69133422020-05-20 14:55:53 -0600654 enum DetectOptions : uint32_t {
John Zulauf355e49b2020-04-24 15:11:15 -0600655 kDetectPrevious = 1U << 0,
656 kDetectAsync = 1U << 1,
657 kDetectAll = (kDetectPrevious | kDetectAsync)
John Zulauf16adfc92020-04-08 10:28:33 -0600658 };
John Zulauf43cc7462020-12-03 12:33:12 -0700659 using MapArray = std::array<ResourceAccessRangeMap, static_cast<size_t>(AccessAddressType::kTypeCount)>;
John Zulauf16adfc92020-04-08 10:28:33 -0600660
John Zulaufbaea94f2020-09-15 17:55:16 -0600661 // WIP TODO WIP Multi-dep -- change track back to support barrier vector, not just last.
John Zulauf3d84f1b2020-03-09 13:33:25 -0600662 struct TrackBack {
John Zulaufa0a98292020-09-18 09:30:10 -0600663 std::vector<SyncBarrier> barriers;
John Zulauf1a224292020-06-30 14:52:13 -0600664 const AccessContext *context;
John Zulaufbaea94f2020-09-15 17:55:16 -0600665 TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_,
John Zulaufa0a98292020-09-18 09:30:10 -0600666 const std::vector<const VkSubpassDependency2 *> &subpass_dependencies_)
667 : barriers(), context(context_) {
668 barriers.reserve(subpass_dependencies_.size());
669 for (const VkSubpassDependency2 *dependency : subpass_dependencies_) {
670 assert(dependency);
671 barriers.emplace_back(queue_flags_, *dependency);
672 }
673 }
674
John Zulauf3d84f1b2020-03-09 13:33:25 -0600675 TrackBack &operator=(const TrackBack &) = default;
676 TrackBack() = default;
677 };
John Zulauf5c5e88d2019-12-26 11:22:02 -0700678
John Zulauf355e49b2020-04-24 15:11:15 -0600679 HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
John Zulauf540266b2020-04-06 18:54:53 -0600680 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600681 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
682 const VkExtent3D &extent) const;
John Zulauf69133422020-05-20 14:55:53 -0600683 template <typename Detector>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700684 HazardResult DetectHazard(Detector &detector, const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
685 DetectOptions options) const;
686 template <typename Detector>
John Zulauf69133422020-05-20 14:55:53 -0600687 HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
688 const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600689 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
690 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset,
691 const VkExtent3D &extent) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700692 HazardResult DetectHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
693 SyncStageAccessIndex current_usage, SyncOrdering ordering_rule) const;
694
John Zulauf69133422020-05-20 14:55:53 -0600695 HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
John Zulauf8e3c3e92021-01-06 11:19:36 -0700696 const VkImageSubresourceRange &subresource_range, SyncOrdering ordering_rule,
John Zulauf69133422020-05-20 14:55:53 -0600697 const VkOffset3D &offset, const VkExtent3D &extent) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700698 HazardResult DetectHazard(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulaufb027cdb2020-05-21 14:25:22 -0600699 const VkOffset3D &offset, const VkExtent3D &extent, VkImageAspectFlags aspect_mask = 0U) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700700 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700701 const SyncStageAccessFlags &src_access_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700702 const VkImageSubresourceRange &subresource_range, const SyncEventState &sync_event,
703 DetectOptions options) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700704 HazardResult DetectImageBarrierHazard(const AttachmentViewGen &attachment_view, const SyncBarrier &barrier,
705 DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700706 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
John Zulauf4a6105a2020-11-17 15:11:05 -0700707 const SyncStageAccessFlags &src_access_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700708 const VkImageSubresourceRange &subresource_range, DetectOptions options) const;
Jeremy Gebben40a22942020-12-22 14:22:06 -0700709 HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags2KHR src_exec_scope,
Jeremy Gebbend0de1f82020-11-09 08:21:07 -0700710 const SyncStageAccessFlags &src_stage_accesses,
711 const VkImageMemoryBarrier &barrier) const;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700712 HazardResult DetectImageBarrierHazard(const SyncImageMemoryBarrier &image_barrier) const;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700713 HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const AttachmentViewGen &attach_view) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600714
John Zulaufb02c1eb2020-10-06 16:33:36 -0600715 void RecordLayoutTransitions(const RENDER_PASS_STATE &rp_state, uint32_t subpass,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700716 const AttachmentViewGenVector &attachment_views, const ResourceUsageTag &tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600717
John Zulaufe5da6e52020-03-18 15:32:18 -0600718 const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600719 void Reset() {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600720 prev_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600721 prev_by_subpass_.clear();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600722 async_.clear();
John Zulauf22aefed2021-03-11 18:14:35 -0700723 src_external_ = nullptr;
John Zulaufa0a98292020-09-18 09:30:10 -0600724 dst_external_ = TrackBack();
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700725 start_tag_ = ResourceUsageTag();
John Zulauf16adfc92020-04-08 10:28:33 -0600726 for (auto &map : access_state_maps_) {
727 map.clear();
728 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600729 }
John Zulaufb02c1eb2020-10-06 16:33:36 -0600730
731 // Follow the context previous to access the access state, supporting "lazy" import into the context. Not intended for
732 // subpass layout transition, as the pending state handling is more complex
John Zulauf5f13a792020-03-10 07:31:21 -0600733 // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
734 // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
John Zulauf22aefed2021-03-11 18:14:35 -0700735 template <typename BarrierAction>
736 void ResolvePreviousAccessStack(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
737 const ResourceAccessState *infill_state, const BarrierAction &previous_barrie) const;
John Zulauf43cc7462020-12-03 12:33:12 -0700738 void ResolvePreviousAccess(AccessAddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
John Zulauf22aefed2021-03-11 18:14:35 -0700739 const ResourceAccessState *infill_state,
740 const ResourceAccessStateFunction *previous_barrier = nullptr) const;
John Zulauf4a6105a2020-11-17 15:11:05 -0700741 void ResolvePreviousAccesses();
John Zulaufb02c1eb2020-10-06 16:33:36 -0600742 template <typename BarrierAction>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700743 void ResolveAccessRange(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, BarrierAction &barrier_action,
744 ResourceAccessRangeMap *descent_map, const ResourceAccessState *infill_state) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600745 template <typename BarrierAction>
John Zulauf43cc7462020-12-03 12:33:12 -0700746 void ResolveAccessRange(AccessAddressType type, const ResourceAccessRange &range, BarrierAction &barrier_action,
John Zulauf355e49b2020-04-24 15:11:15 -0600747 ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
748 bool recur_to_infill = true) const;
John Zulaufb02c1eb2020-10-06 16:33:36 -0600749
John Zulauf8e3c3e92021-01-06 11:19:36 -0700750 void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
751 const ResourceAccessRange &range, const ResourceUsageTag &tag);
752 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf355e49b2020-04-24 15:11:15 -0600753 const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
754 const ResourceUsageTag &tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700755 void UpdateAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, SyncStageAccessIndex current_usage,
756 SyncOrdering ordering_rule, const ResourceUsageTag &tag);
John Zulauf8e3c3e92021-01-06 11:19:36 -0700757 void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
John Zulauf3d84f1b2020-03-09 13:33:25 -0600758 const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
759 const ResourceUsageTag &tag);
John Zulaufd0ec59f2021-03-13 14:25:08 -0700760 void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
761 uint32_t subpass, const ResourceUsageTag &tag);
762 void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const AttachmentViewGenVector &attachment_views,
763 uint32_t subpass, const ResourceUsageTag &tag);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600764
John Zulauf540266b2020-04-06 18:54:53 -0600765 void ResolveChildContexts(const std::vector<AccessContext> &contexts);
John Zulauf3d84f1b2020-03-09 13:33:25 -0600766
John Zulaufd0ec59f2021-03-13 14:25:08 -0700767 template <typename Action, typename RangeGen>
768 void ApplyUpdateAction(AccessAddressType address_type, const Action &action, RangeGen *range_gen_arg);
John Zulauf540266b2020-04-06 18:54:53 -0600769 template <typename Action>
John Zulaufd0ec59f2021-03-13 14:25:08 -0700770 void ApplyUpdateAction(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type, const Action &action);
John Zulauf540266b2020-04-06 18:54:53 -0600771 template <typename Action>
John Zulaufd5115702021-01-18 12:34:33 -0700772 void ApplyToContext(const Action &barrier_action);
John Zulauf43cc7462020-12-03 12:33:12 -0700773 static AccessAddressType ImageAddressType(const IMAGE_STATE &image);
John Zulauf16adfc92020-04-08 10:28:33 -0600774
John Zulauf540266b2020-04-06 18:54:53 -0600775 AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
John Zulauf1a224292020-06-30 14:52:13 -0600776 const std::vector<AccessContext> &contexts, const AccessContext *external_context);
John Zulauf540266b2020-04-06 18:54:53 -0600777
778 AccessContext() { Reset(); }
John Zulauf7635de32020-05-29 17:14:15 -0600779 AccessContext(const AccessContext &copy_from) = default;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600780
John Zulauf43cc7462020-12-03 12:33:12 -0700781 ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) { return access_state_maps_[static_cast<size_t>(type)]; }
782 const ResourceAccessRangeMap &GetAccessStateMap(AccessAddressType type) const {
783 return access_state_maps_[static_cast<size_t>(type)];
784 }
785 ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AccessAddressType::kLinear); }
786 const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AccessAddressType::kLinear); }
787 ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AccessAddressType::kIdealized); }
788 const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AccessAddressType::kIdealized); }
John Zulauf355e49b2020-04-24 15:11:15 -0600789 const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
790 if (subpass == VK_SUBPASS_EXTERNAL) {
John Zulauf22aefed2021-03-11 18:14:35 -0700791 return src_external_;
John Zulauf355e49b2020-04-24 15:11:15 -0600792 } else {
793 assert(subpass < prev_by_subpass_.size());
794 return prev_by_subpass_[subpass];
795 }
796 }
John Zulauf16adfc92020-04-08 10:28:33 -0600797
John Zulauf64ffe552021-02-06 10:25:07 -0700798 bool ValidateLayoutTransitions(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700799 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
800 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700801 bool ValidateLoadOperation(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700802 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
803 const char *func_name) const;
804 bool ValidateStoreOperation(const CommandExecutionContext &ex_context,
805
806 const RENDER_PASS_STATE &rp_state,
807
808 const VkRect2D &render_area, uint32_t subpass, const AttachmentViewGenVector &attachment_views,
809 const char *func_name) const;
John Zulauf64ffe552021-02-06 10:25:07 -0700810 bool ValidateResolveOperations(const CommandExecutionContext &ex_context, const RENDER_PASS_STATE &rp_state,
John Zulaufd0ec59f2021-03-13 14:25:08 -0700811 const VkRect2D &render_area, const AttachmentViewGenVector &attachment_views,
John Zulauffaea0ee2021-01-14 14:01:32 -0700812 const char *func_name, uint32_t subpass) const;
John Zulauf1507ee42020-05-18 11:33:09 -0600813
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700814 void SetStartTag(const ResourceUsageTag &tag) { start_tag_ = tag; }
John Zulauf4a6105a2020-11-17 15:11:05 -0700815 template <typename Action>
816 void ForAll(Action &&action);
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700817
John Zulauf3d84f1b2020-03-09 13:33:25 -0600818 private:
819 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700820 HazardResult DetectHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range,
John Zulauf355e49b2020-04-24 15:11:15 -0600821 DetectOptions options) const;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600822 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700823 HazardResult DetectAsyncHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf5f13a792020-03-10 07:31:21 -0600824 template <typename Detector>
John Zulauf43cc7462020-12-03 12:33:12 -0700825 HazardResult DetectPreviousHazard(AccessAddressType type, const Detector &detector, const ResourceAccessRange &range) const;
John Zulauf8e3c3e92021-01-06 11:19:36 -0700826 void UpdateAccessState(AccessAddressType type, SyncStageAccessIndex current_usage, SyncOrdering ordering_rule,
827 const ResourceAccessRange &range, const ResourceUsageTag &tag);
John Zulaufb02c1eb2020-10-06 16:33:36 -0600828
829 MapArray access_state_maps_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600830 std::vector<TrackBack> prev_;
John Zulauf355e49b2020-04-24 15:11:15 -0600831 std::vector<TrackBack *> prev_by_subpass_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700832 std::vector<const AccessContext *> async_;
John Zulauf22aefed2021-03-11 18:14:35 -0700833 TrackBack *src_external_;
John Zulaufe5da6e52020-03-18 15:32:18 -0600834 TrackBack dst_external_;
Jeremy Gebbenc4b78c52020-12-11 09:39:47 -0700835 ResourceUsageTag start_tag_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600836};
837
John Zulauf355e49b2020-04-24 15:11:15 -0600838class RenderPassAccessContext {
839 public:
John Zulaufd0ec59f2021-03-13 14:25:08 -0700840 static AttachmentViewGenVector CreateAttachmentViewGen(const VkRect2D &render_area,
841 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views);
John Zulauf64ffe552021-02-06 10:25:07 -0700842 RenderPassAccessContext() : rp_state_(nullptr), render_area_(VkRect2D()), current_subpass_(0) {}
843 RenderPassAccessContext(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area, VkQueueFlags queue_flags,
844 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const AccessContext *external_context);
John Zulauf355e49b2020-04-24 15:11:15 -0600845
John Zulauf64ffe552021-02-06 10:25:07 -0700846 bool ValidateDrawSubpassAttachment(const CommandExecutionContext &ex_context, const CMD_BUFFER_STATE &cmd,
847 const char *func_name) const;
848 void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, const ResourceUsageTag &tag);
849 bool ValidateNextSubpass(const CommandExecutionContext &ex_context, const char *command_name) const;
850 bool ValidateEndRenderPass(const CommandExecutionContext &ex_context, const char *func_name) const;
851 bool ValidateFinalSubpassLayoutTransitions(const CommandExecutionContext &ex_context, const char *func_name) const;
John Zulauf355e49b2020-04-24 15:11:15 -0600852
853 void RecordLayoutTransitions(const ResourceUsageTag &tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700854 void RecordLoadOperations(const ResourceUsageTag &tag);
855 void RecordBeginRenderPass(const ResourceUsageTag &tag);
856 void RecordNextSubpass(const ResourceUsageTag &prev_subpass_tag, const ResourceUsageTag &next_subpass_tag);
857 void RecordEndRenderPass(AccessContext *external_context, const ResourceUsageTag &tag);
John Zulauf355e49b2020-04-24 15:11:15 -0600858
John Zulauf540266b2020-04-06 18:54:53 -0600859 AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
860 const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
John Zulauf355e49b2020-04-24 15:11:15 -0600861 const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
862 uint32_t GetCurrentSubpass() const { return current_subpass_; }
863 const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700864 AccessContext *CreateStoreResolveProxy() const;
John Zulauf355e49b2020-04-24 15:11:15 -0600865
866 private:
John Zulauf355e49b2020-04-24 15:11:15 -0600867 const RENDER_PASS_STATE *rp_state_;
John Zulauf64ffe552021-02-06 10:25:07 -0700868 const VkRect2D render_area_;
John Zulauf355e49b2020-04-24 15:11:15 -0600869 uint32_t current_subpass_;
870 std::vector<AccessContext> subpass_contexts_;
John Zulaufd0ec59f2021-03-13 14:25:08 -0700871 AttachmentViewGenVector attachment_views_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600872};
873
John Zulauf64ffe552021-02-06 10:25:07 -0700874// Command execution context is the base class for command buffer and queue contexts
875// Preventing unintented leakage of subclass specific state, storing enough information
876// for message logging.
877// TODO: determine where to draw the design split for tag tracking (is there anything command to Queues and CB's)
878class CommandExecutionContext {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600879 public:
John Zulauf64ffe552021-02-06 10:25:07 -0700880 CommandExecutionContext() : sync_state_(nullptr) {}
881 CommandExecutionContext(SyncValidator *sync_validator) : sync_state_(sync_validator) {}
882 virtual ~CommandExecutionContext() = default;
883 const SyncValidator &GetSyncState() const {
884 assert(sync_state_);
885 return *sync_state_;
886 }
887 SyncValidator &GetSyncState() {
888 assert(sync_state_);
889 return *sync_state_;
890 }
891 virtual std::string FormatUsage(const HazardResult &hazard) const = 0;
892
893 protected:
894 SyncValidator *sync_state_;
895};
896
897class CommandBufferAccessContext : public CommandExecutionContext {
898 public:
899 CommandBufferAccessContext(SyncValidator *sync_validator = nullptr)
900 : CommandExecutionContext(sync_validator),
901 access_index_(0),
John Zulauffaea0ee2021-01-14 14:01:32 -0700902 command_number_(0),
903 subcommand_number_(0),
John Zulauf355e49b2020-04-24 15:11:15 -0600904 reset_count_(0),
905 render_pass_contexts_(),
906 cb_access_context_(),
907 current_context_(&cb_access_context_),
John Zulauf3d84f1b2020-03-09 13:33:25 -0600908 current_renderpass_context_(),
909 cb_state_(),
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700910 queue_flags_(),
John Zulauf669dfd52021-01-27 17:15:28 -0700911 events_context_(),
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700912 destroyed_(false) {}
John Zulauf355e49b2020-04-24 15:11:15 -0600913 CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
John Zulauf64ffe552021-02-06 10:25:07 -0700914 : CommandBufferAccessContext(&sync_validator) {
John Zulauf3d84f1b2020-03-09 13:33:25 -0600915 cb_state_ = cb_state;
916 queue_flags_ = queue_flags;
917 }
John Zulauf64ffe552021-02-06 10:25:07 -0700918 ~CommandBufferAccessContext() override = default;
919 CommandExecutionContext &GetExecutionContext() { return *this; }
920 const CommandExecutionContext &GetExecutionContext() const { return *this; }
John Zulauf5c5e88d2019-12-26 11:22:02 -0700921
922 void Reset() {
John Zulauffaea0ee2021-01-14 14:01:32 -0700923 access_index_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -0600924 command_number_ = 0;
John Zulauffaea0ee2021-01-14 14:01:32 -0700925 subcommand_number_ = 0;
John Zulauf355e49b2020-04-24 15:11:15 -0600926 reset_count_++;
927 cb_access_context_.Reset();
John Zulauf3d84f1b2020-03-09 13:33:25 -0600928 render_pass_contexts_.clear();
John Zulauf355e49b2020-04-24 15:11:15 -0600929 current_context_ = &cb_access_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600930 current_renderpass_context_ = nullptr;
John Zulauf669dfd52021-01-27 17:15:28 -0700931 events_context_.Clear();
John Zulauf5c5e88d2019-12-26 11:22:02 -0700932 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700933 void MarkDestroyed() { destroyed_ = true; }
934 bool IsDestroyed() const { return destroyed_; }
John Zulauf5c5e88d2019-12-26 11:22:02 -0700935
John Zulauf64ffe552021-02-06 10:25:07 -0700936 std::string FormatUsage(const HazardResult &hazard) const override;
John Zulauf540266b2020-04-06 18:54:53 -0600937 AccessContext *GetCurrentAccessContext() { return current_context_; }
John Zulauf669dfd52021-01-27 17:15:28 -0700938 SyncEventsContext *GetCurrentEventsContext() { return &events_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700939 RenderPassAccessContext *GetCurrentRenderPassContext() { return current_renderpass_context_; }
John Zulauf540266b2020-04-06 18:54:53 -0600940 const AccessContext *GetCurrentAccessContext() const { return current_context_; }
John Zulauf64ffe552021-02-06 10:25:07 -0700941 const SyncEventsContext *GetCurrentEventsContext() const { return &events_context_; }
942 const RenderPassAccessContext *GetCurrentRenderPassContext() const { return current_renderpass_context_; }
943 void RecordBeginRenderPass(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
944 const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const ResourceUsageTag &tag);
Jeremy Gebben9893daf2021-01-04 10:40:50 -0700945 void ApplyGlobalBarriersToEvents(const SyncExecScope &src, const SyncExecScope &dst);
John Zulaufd5115702021-01-18 12:34:33 -0700946
locke-lunarg61870c22020-06-09 14:51:50 -0600947 bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
948 void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const ResourceUsageTag &tag);
949 bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
950 void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const ResourceUsageTag &tag);
951 bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
952 void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const ResourceUsageTag &tag);
953 bool ValidateDrawSubpassAttachment(const char *func_name) const;
954 void RecordDrawSubpassAttachment(const ResourceUsageTag &tag);
John Zulauf64ffe552021-02-06 10:25:07 -0700955 void RecordNextSubpass(CMD_TYPE command);
956 void RecordEndRenderPass(CMD_TYPE command);
John Zulauf4a6105a2020-11-17 15:11:05 -0700957 void RecordDestroyEvent(VkEvent event);
John Zulauf49beb112020-11-04 16:06:31 -0700958
John Zulauf3d84f1b2020-03-09 13:33:25 -0600959 const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
960 VkQueueFlags GetQueueFlags() const { return queue_flags_; }
John Zulauffaea0ee2021-01-14 14:01:32 -0700961 inline ResourceUsageTag::TagIndex NextAccessIndex() { return access_index_++; }
962
963 inline ResourceUsageTag NextSubcommandTag(CMD_TYPE command) {
964 ResourceUsageTag next(NextAccessIndex(), command_number_, subcommand_number_++, command);
965 return next;
966 }
967
John Zulauf355e49b2020-04-24 15:11:15 -0600968 inline ResourceUsageTag NextCommandTag(CMD_TYPE command) {
John Zulauf355e49b2020-04-24 15:11:15 -0600969 command_number_++;
John Zulauffaea0ee2021-01-14 14:01:32 -0700970 subcommand_number_ = 0;
Jeremy Gebben6ea9d9e2020-12-11 09:41:01 -0700971 // The lowest bit is a sub-command number used to separate operations at the end of the previous renderpass
972 // from the start of the new one in VkCmdNextRenderpass().
John Zulauffaea0ee2021-01-14 14:01:32 -0700973 ResourceUsageTag next(NextAccessIndex(), command_number_, subcommand_number_, command);
John Zulauf355e49b2020-04-24 15:11:15 -0600974 return next;
975 }
John Zulauf3d84f1b2020-03-09 13:33:25 -0600976
John Zulauffaea0ee2021-01-14 14:01:32 -0700977 const CMD_BUFFER_STATE &GetCBState() const {
978 assert(cb_state_);
979 return *(cb_state_.get());
980 }
981 CMD_BUFFER_STATE &GetCBState() {
982 assert(cb_state_);
983 return *(cb_state_.get());
984 }
John Zulauffaea0ee2021-01-14 14:01:32 -0700985
John Zulauf3d84f1b2020-03-09 13:33:25 -0600986 private:
John Zulauffaea0ee2021-01-14 14:01:32 -0700987 ResourceUsageTag::TagIndex access_index_;
John Zulauf355e49b2020-04-24 15:11:15 -0600988 uint32_t command_number_;
John Zulauffaea0ee2021-01-14 14:01:32 -0700989 uint32_t subcommand_number_;
John Zulauf355e49b2020-04-24 15:11:15 -0600990 uint32_t reset_count_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600991 std::vector<RenderPassAccessContext> render_pass_contexts_;
John Zulauf355e49b2020-04-24 15:11:15 -0600992 AccessContext cb_access_context_;
John Zulauf540266b2020-04-06 18:54:53 -0600993 AccessContext *current_context_;
John Zulauf3d84f1b2020-03-09 13:33:25 -0600994 RenderPassAccessContext *current_renderpass_context_;
995 std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
John Zulauf355e49b2020-04-24 15:11:15 -0600996
John Zulauf3d84f1b2020-03-09 13:33:25 -0600997 VkQueueFlags queue_flags_;
John Zulauf669dfd52021-01-27 17:15:28 -0700998 SyncEventsContext events_context_;
John Zulaufe7f6a5e2021-01-16 14:31:18 -0700999 bool destroyed_;
John Zulauf9cb530d2019-09-30 14:14:10 -06001000};
1001
1002class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
1003 public:
1004 SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
1005 using StateTracker = ValidationStateTracker;
1006
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001007 layer_data::unordered_map<VkCommandBuffer, CommandBufferAccessContextShared> cb_access_state;
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001008
1009 CommandBufferAccessContextShared GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
John Zulauf9cb530d2019-09-30 14:14:10 -06001010 auto found_it = cb_access_state.find(command_buffer);
1011 if (found_it == cb_access_state.end()) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001012 if (!do_insert) return CommandBufferAccessContextShared();
John Zulauf9cb530d2019-09-30 14:14:10 -06001013 // If we don't have one, make it.
John Zulauf3d84f1b2020-03-09 13:33:25 -06001014 auto cb_state = GetShared<CMD_BUFFER_STATE>(command_buffer);
1015 assert(cb_state.get());
1016 auto queue_flags = GetQueueFlags(*cb_state);
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001017 std::shared_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001018 auto insert_pair = cb_access_state.emplace(command_buffer, std::move(context));
John Zulauf9cb530d2019-09-30 14:14:10 -06001019 found_it = insert_pair.first;
1020 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001021 return found_it->second;
John Zulauf9cb530d2019-09-30 14:14:10 -06001022 }
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001023
John Zulauf3d84f1b2020-03-09 13:33:25 -06001024 CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001025 return GetAccessContextImpl(command_buffer, true).get(); // true -> do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001026 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001027 CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
John Zulaufe7f6a5e2021-01-16 14:31:18 -07001028 return GetAccessContextImpl(command_buffer, false).get(); // false -> don't do_insert on not found
1029 }
1030
1031 CommandBufferAccessContextShared GetAccessContextShared(VkCommandBuffer command_buffer) {
1032 return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
1033 }
1034 CommandBufferAccessContextShared GetAccessContextSharedNoInsert(VkCommandBuffer command_buffer) {
John Zulauf3d84f1b2020-03-09 13:33:25 -06001035 return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
John Zulauf9cb530d2019-09-30 14:14:10 -06001036 }
John Zulauf3d84f1b2020-03-09 13:33:25 -06001037
1038 const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
John Zulauf9cb530d2019-09-30 14:14:10 -06001039 const auto found_it = cb_access_state.find(command_buffer);
1040 if (found_it == cb_access_state.end()) {
1041 return nullptr;
1042 }
1043 return found_it->second.get();
1044 }
1045
John Zulaufd1f85d42020-04-15 12:23:15 -06001046 void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
1047 void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
John Zulauf3d84f1b2020-03-09 13:33:25 -06001048 void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
John Zulauf64ffe552021-02-06 10:25:07 -07001049 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd, const char *cmd_name = nullptr);
1050 void RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1051 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command, const char *command_name = nullptr);
1052 void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd,
1053 const char *cmd_name = nullptr);
John Zulauf33fc1d52020-07-17 11:01:10 -06001054 bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
John Zulauf9cb530d2019-09-30 14:14:10 -06001055
1056 void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001057 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001058
John Zulauf355e49b2020-04-24 15:11:15 -06001059 bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
John Zulauf64ffe552021-02-06 10:25:07 -07001060 const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE cmd, const char *cmd_name = nullptr) const;
John Zulauf355e49b2020-04-24 15:11:15 -06001061
1062 bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001063 VkSubpassContents contents) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001064
1065 bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001066 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001067
1068 bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001069 const VkSubpassBeginInfo *pSubpassBeginInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001070
John Zulauf9cb530d2019-09-30 14:14:10 -06001071 bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001072 const VkBufferCopy *pRegions) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001073
1074 void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001075 const VkBufferCopy *pRegions) override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001076
John Zulauf4a6105a2020-11-17 15:11:05 -07001077 void PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) override;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001078 bool PreCallValidateCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001079
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001080 void PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR *pCopyBufferInfos) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001081
John Zulauf5c5e88d2019-12-26 11:22:02 -07001082 bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1083 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001084 const VkImageCopy *pRegions) const override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001085
1086 void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001087 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) override;
John Zulauf5c5e88d2019-12-26 11:22:02 -07001088
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001089 bool PreCallValidateCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001090
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001091 void PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR *pCopyImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001092
John Zulauf9cb530d2019-09-30 14:14:10 -06001093 bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1094 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1095 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1096 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1097 uint32_t imageMemoryBarrierCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001098 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
John Zulauf9cb530d2019-09-30 14:14:10 -06001099
1100 void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
1101 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
1102 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1103 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001104 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001105
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001106 bool PreCallValidateCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
1107 const VkDependencyInfoKHR *pDependencyInfo) const override;
1108 void PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer, const VkDependencyInfoKHR *pDependencyInfo) override;
1109
John Zulauf3d84f1b2020-03-09 13:33:25 -06001110 void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001111 VkResult result) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001112
1113 void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001114 VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001115 void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001116 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001117 void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001118 const VkSubpassBeginInfo *pSubpassBeginInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001119
Mike Schuchardt2df08912020-12-15 16:28:09 -08001120 bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
John Zulauf64ffe552021-02-06 10:25:07 -07001121 const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd, const char *cmd_name = nullptr) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001122 bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001123 bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1124 const VkSubpassEndInfo *pSubpassEndInfo) const override;
1125 bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
1126 const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001127
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001128 void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001129 void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001130 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001131 void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001132 const VkSubpassEndInfo *pSubpassEndInfo) override;
John Zulauf3d84f1b2020-03-09 13:33:25 -06001133
John Zulauf64ffe552021-02-06 10:25:07 -07001134 bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE cmd,
1135 const char *cmd_name = nullptr) const;
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001136 bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const override;
Mike Schuchardt2df08912020-12-15 16:28:09 -08001137 bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
1138 bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) const override;
John Zulauf355e49b2020-04-24 15:11:15 -06001139
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001140 void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) override;
1141 void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
1142 void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001143
1144 template <typename BufferImageCopyRegionType>
1145 bool ValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1146 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1147 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001148 bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1149 VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001150 const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001151 bool PreCallValidateCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001152 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001153
Jeff Leger178b1e52020-10-05 12:22:23 -04001154 template <typename BufferImageCopyRegionType>
1155 void RecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
1156 VkImageLayout dstImageLayout, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1157 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001158 void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001159 VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001160 void PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001161 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001162
Jeff Leger178b1e52020-10-05 12:22:23 -04001163 template <typename BufferImageCopyRegionType>
1164 bool ValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1165 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1166 CopyCommandVersion version) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001167 bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001168 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001169 bool PreCallValidateCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001170 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001171
Jeff Leger178b1e52020-10-05 12:22:23 -04001172 template <typename BufferImageCopyRegionType>
1173 void RecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1174 VkBuffer dstBuffer, uint32_t regionCount, const BufferImageCopyRegionType *pRegions,
1175 CopyCommandVersion version);
locke-lunarga19c71d2020-03-02 18:17:04 -07001176 void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001177 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001178 void PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001179 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001180
1181 template <typename RegionType>
1182 bool ValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1183 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1184 const char *apiName) const;
locke-lunarga19c71d2020-03-02 18:17:04 -07001185
1186 bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1187 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001188 const VkImageBlit *pRegions, VkFilter filter) const override;
1189 bool PreCallValidateCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) const override;
locke-lunarga19c71d2020-03-02 18:17:04 -07001190
Jeff Leger178b1e52020-10-05 12:22:23 -04001191 template <typename RegionType>
1192 void RecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1193 VkImageLayout dstImageLayout, uint32_t regionCount, const RegionType *pRegions, VkFilter filter,
1194 ResourceUsageTag tag);
locke-lunarga19c71d2020-03-02 18:17:04 -07001195 void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
1196 VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001197 VkFilter filter) override;
1198 void PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo) override;
locke-lunarg36ba2592020-04-03 09:42:04 -06001199
John Zulauffaea0ee2021-01-14 14:01:32 -07001200 bool ValidateIndirectBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1201 VkCommandBuffer commandBuffer, const VkDeviceSize struct_size, const VkBuffer buffer,
1202 const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
locke-lunarg61870c22020-06-09 14:51:50 -06001203 const char *function) const;
1204 void RecordIndirectBuffer(AccessContext &context, const ResourceUsageTag &tag, const VkDeviceSize struct_size,
1205 const VkBuffer buffer, const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
locke-lunarg36ba2592020-04-03 09:42:04 -06001206
John Zulauffaea0ee2021-01-14 14:01:32 -07001207 bool ValidateCountBuffer(const CommandBufferAccessContext &cb_context, const AccessContext &context,
1208 VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, const char *function) const;
locke-lunarg61870c22020-06-09 14:51:50 -06001209 void RecordCountBuffer(AccessContext &context, const ResourceUsageTag &tag, VkBuffer buffer, VkDeviceSize offset);
locke-lunarg93d68af2020-05-12 17:18:03 -06001210
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001211 bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const override;
1212 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001213
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001214 bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const override;
1215 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001216
1217 bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001218 uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001219 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001220 uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001221
1222 bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001223 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001224 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001225 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001226
1227 bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001228 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001229 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001230 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001231
1232 bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001233 uint32_t drawCount, uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001234 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001235 uint32_t drawCount, uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001236
locke-lunargff255f92020-05-13 18:53:52 -06001237 bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
1238 VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
1239 const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001240 bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1241 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001242 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001243 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1244 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001245 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001246 bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1247 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001248 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001249 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1250 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001251 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001252 bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1253 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001254 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001255 void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1256 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001257 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001258
locke-lunargff255f92020-05-13 18:53:52 -06001259 bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1260 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
1261 uint32_t stride, const char *function) const;
locke-lunarge1a67022020-04-29 00:15:36 -06001262 bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1263 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001264 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001265 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1266 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001267 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001268 bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1269 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001270 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001271 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1272 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001273 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001274 bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1275 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001276 uint32_t stride) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001277 void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1278 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001279 uint32_t stride) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001280
1281 bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1282 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001283 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001284 void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1285 const VkClearColorValue *pColor, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001286 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001287
1288 bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1289 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001290 const VkImageSubresourceRange *pRanges) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001291 void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
1292 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001293 const VkImageSubresourceRange *pRanges) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001294
1295 bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1296 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001297 VkDeviceSize stride, VkQueryResultFlags flags) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001298 void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
1299 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001300 VkQueryResultFlags flags) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001301
1302 bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001303 uint32_t data) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001304 void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001305 uint32_t data) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001306
1307 bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1308 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001309 const VkImageResolve *pRegions) const override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001310
locke-lunarge1a67022020-04-29 00:15:36 -06001311 void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
1312 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001313 const VkImageResolve *pRegions) override;
locke-lunarge1a67022020-04-29 00:15:36 -06001314
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001315 bool PreCallValidateCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) const override;
1316 void PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR *pResolveImageInfo) override;
Jeff Leger178b1e52020-10-05 12:22:23 -04001317
locke-lunarge1a67022020-04-29 00:15:36 -06001318 bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001319 VkDeviceSize dataSize, const void *pData) const override;
locke-lunarge1a67022020-04-29 00:15:36 -06001320 void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001321 VkDeviceSize dataSize, const void *pData) override;
locke-lunargff255f92020-05-13 18:53:52 -06001322
1323 bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001324 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const override;
locke-lunargff255f92020-05-13 18:53:52 -06001325 void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
Jeremy Gebbenf8924692020-10-28 16:27:14 -06001326 VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) override;
John Zulauf49beb112020-11-04 16:06:31 -07001327
1328 bool PreCallValidateCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1329 void PostCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1330
John Zulauf4edde622021-02-15 08:54:50 -07001331 bool PreCallValidateCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1332 const VkDependencyInfoKHR *pDependencyInfo) const override;
1333 void PostCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1334 const VkDependencyInfoKHR *pDependencyInfo) override;
1335
John Zulauf49beb112020-11-04 16:06:31 -07001336 bool PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const override;
1337 void PostCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) override;
1338
John Zulauf4edde622021-02-15 08:54:50 -07001339 bool PreCallValidateCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
1340 VkPipelineStageFlags2KHR stageMask) const override;
1341 void PostCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2KHR stageMask) override;
1342
John Zulauf49beb112020-11-04 16:06:31 -07001343 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1344 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1345 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1346 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1347 uint32_t imageMemoryBarrierCount,
1348 const VkImageMemoryBarrier *pImageMemoryBarriers) const override;
1349 void PostCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1350 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
1351 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
1352 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1353 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) override;
John Zulauf4edde622021-02-15 08:54:50 -07001354 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1355 const VkDependencyInfoKHR *pDependencyInfos) const override;
1356 void PostCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
1357 const VkDependencyInfoKHR *pDependencyInfos) override;
Jeremy Gebbendf3fcc32021-02-15 08:53:17 -07001358 bool PreCallValidateCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1359 VkDeviceSize dstOffset, uint32_t marker) const override;
1360 void PreCallRecordCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
1361 VkDeviceSize dstOffset, uint32_t marker) override;
John Zulaufd05c5842021-03-26 11:32:16 -06001362#ifdef SYNCVAL_DIAGNOSTICS
1363 bool PreCallValidateDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) const override;
1364#endif
John Zulauf9cb530d2019-09-30 14:14:10 -06001365};