blob: 04783ddf46026a50292685259f5e4d9e4dcc9bfe [file] [log] [blame]
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06001/* Copyright (c) 2015-2021 The Khronos Group Inc.
2 * Copyright (c) 2015-2021 Valve Corporation
3 * Copyright (c) 2015-2021 LunarG, Inc.
4 * Copyright (C) 2015-2021 Google Inc.
5 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Chris Forbes <chrisf@ijw.co.nz>
22 * Author: Mark Lobodzinski <mark@lunarg.com>
23 * Author: Dave Houlton <daveh@lunarg.com>
24 * Author: John Zulauf <jzulauf@lunarg.com>
25 * Author: Tobias Hector <tobias.hector@amd.com>
26 */
27#pragma once
28#include "base_node.h"
29#include "query_state.h"
30#include "command_validation.h"
31#include "hash_vk_types.h"
32#include "subresource_adapter.h"
33#include "image_layout_map.h"
34#include "pipeline_state.h"
35#include "device_state.h"
36#include "descriptor_sets.h"
37#include "qfo_transfer.h"
38
Jeremy Gebben1ec89332021-08-05 13:51:49 -060039struct SUBPASS_INFO;
40class FRAMEBUFFER_STATE;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060041class RENDER_PASS_STATE;
42class CoreChecks;
43class ValidationStateTracker;
44
45class EVENT_STATE : public BASE_NODE {
46 public:
47 int write_in_use;
48 VkPipelineStageFlags2KHR stageMask = VkPipelineStageFlags2KHR(0);
49 VkEventCreateFlags flags;
50
51 EVENT_STATE(VkEvent event_, VkEventCreateFlags flags_)
52 : BASE_NODE(event_, kVulkanObjectTypeEvent), write_in_use(0), flags(flags_) {}
53
54 VkEvent event() const { return handle_.Cast<VkEvent>(); }
55};
56
57// Only CoreChecks uses this, but the state tracker stores it.
58constexpr static auto kInvalidLayout = image_layout_map::kInvalidLayout;
59using ImageSubresourceLayoutMap = image_layout_map::ImageSubresourceLayoutMap;
60typedef layer_data::unordered_map<VkEvent, VkPipelineStageFlags2KHR> EventToStageMap;
61
62// Track command pools and their command buffers
63class COMMAND_POOL_STATE : public BASE_NODE {
64 public:
Jeremy Gebben1ec89332021-08-05 13:51:49 -060065 const VkCommandPoolCreateFlags createFlags;
66 const uint32_t queueFamilyIndex;
67 const VkQueueFlags queue_flags;
68 const bool unprotected; // can't be used for protected memory
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060069 // Cmd buffers allocated from this pool
70 layer_data::unordered_set<VkCommandBuffer> commandBuffers;
71
72 COMMAND_POOL_STATE(VkCommandPool cp, const VkCommandPoolCreateInfo *pCreateInfo, VkQueueFlags flags)
73 : BASE_NODE(cp, kVulkanObjectTypeCommandPool),
74 createFlags(pCreateInfo->flags),
75 queueFamilyIndex(pCreateInfo->queueFamilyIndex),
Jeremy Gebben1ec89332021-08-05 13:51:49 -060076 queue_flags(flags),
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060077 unprotected((pCreateInfo->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) == 0) {}
78
79 VkCommandPool commandPool() const { return handle_.Cast<VkCommandPool>(); }
80
81 virtual ~COMMAND_POOL_STATE() { Destroy(); }
82
83 void Destroy() override {
84 commandBuffers.clear();
85 BASE_NODE::Destroy();
86 }
87};
88
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060089// Autogenerated as part of the command_validation.h codegen
90const char *CommandTypeString(CMD_TYPE type);
91
92enum CB_STATE {
93 CB_NEW, // Newly created CB w/o any cmds
94 CB_RECORDING, // BeginCB has been called on this CB
95 CB_RECORDED, // EndCB has been called on this CB
96 CB_INVALID_COMPLETE, // had a complete recording, but was since invalidated
97 CB_INVALID_INCOMPLETE, // fouled before recording was completed
98};
99
100// CB Status -- used to track status of various bindings on cmd buffer objects
101typedef uint64_t CBStatusFlags;
102enum CBStatusFlagBits : uint64_t {
103 // clang-format off
104 CBSTATUS_NONE = 0x00000000, // No status is set
105 CBSTATUS_LINE_WIDTH_SET = 0x00000001, // Line width has been set
106 CBSTATUS_DEPTH_BIAS_SET = 0x00000002, // Depth bias has been set
107 CBSTATUS_BLEND_CONSTANTS_SET = 0x00000004, // Blend constants state has been set
108 CBSTATUS_DEPTH_BOUNDS_SET = 0x00000008, // Depth bounds state object has been set
109 CBSTATUS_STENCIL_READ_MASK_SET = 0x00000010, // Stencil read mask has been set
110 CBSTATUS_STENCIL_WRITE_MASK_SET = 0x00000020, // Stencil write mask has been set
111 CBSTATUS_STENCIL_REFERENCE_SET = 0x00000040, // Stencil reference has been set
112 CBSTATUS_VIEWPORT_SET = 0x00000080,
113 CBSTATUS_SCISSOR_SET = 0x00000100,
114 CBSTATUS_INDEX_BUFFER_BOUND = 0x00000200, // Index buffer has been set
115 CBSTATUS_EXCLUSIVE_SCISSOR_SET = 0x00000400,
116 CBSTATUS_SHADING_RATE_PALETTE_SET = 0x00000800,
117 CBSTATUS_LINE_STIPPLE_SET = 0x00001000,
118 CBSTATUS_VIEWPORT_W_SCALING_SET = 0x00002000,
119 CBSTATUS_CULL_MODE_SET = 0x00004000,
120 CBSTATUS_FRONT_FACE_SET = 0x00008000,
121 CBSTATUS_PRIMITIVE_TOPOLOGY_SET = 0x00010000,
122 CBSTATUS_VIEWPORT_WITH_COUNT_SET = 0x00020000,
123 CBSTATUS_SCISSOR_WITH_COUNT_SET = 0x00040000,
124 CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET = 0x00080000,
125 CBSTATUS_DEPTH_TEST_ENABLE_SET = 0x00100000,
126 CBSTATUS_DEPTH_WRITE_ENABLE_SET = 0x00200000,
127 CBSTATUS_DEPTH_COMPARE_OP_SET = 0x00400000,
128 CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET = 0x00800000,
129 CBSTATUS_STENCIL_TEST_ENABLE_SET = 0x01000000,
130 CBSTATUS_STENCIL_OP_SET = 0x02000000,
131 CBSTATUS_DISCARD_RECTANGLE_SET = 0x04000000,
132 CBSTATUS_SAMPLE_LOCATIONS_SET = 0x08000000,
133 CBSTATUS_COARSE_SAMPLE_ORDER_SET = 0x10000000,
134 CBSTATUS_PATCH_CONTROL_POINTS_SET = 0x20000000,
135 CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET = 0x40000000,
136 CBSTATUS_DEPTH_BIAS_ENABLE_SET = 0x80000000,
137 CBSTATUS_LOGIC_OP_SET = 0x100000000,
138 CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET = 0x200000000,
139 CBSTATUS_VERTEX_INPUT_SET = 0x400000000,
140 CBSTATUS_ALL_STATE_SET = 0x7FFFFFDFF, // All state set (intentionally exclude index buffer)
141 // clang-format on
142};
143
144VkDynamicState ConvertToDynamicState(CBStatusFlagBits flag);
145CBStatusFlagBits ConvertToCBStatusFlagBits(VkDynamicState state);
146std::string DynamicStateString(CBStatusFlags input_value);
147
148struct BufferBinding {
149 std::shared_ptr<BUFFER_STATE> buffer_state;
150 VkDeviceSize size;
151 VkDeviceSize offset;
152 VkDeviceSize stride;
153
154 BufferBinding() : buffer_state(), size(0), offset(0), stride(0) {}
155 virtual ~BufferBinding() {}
156
157 virtual void reset() { *this = BufferBinding(); }
158};
159
160struct IndexBufferBinding : BufferBinding {
161 VkIndexType index_type;
162
163 IndexBufferBinding() : BufferBinding(), index_type(static_cast<VkIndexType>(0)) {}
164 virtual ~IndexBufferBinding() {}
165
166 virtual void reset() override { *this = IndexBufferBinding(); }
167};
168
169struct CBVertexBufferBindingInfo {
170 std::vector<BufferBinding> vertex_buffer_bindings;
171};
172
173typedef subresource_adapter::BothRangeMap<VkImageLayout, 16> GlobalImageLayoutRangeMap;
174typedef layer_data::unordered_map<VkImage, layer_data::optional<GlobalImageLayoutRangeMap>> GlobalImageLayoutMap;
175
176typedef layer_data::unordered_map<VkImage, layer_data::optional<ImageSubresourceLayoutMap>> CommandBufferImageLayoutMap;
177
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600178
179class CMD_BUFFER_STATE : public REFCOUNTED_NODE {
180 public:
181 VkCommandBufferAllocateInfo createInfo = {};
182 VkCommandBufferBeginInfo beginInfo;
183 VkCommandBufferInheritanceInfo inheritanceInfo;
184 std::shared_ptr<const COMMAND_POOL_STATE> command_pool;
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600185 ValidationStateTracker *dev_data;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600186 bool hasDrawCmd;
187 bool hasTraceRaysCmd;
188 bool hasBuildAccelerationStructureCmd;
189 bool hasDispatchCmd;
190 bool unprotected; // can't be used for protected memory
191
192 CB_STATE state; // Track cmd buffer update state
193 uint64_t commandCount; // Number of commands recorded. Currently only used with VK_KHR_performance_query
194 uint64_t submitCount; // Number of times CB has been submitted
195 typedef uint64_t ImageLayoutUpdateCount;
196 ImageLayoutUpdateCount image_layout_change_count; // The sequence number for changes to image layout (for cached validation)
197 CBStatusFlags status; // Track status of various bindings on cmd buffer
198 CBStatusFlags static_status; // All state bits provided by current graphics pipeline
199 // rather than dynamic state
200 CBStatusFlags dynamic_status; // dynamic state set up in pipeline
201 // Currently storing "lastBound" objects on per-CB basis
202 // long-term may want to create caches of "lastBound" states and could have
203 // each individual CMD_NODE referencing its own "lastBound" state
204 // Store last bound state for Gfx & Compute pipeline bind points
205 std::array<LAST_BOUND_STATE, BindPoint_Count> lastBound; // index is LvlBindPoint.
206
207 struct CmdDrawDispatchInfo {
208 CMD_TYPE cmd_type;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600209 std::vector<std::pair<const uint32_t, DescriptorRequirement>> binding_infos;
210 VkFramebuffer framebuffer;
211 std::shared_ptr<std::vector<SUBPASS_INFO>> subpasses;
212 std::shared_ptr<std::vector<IMAGE_VIEW_STATE *>> attachments;
213 };
214 layer_data::unordered_map<VkDescriptorSet, std::vector<CmdDrawDispatchInfo>> validate_descriptorsets_in_queuesubmit;
215
216 // If VK_NV_inherited_viewport_scissor is enabled and VkCommandBufferInheritanceViewportScissorInfoNV::viewportScissor2D is
217 // true, then is the nonempty list of viewports passed in pViewportDepths. Otherwise, this is empty.
218 std::vector<VkViewport> inheritedViewportDepths;
219
220 // For each draw command D recorded to this command buffer, let
221 // * g_D be the graphics pipeline used
222 // * v_G be the viewportCount of g_D (0 if g_D disables rasterization or enables VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT)
223 // * s_G be the scissorCount of g_D (0 if g_D disables rasterization or enables VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT)
224 // Then this value is max(0, max(v_G for all D in cb), max(s_G for all D in cb))
225 uint32_t usedViewportScissorCount;
226 uint32_t pipelineStaticViewportCount; // v_G for currently-bound graphics pipeline.
227 uint32_t pipelineStaticScissorCount; // s_G for currently-bound graphics pipeline.
228
229 uint32_t viewportMask;
230 uint32_t viewportWithCountMask;
231 uint32_t viewportWithCountCount;
232 uint32_t scissorMask;
233 uint32_t scissorWithCountMask;
234 uint32_t scissorWithCountCount;
235
236 // Dynamic viewports set in this command buffer; if bit j of viewportMask is set then dynamicViewports[j] is valid, but the
237 // converse need not be true.
238 std::vector<VkViewport> dynamicViewports;
239
240 // Bits set when binding graphics pipeline defining corresponding static state, or executing any secondary command buffer.
241 // Bits unset by calling a corresponding vkCmdSet[State] cmd.
242 uint32_t trashedViewportMask;
243 uint32_t trashedScissorMask;
244 bool trashedViewportCount;
245 bool trashedScissorCount;
246
247 // True iff any draw command recorded to this command buffer consumes dynamic viewport/scissor with count state.
248 bool usedDynamicViewportCount;
249 bool usedDynamicScissorCount;
250
251 uint32_t initial_device_mask;
252 VkPrimitiveTopology primitiveTopology;
253
254 safe_VkRenderPassBeginInfo activeRenderPassBeginInfo;
255 std::shared_ptr<RENDER_PASS_STATE> activeRenderPass;
256 std::shared_ptr<std::vector<SUBPASS_INFO>> active_subpasses;
257 std::shared_ptr<std::vector<IMAGE_VIEW_STATE *>> active_attachments;
258 std::set<std::shared_ptr<IMAGE_VIEW_STATE>> attachments_view_states;
259
260 VkSubpassContents activeSubpassContents;
261 uint32_t active_render_pass_device_mask;
262 uint32_t activeSubpass;
263 std::shared_ptr<FRAMEBUFFER_STATE> activeFramebuffer;
264 layer_data::unordered_set<std::shared_ptr<FRAMEBUFFER_STATE>> framebuffers;
265 // Unified data structs to track objects bound to this command buffer as well as object
266 // dependencies that have been broken : either destroyed objects, or updated descriptor sets
267 layer_data::unordered_set<VulkanTypedHandle> object_bindings;
268 layer_data::unordered_map<VulkanTypedHandle, LogObjectList> broken_bindings;
269
270 QFOTransferBarrierSets<QFOBufferTransferBarrier> qfo_transfer_buffer_barriers;
271 QFOTransferBarrierSets<QFOImageTransferBarrier> qfo_transfer_image_barriers;
272
273 layer_data::unordered_set<VkEvent> waitedEvents;
274 std::vector<VkEvent> writeEventsBeforeWait;
275 std::vector<VkEvent> events;
276 layer_data::unordered_set<QueryObject> activeQueries;
277 layer_data::unordered_set<QueryObject> startedQueries;
278 layer_data::unordered_set<QueryObject> resetQueries;
279 CommandBufferImageLayoutMap image_layout_map;
280 CBVertexBufferBindingInfo current_vertex_buffer_binding_info;
281 bool vertex_buffer_used; // Track for perf warning to make sure any bound vtx buffer used
282 VkCommandBuffer primaryCommandBuffer;
283 // If primary, the secondary command buffers we will call.
284 // If secondary, the primary command buffers we will be called by.
285 layer_data::unordered_set<CMD_BUFFER_STATE *> linkedCommandBuffers;
286 // Validation functions run at primary CB queue submit time
287 std::vector<std::function<bool(const ValidationStateTracker *device_data, const class QUEUE_STATE *queue_state)>>
288 queue_submit_functions;
Hans-Kristian Arntzen59c2c3f2021-06-14 11:40:12 +0200289 // Used by some layers to defer actions until vkCmdEndRenderPass time.
290 // Layers using this are responsible for inserting the callbacks into queue_submit_functions.
291 std::vector<std::function<bool(const ValidationStateTracker *device_data, const class QUEUE_STATE *queue_state)>>
292 queue_submit_functions_after_render_pass;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600293 // Validation functions run when secondary CB is executed in primary
294 std::vector<std::function<bool(const CMD_BUFFER_STATE *, const FRAMEBUFFER_STATE *)>> cmd_execute_commands_functions;
295 std::vector<
296 std::function<bool(const ValidationStateTracker *device_data, bool do_validate, EventToStageMap *localEventToStageMap)>>
297 eventUpdates;
298 std::vector<std::function<bool(const ValidationStateTracker *device_data, bool do_validate, VkQueryPool &firstPerfQueryPool,
299 uint32_t perfQueryPass, QueryMap *localQueryToStateMap)>>
300 queryUpdates;
Jeremy Gebben87db52f2021-10-14 13:55:09 -0600301 layer_data::unordered_set<const cvdescriptorset::DescriptorSet *> validated_descriptor_sets;
302 layer_data::unordered_map<const cvdescriptorset::DescriptorSet *, cvdescriptorset::DescriptorSet::CachedValidation>
303 descriptorset_cache;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600304 // Contents valid only after an index buffer is bound (CBSTATUS_INDEX_BUFFER_BOUND set)
305 IndexBufferBinding index_buffer_binding;
306 bool performance_lock_acquired = false;
307 bool performance_lock_released = false;
308
309 // Cache of current insert label...
310 LoggingLabel debug_label;
311
312 std::vector<uint8_t> push_constant_data;
313 PushConstantRangesId push_constant_data_ranges;
314
315 std::map<VkShaderStageFlagBits, std::vector<uint8_t>>
316 push_constant_data_update; // vector's value is enum PushConstantByteState.
317 VkPipelineLayout push_constant_pipeline_layout_set;
318
319 // Used for Best Practices tracking
320 uint32_t small_indexed_draw_call_count;
321
322 bool transform_feedback_active{false};
ziga-lunarg40f5fbc2021-08-14 23:06:41 +0200323 bool conditional_rendering_active{false};
ziga-lunarg39eeaf22021-09-03 19:12:44 +0200324 bool conditional_rendering_inside_render_pass{false};
325 uint32_t conditional_rendering_subpass{0};
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600326
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600327 CMD_BUFFER_STATE(ValidationStateTracker *, VkCommandBuffer cb, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600328 std::shared_ptr<COMMAND_POOL_STATE> &cmd_pool);
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600329
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600330 virtual ~CMD_BUFFER_STATE() { Destroy(); }
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600331
332 void Destroy() override;
333
334 VkCommandBuffer commandBuffer() const { return handle_.Cast<VkCommandBuffer>(); }
335
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600336 IMAGE_VIEW_STATE *GetActiveAttachmentImageViewState(uint32_t index);
337 const IMAGE_VIEW_STATE *GetActiveAttachmentImageViewState(uint32_t index) const;
338
339 void AddChild(BASE_NODE *child_node);
340
341 void RemoveChild(BASE_NODE *child_node);
342
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600343 virtual void Reset();
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600344
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600345 void IncrementResources();
346
347 void ResetPushConstantDataIfIncompatible(const PIPELINE_LAYOUT_STATE *pipeline_layout_state);
348
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600349 ImageSubresourceLayoutMap *GetImageSubresourceLayoutMap(const IMAGE_STATE &image_state);
350 const ImageSubresourceLayoutMap *GetImageSubresourceLayoutMap(VkImage image) const;
351
352 const QFOTransferBarrierSets<QFOImageTransferBarrier> &GetQFOBarrierSets(const QFOImageTransferBarrier &type_tag) const {
353 return qfo_transfer_image_barriers;
354 }
355
356 const QFOTransferBarrierSets<QFOBufferTransferBarrier> &GetQFOBarrierSets(const QFOBufferTransferBarrier &type_tag) const {
357 return qfo_transfer_buffer_barriers;
358 }
359
360 QFOTransferBarrierSets<QFOImageTransferBarrier> &GetQFOBarrierSets(const QFOImageTransferBarrier &type_tag) {
361 return qfo_transfer_image_barriers;
362 }
363
364 QFOTransferBarrierSets<QFOBufferTransferBarrier> &GetQFOBarrierSets(const QFOBufferTransferBarrier &type_tag) {
365 return qfo_transfer_buffer_barriers;
366 }
367
368 PIPELINE_STATE *GetCurrentPipeline(VkPipelineBindPoint pipelineBindPoint) const {
369 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
370 return lastBound[lv_bind_point].pipeline_state;
371 }
372
373 void GetCurrentPipelineAndDesriptorSets(VkPipelineBindPoint pipelineBindPoint, const PIPELINE_STATE **rtn_pipe,
374 const std::vector<LAST_BOUND_STATE::PER_SET> **rtn_sets) const {
375 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
376 const auto &last_bound_it = lastBound[lv_bind_point];
377 if (!last_bound_it.IsUsing()) {
378 return;
379 }
380 *rtn_pipe = last_bound_it.pipeline_state;
381 *rtn_sets = &(last_bound_it.per_set);
382 }
383
384 VkQueueFlags GetQueueFlags() const {
385 return command_pool->queue_flags;
386 }
387
Jeremy Gebbenefead332021-06-18 08:22:44 -0600388 template <typename Barrier>
Jeremy Gebben7ba56152021-06-18 10:40:10 -0600389 inline bool IsReleaseOp(const Barrier &barrier) const {
390 return (IsTransferOp(barrier)) && (command_pool->queueFamilyIndex == barrier.srcQueueFamilyIndex);
391 }
392 template <typename Barrier>
393 inline bool IsAcquireOp(const Barrier &barrier) const {
394 return (IsTransferOp(barrier)) && (command_pool->queueFamilyIndex == barrier.dstQueueFamilyIndex);
Jeremy Gebbenefead332021-06-18 08:22:44 -0600395 }
396
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600397 void Begin(const VkCommandBufferBeginInfo *pBeginInfo);
398 void End(VkResult result);
399
400 void BeginQuery(const QueryObject &query_obj);
401 void EndQuery(const QueryObject &query_obj);
402 void EndQueries(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
403 void ResetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
404
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600405 void BeginRenderPass(CMD_TYPE cmd_type, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents);
406 void NextSubpass(CMD_TYPE cmd_type, VkSubpassContents contents);
407 void EndRenderPass(CMD_TYPE cmd_type);
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600408
409 void ExecuteCommands(uint32_t commandBuffersCount, const VkCommandBuffer *pCommandBuffers);
410
411 void UpdateLastBoundDescriptorSets(VkPipelineBindPoint pipeline_bind_point, const PIPELINE_LAYOUT_STATE *pipeline_layout,
412 uint32_t first_set, uint32_t set_count, const VkDescriptorSet *pDescriptorSets,
413 cvdescriptorset::DescriptorSet *push_descriptor_set, uint32_t dynamic_offset_count,
414 const uint32_t *p_dynamic_offsets);
415
416 void PushDescriptorSetState(VkPipelineBindPoint pipelineBindPoint, PIPELINE_LAYOUT_STATE *pipeline_layout, uint32_t set,
417 uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites);
418
sfricke-samsung85584a72021-09-30 21:43:38 -0700419 void UpdateStateCmdDrawDispatchType(CMD_TYPE cmd_type, VkPipelineBindPoint bind_point);
420 void UpdateStateCmdDrawType(CMD_TYPE cmd_type, VkPipelineBindPoint bind_point);
421 void UpdateDrawState(CMD_TYPE cmd_type, const VkPipelineBindPoint bind_point);
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600422
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600423 virtual void RecordCmd(CMD_TYPE cmd_type);
424 void RecordStateCmd(CMD_TYPE cmd_type, CBStatusFlags state_bits);
425 void RecordTransferCmd(CMD_TYPE cmd_type, BINDABLE *buf1, BINDABLE *buf2 = nullptr);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -0600426 void RecordSetEvent(CMD_TYPE cmd_type, VkEvent event, VkPipelineStageFlags2KHR stageMask);
427 void RecordResetEvent(CMD_TYPE cmd_type, VkEvent event, VkPipelineStageFlags2KHR stageMask);
428 void RecordWaitEvents(CMD_TYPE cmd_type, uint32_t eventCount, const VkEvent *pEvents);
429 void RecordWriteTimestamp(CMD_TYPE cmd_type, VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool, uint32_t slot);
430
431 void RecordBarriers(uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
432 const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
433 const VkImageMemoryBarrier *pImageMemoryBarriers);
434 void RecordBarriers(const VkDependencyInfoKHR &dep_info);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600435
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600436 void SetImageViewLayout(const IMAGE_VIEW_STATE &view_state, VkImageLayout layout, VkImageLayout layoutStencil);
437 void SetImageViewInitialLayout(const IMAGE_VIEW_STATE &view_state, VkImageLayout layout);
438
439 void SetImageLayout(const IMAGE_STATE &image_state, const VkImageSubresourceRange &image_subresource_range,
440 VkImageLayout layout, VkImageLayout expected_layout = kInvalidLayout);
441 void SetImageLayout(const IMAGE_STATE &image_state, const VkImageSubresourceLayers &image_subresource_layers,
442 VkImageLayout layout);
443 void SetImageInitialLayout(VkImage image, const VkImageSubresourceRange &range, VkImageLayout layout);
444 void SetImageInitialLayout(const IMAGE_STATE &image_state, const VkImageSubresourceRange &range, VkImageLayout layout);
445 void SetImageInitialLayout(const IMAGE_STATE &image_state, const VkImageSubresourceLayers &layers, VkImageLayout layout);
446
Jeremy Gebben57642982021-09-14 14:14:55 -0600447 void Submit(uint32_t perf_submit_pass);
448 void Retire(uint32_t perf_submit_pass);
449
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600450 protected:
451 void NotifyInvalidate(const LogObjectList &invalid_handles, bool unlink) override;
Jeremy Gebben1ec89332021-08-05 13:51:49 -0600452 void UpdateAttachmentsView(const VkRenderPassBeginInfo *pRenderPassBegin);
Jeremy Gebben159b3cc2021-06-03 09:09:03 -0600453};
Jeremy Gebben7ba56152021-06-18 10:40:10 -0600454
455// specializations for barriers that cannot do queue family ownership transfers
456template <>
457inline bool CMD_BUFFER_STATE::IsReleaseOp(const VkMemoryBarrier &barrier) const {
458 return false;
459}
460template <>
461inline bool CMD_BUFFER_STATE::IsReleaseOp(const VkMemoryBarrier2KHR &barrier) const {
462 return false;
463}
464template <>
465inline bool CMD_BUFFER_STATE::IsReleaseOp(const VkSubpassDependency2 &barrier) const {
466 return false;
467}
468template <>
469inline bool CMD_BUFFER_STATE::IsAcquireOp(const VkMemoryBarrier &barrier) const {
470 return false;
471}
472template <>
473inline bool CMD_BUFFER_STATE::IsAcquireOp(const VkMemoryBarrier2KHR &barrier) const {
474 return false;
475}
476template <>
477inline bool CMD_BUFFER_STATE::IsAcquireOp(const VkSubpassDependency2 &barrier) const {
478 return false;
479}