Blender V5.0
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 ImageTracker {
72 VKCommandBuilder &command_builder;
73 ImageTracker(VKCommandBuilder &command_builder) : command_builder(command_builder) {}
74
82 Set<VkImage> tracked_attachments;
83
94
101 void begin(const VKRenderGraph &render_graph, NodeHandle node_handle);
102
106 inline bool contains(VkImage vk_image) const
107 {
108 return tracked_attachments.contains(vk_image);
109 }
110
116 void update(VkImage vk_image,
117 const VKSubImageRange &subimage,
118 VkImageLayout old_layout,
119 VkImageLayout new_layout,
120 Barrier &r_barrier);
126 void update(VkImage vk_image,
127 uint32_t mipmap_level,
128 VkImageLayout old_layout,
129 VkImageLayout new_layout,
130 Barrier &r_barrier);
131
140 void end(Barrier &r_barrier, bool use_local_read);
141
150 void suspend(Barrier &r_barrier, bool use_local_read);
151
158 void resume(Barrier &r_barrier, bool use_local_read);
159 };
160
167 using GroupNodes = IndexRange;
168
172 using Barriers = IndexRange;
173 using BarrierIndex = int64_t;
174
176 Vector<GroupNodes> group_nodes_;
178 Vector<Barriers> group_pre_barriers_;
180 Vector<Barriers> group_post_barriers_;
185 Vector<Barriers> node_pre_barriers_;
186
188 Vector<Barrier> barrier_list_;
189
190 public:
196 VKCommandBufferInterface &command_buffer,
197 Span<NodeHandle> node_handles);
198
206 VKCommandBufferInterface &command_buffer,
207 Span<NodeHandle> node_handles);
208
209 private:
216 void groups_init(const VKRenderGraph &render_graph, Span<NodeHandle> node_handles);
217
225 void groups_extract_barriers(VKRenderGraph &render_graph,
226 Span<NodeHandle> node_handles,
227 bool supports_local_read);
228
232 void groups_build_commands(VKRenderGraph &render_graph,
233 VKCommandBufferInterface &command_buffer,
234 Span<NodeHandle> node_handles);
235
240 void build_pipeline_barriers(VKRenderGraph &render_graph,
241 NodeHandle node_handle,
242 VkPipelineStageFlags pipeline_stage,
243 ImageTracker &image_tracker,
244 Barrier &r_barrier,
245 bool within_rendering = false);
246 void reset_barriers(Barrier &r_barrier);
247 void send_pipeline_barriers(VKCommandBufferInterface &command_buffer,
248 const Barrier &barrier,
249 bool within_rendering);
250
251 void add_buffer_barriers(VKRenderGraph &render_graph,
252 NodeHandle node_handle,
253 VkPipelineStageFlags node_stages,
254 Barrier &r_barrier);
255 void add_buffer_barrier(VkBuffer vk_buffer,
256 Barrier &r_barrier,
257 VkAccessFlags src_access_mask,
258 VkAccessFlags dst_access_mask);
259 void add_buffer_read_barriers(VKRenderGraph &render_graph,
260 NodeHandle node_handle,
261 VkPipelineStageFlags node_stages,
262 Barrier &r_barrier);
263 void add_buffer_write_barriers(VKRenderGraph &render_graph,
264 NodeHandle node_handle,
265 VkPipelineStageFlags node_stages,
266 Barrier &r_barrier);
267
268 void add_image_barriers(VKRenderGraph &render_graph,
269 NodeHandle node_handle,
270 VkPipelineStageFlags node_stages,
271 ImageTracker &image_tracker,
272 Barrier &r_barrier,
273 bool within_rendering);
274 void add_image_barrier(VkImage vk_image,
275 Barrier &r_barrier,
276 VkAccessFlags src_access_mask,
277 VkAccessFlags dst_access_mask,
278 VkImageLayout old_image_layout,
279 VkImageLayout new_image_layout,
280 VkImageAspectFlags aspect_mask,
281 const VKSubImageRange &subimage);
282 void add_image_read_barriers(VKRenderGraph &render_graph,
283 NodeHandle node_handle,
284 VkPipelineStageFlags node_stages,
285 ImageTracker &image_tracker,
286 Barrier &r_barrier,
287 bool within_rendering);
288 void add_image_write_barriers(VKRenderGraph &render_graph,
289 NodeHandle node_handle,
290 VkPipelineStageFlags node_stages,
291 ImageTracker &image_tracker,
292 Barrier &r_barrier,
293 bool within_rendering);
294
295 struct DebugGroups {
300 int64_t active_debug_group_id = -1;
302 int debug_level = 0;
303 };
304
313 void activate_debug_group(VKRenderGraph &render_graph,
314 VKCommandBufferInterface &command_buffer,
315 DebugGroups &debug_groups,
316 NodeHandle node_handle);
317
321 void finish_debug_groups(VKCommandBufferInterface &command_buffer, DebugGroups &debug_groups);
322
323 private:
327 void layer_tracking_begin(const VKRenderGraph &render_graph, NodeHandle node_handle);
328
334 void layer_tracking_update(VkImage vk_image,
335 uint32_t layer,
336 uint32_t layer_count,
337 VkImageLayout old_layout,
338 VkImageLayout new_layout);
339
348 void layer_tracking_end(VKCommandBufferInterface &command_buffer);
349
358 void layer_tracking_suspend(VKCommandBufferInterface &command_buffer);
359
366 void layer_tracking_resume(VKCommandBufferInterface &command_buffer);
367
368 bool node_has_input_attachments(const VKRenderGraph &render_graph, NodeHandle node);
369
370 std::string to_string_barrier(const Barrier &barrier);
371};
372
373} // 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)