Blender V4.5
vk_command_builder.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_set.hh"
12
13#include "vk_common.hh"
15#include "vk_scheduler.hh"
16
18class VKRenderGraph;
19
21 VkImage vk_image;
22 VkImageLayout vk_image_layout;
23 uint32_t layer;
24 uint32_t layer_count;
25};
26
34 private:
39 Vector<VkBufferMemoryBarrier> vk_buffer_memory_barriers_;
44 Vector<VkImageMemoryBarrier> vk_image_memory_barriers_;
45
46 struct Barrier {
48 IndexRange buffer_memory_barriers;
50 IndexRange image_memory_barriers;
51
52 VkPipelineStageFlags src_stage_mask = VK_PIPELINE_STAGE_NONE;
53 VkPipelineStageFlags dst_stage_mask = VK_PIPELINE_STAGE_NONE;
54
55 bool is_empty() const
56 {
57 return buffer_memory_barriers.is_empty() && image_memory_barriers.is_empty();
58 }
59 };
60
66 struct LayeredImageTracker {
72 VKCommandBuilder &command_builder;
73 LayeredImageTracker(VKCommandBuilder &command_builder) : command_builder(command_builder) {}
74
82 Set<VkImage> layered_attachments;
83
84 struct TrackedImage {
85 VkImage vk_image;
86 VkImageLayout vk_image_layout;
87 uint32_t layer;
88 uint32_t layer_count;
89 };
90 Vector<TrackedImage> layered_bindings;
91
98 void begin(const VKRenderGraph &render_graph, NodeHandle node_handle);
99
103 inline bool contains(VkImage vk_image) const
104 {
105 return layered_attachments.contains(vk_image);
106 }
107
113 void update(VkImage vk_image,
114 uint32_t layer,
115 uint32_t layer_count,
116 VkImageLayout old_layout,
117 VkImageLayout new_layout,
118 Barrier &r_barrier);
119
128 void end(Barrier &r_barrier, bool use_local_read);
129
138 void suspend(Barrier &r_barrier, bool use_local_read);
139
146 void resume(Barrier &r_barrier, bool use_local_read);
147 };
148
155 using GroupNodes = IndexRange;
156
160 using Barriers = IndexRange;
161 using BarrierIndex = int64_t;
162
164 Vector<GroupNodes> group_nodes_;
166 Vector<Barriers> group_pre_barriers_;
168 Vector<Barriers> group_post_barriers_;
173 Vector<Barriers> node_pre_barriers_;
174
176 Vector<Barrier> barrier_list_;
177
178 public:
184 VKCommandBufferInterface &command_buffer,
185 Span<NodeHandle> node_handles);
186
194 VKCommandBufferInterface &command_buffer,
195 Span<NodeHandle> node_handles);
196
197 private:
204 void groups_init(const VKRenderGraph &render_graph, Span<NodeHandle> node_handles);
205
213 void groups_extract_barriers(VKRenderGraph &render_graph,
214 Span<NodeHandle> node_handles,
215 bool supports_local_read);
216
220 void groups_build_commands(VKRenderGraph &render_graph,
221 VKCommandBufferInterface &command_buffer,
222 Span<NodeHandle> node_handles);
223
228 void build_pipeline_barriers(VKRenderGraph &render_graph,
229 NodeHandle node_handle,
230 VkPipelineStageFlags pipeline_stage,
231 LayeredImageTracker &layered_tracker,
232 Barrier &r_barrier,
233 bool within_rendering = false);
234 void reset_barriers(Barrier &r_barrier);
235 void send_pipeline_barriers(VKCommandBufferInterface &command_buffer,
236 const Barrier &barrier,
237 bool within_rendering);
238
239 void add_buffer_barriers(VKRenderGraph &render_graph,
240 NodeHandle node_handle,
241 VkPipelineStageFlags node_stages,
242 Barrier &r_barrier);
243 void add_buffer_barrier(VkBuffer vk_buffer,
244 Barrier &r_barrier,
245 VkAccessFlags src_access_mask,
246 VkAccessFlags dst_access_mask);
247 void add_buffer_read_barriers(VKRenderGraph &render_graph,
248 NodeHandle node_handle,
249 VkPipelineStageFlags node_stages,
250 Barrier &r_barrier);
251 void add_buffer_write_barriers(VKRenderGraph &render_graph,
252 NodeHandle node_handle,
253 VkPipelineStageFlags node_stages,
254 Barrier &r_barrier);
255
256 void add_image_barriers(VKRenderGraph &render_graph,
257 NodeHandle node_handle,
258 VkPipelineStageFlags node_stages,
259 LayeredImageTracker &layered_tracker,
260 Barrier &r_barrier,
261 bool within_rendering);
262 void add_image_barrier(VkImage vk_image,
263 Barrier &r_barrier,
264 VkAccessFlags src_access_mask,
265 VkAccessFlags dst_access_mask,
266 VkImageLayout old_image_layout,
267 VkImageLayout new_image_layout,
268 VkImageAspectFlags aspect_mask,
269 uint32_t layer_base = 0,
270 uint32_t layer_count = VK_REMAINING_ARRAY_LAYERS);
271 void add_image_read_barriers(VKRenderGraph &render_graph,
272 NodeHandle node_handle,
273 VkPipelineStageFlags node_stages,
274 LayeredImageTracker &layered_tracker,
275 Barrier &r_barrier,
276 bool within_rendering);
277 void add_image_write_barriers(VKRenderGraph &render_graph,
278 NodeHandle node_handle,
279 VkPipelineStageFlags node_stages,
280 LayeredImageTracker &layered_tracker,
281 Barrier &r_barrier,
282 bool within_rendering);
283
284 struct DebugGroups {
289 int64_t active_debug_group_id = -1;
291 int debug_level = 0;
292 };
293
302 void activate_debug_group(VKRenderGraph &render_graph,
303 VKCommandBufferInterface &command_buffer,
304 DebugGroups &debug_groups,
305 NodeHandle node_handle);
306
310 void finish_debug_groups(VKCommandBufferInterface &command_buffer, DebugGroups &debug_groups);
311
312 private:
316 void layer_tracking_begin(const VKRenderGraph &render_graph, NodeHandle node_handle);
317
323 void layer_tracking_update(VkImage vk_image,
324 uint32_t layer,
325 uint32_t layer_count,
326 VkImageLayout old_layout,
327 VkImageLayout new_layout);
328
337 void layer_tracking_end(VKCommandBufferInterface &command_buffer);
338
347 void layer_tracking_suspend(VKCommandBufferInterface &command_buffer);
348
355 void layer_tracking_resume(VKCommandBufferInterface &command_buffer);
356
357 bool node_has_input_attachments(const VKRenderGraph &render_graph, NodeHandle node);
358
359 std::string to_string_barrier(const Barrier &barrier);
360};
361
362} // namespace blender::gpu::render_graph
long long int int64_t
constexpr bool is_empty() const
void record_commands(VKRenderGraph &render_graph, VKCommandBufferInterface &command_buffer, Span< NodeHandle > node_handles)
void build_nodes(VKRenderGraph &render_graph, VKCommandBufferInterface &command_buffer, Span< NodeHandle > node_handles)
static void update(bNodeTree *ntree)