Blender V4.3
vk_render_graph.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
38#pragma once
39
40#include <mutex>
41#include <optional>
42#include <pthread.h>
43
44#include "BKE_global.hh"
45
46#include "BLI_map.hh"
47#include "BLI_utility_mixins.hh"
48#include "BLI_vector.hh"
49#include "BLI_vector_set.hh"
50
51#include "BKE_global.hh"
52
53#include "vk_common.hh"
54
56#include "vk_command_builder.hh"
60
62class VKScheduler;
63
64class VKRenderGraph : public NonCopyable {
65 friend class VKCommandBuilder;
66 friend class VKScheduler;
67 using DebugGroupNameID = int64_t;
68 using DebugGroupID = int64_t;
69
75 VKScheduler scheduler_;
79 VKCommandBuilder command_builder_;
80
88 std::unique_ptr<VKCommandBufferInterface> command_buffer_;
89
98 VKResourceStateTracker &resources_;
99
100 struct {
102
107 bool group_used = false;
119 } debug_;
120
121 public:
123
130 VKRenderGraph(std::unique_ptr<VKCommandBufferInterface> command_buffer,
131 VKResourceStateTracker &resources);
132
133 private:
137 template<typename NodeInfo> void add_node(const typename NodeInfo::CreateInfo &create_info)
138 {
139 std::scoped_lock lock(resources_.mutex);
140 static VKRenderGraphNode node_template = {};
141 NodeHandle node_handle = nodes_.append_and_get_index(node_template);
142#if 0
143 /* Useful during debugging. When a validation error occurs during submission we know the node
144 * type and node handle, but we don't know when and by who that specific node was added to the
145 * render graph. By enabling this part of the code and set the correct node_handle and node
146 * type a debugger can break at the moment the node has been added to the render graph. */
147 if (node_handle == 267 && NodeInfo::node_type == VKNodeType::DRAW) {
148 std::cout << "break\n";
149 }
150#endif
151 if (nodes_.size() > links_.size()) {
152 links_.resize(nodes_.size());
153 }
154 VKRenderGraphNode &node = nodes_[node_handle];
155 node.set_node_data<NodeInfo>(create_info);
156
157 VKRenderGraphNodeLinks &node_links = links_[node_handle];
158 BLI_assert(node_links.inputs.is_empty());
159 BLI_assert(node_links.outputs.is_empty());
160 node.build_links<NodeInfo>(resources_, node_links, create_info);
161
162 if (G.debug & G_DEBUG_GPU) {
163 if (!debug_.group_used) {
164 debug_.group_used = true;
165 debug_.used_groups.append(debug_.group_stack);
166 }
167 if (nodes_.size() > debug_.node_group_map.size()) {
168 debug_.node_group_map.resize(nodes_.size());
169 }
170 debug_.node_group_map[node_handle] = debug_.used_groups.size() - 1;
171 }
172 }
173
174 public:
175#define ADD_NODE(NODE_CLASS) \
176 void add_node(const NODE_CLASS::CreateInfo &create_info) \
177 { \
178 add_node<NODE_CLASS>(create_info); \
179 }
180 ADD_NODE(VKBeginQueryNode)
181 ADD_NODE(VKBeginRenderingNode)
182 ADD_NODE(VKEndQueryNode)
183 ADD_NODE(VKEndRenderingNode)
184 ADD_NODE(VKClearAttachmentsNode)
185 ADD_NODE(VKClearColorImageNode)
186 ADD_NODE(VKClearDepthStencilImageNode)
187 ADD_NODE(VKFillBufferNode)
188 ADD_NODE(VKCopyBufferNode)
189 ADD_NODE(VKCopyBufferToImageNode)
190 ADD_NODE(VKCopyImageNode)
191 ADD_NODE(VKCopyImageToBufferNode)
192 ADD_NODE(VKBlitImageNode)
193 ADD_NODE(VKDispatchNode)
194 ADD_NODE(VKDispatchIndirectNode)
195 ADD_NODE(VKDrawNode)
196 ADD_NODE(VKDrawIndexedNode)
197 ADD_NODE(VKDrawIndexedIndirectNode)
198 ADD_NODE(VKDrawIndirectNode)
199 ADD_NODE(VKResetQueryPoolNode)
200 ADD_NODE(VKUpdateBufferNode)
201 ADD_NODE(VKUpdateMipmapsNode)
202#undef ADD_NODE
203
213 void submit_buffer_for_read(VkBuffer vk_buffer);
214
226 void submit_for_present(VkImage vk_swapchain_image);
227
231 void submit();
232
234 void submit_synchronization_event(VkFence vk_fence);
236 void wait_synchronization_event(VkFence vk_fence);
242 void debug_group_begin(const char *name);
243
250 void debug_group_end();
251
260 {
261 return nodes_.size();
262 }
263
264 void debug_print(NodeHandle node_handle) const;
265
266 private:
267 void remove_nodes(Span<NodeHandle> node_handles);
268};
269
270} // namespace blender::gpu::render_graph
@ G_DEBUG_GPU
#define BLI_assert(a)
Definition BLI_assert.h:50
volatile int lock
int64_t size() const
int64_t append_and_get_index(const T &value)
void resize(const int64_t new_size)
Vector< Vector< DebugGroupNameID > > used_groups
void submit_buffer_for_read(VkBuffer vk_buffer)
VKRenderGraph(std::unique_ptr< VKCommandBufferInterface > command_buffer, VKResourceStateTracker &resources)
void wait_synchronization_event(VkFence vk_fence)
void submit_for_present(VkImage vk_swapchain_image)
void debug_print(NodeHandle node_handle) const
void submit_synchronization_event(VkFence vk_fence)
#define G(x, y, z)
__int64 int64_t
Definition stdint.h:89
#define ADD_NODE(NODE_CLASS)