Blender V5.0
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
37
38#pragma once
39
40#include <mutex>
41#include <optional>
42#include <pthread.h>
43
44#include "BKE_global.hh"
45
46#include "BLI_color_types.hh"
47#include "BLI_map.hh"
48#include "BLI_utility_mixins.hh"
49#include "BLI_vector.hh"
50#include "BLI_vector_set.hh"
51
52#include "BKE_global.hh"
53
54#include "vk_common.hh"
55
57#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 VKRenderGraphStorage storage_;
76
85 VKResourceStateTracker &resources_;
86
87 struct DebugGroup {
88 std::string name;
90
92 uint64_t hash() const
93 {
95 }
96 };
97
98 struct {
100
103
108 bool group_used = false;
109
112
122 } debug_;
123
124 public:
132
133 private:
137 template<typename NodeInfo> NodeHandle 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>(storage_, 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 return node_handle;
173 }
174
175 public:
176#define ADD_NODE(NODE_CLASS) \
177 NodeHandle add_node(const NODE_CLASS::CreateInfo &create_info) \
178 { \
179 return add_node<NODE_CLASS>(create_info); \
180 }
181 ADD_NODE(VKBeginQueryNode)
182 ADD_NODE(VKBeginRenderingNode)
183 ADD_NODE(VKEndQueryNode)
184 ADD_NODE(VKEndRenderingNode)
185 ADD_NODE(VKClearAttachmentsNode)
186 ADD_NODE(VKClearColorImageNode)
187 ADD_NODE(VKClearDepthStencilImageNode)
188 ADD_NODE(VKFillBufferNode)
189 ADD_NODE(VKCopyBufferNode)
190 ADD_NODE(VKCopyBufferToImageNode)
191 ADD_NODE(VKCopyImageNode)
192 ADD_NODE(VKCopyImageToBufferNode)
193 ADD_NODE(VKBlitImageNode)
194 ADD_NODE(VKDispatchNode)
195 ADD_NODE(VKDispatchIndirectNode)
196 ADD_NODE(VKDrawNode)
197 ADD_NODE(VKDrawIndexedNode)
198 ADD_NODE(VKDrawIndexedIndirectNode)
199 ADD_NODE(VKDrawIndirectNode)
200 ADD_NODE(VKResetQueryPoolNode)
201 ADD_NODE(VKUpdateBufferNode)
202 ADD_NODE(VKUpdateMipmapsNode)
203 ADD_NODE(VKSynchronizationNode)
204#undef ADD_NODE
205
213 {
214 VKRenderGraphNode &node = nodes_[node_handle];
216 return node.copy_buffer;
217 }
218
224 void debug_group_begin(const char *name, const ColorTheme4f &color);
225
232 void debug_group_end();
233
238 std::string full_debug_group(NodeHandle node_handle) const;
239
248 {
249 return nodes_.size();
250 }
251
252 bool is_empty()
253 {
254 return nodes_.is_empty();
255 }
256
257 void debug_print(NodeHandle node_handle) const;
258
262 void reset();
263
264 void memstats() const;
265
266 private:
267};
268
269} // namespace blender::gpu::render_graph
@ G_DEBUG_GPU
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_STRUCT_EQUALITY_OPERATORS_2(Type, m1, m2)
volatile int lock
long long int int64_t
unsigned long long int uint64_t
NonCopyable(const NonCopyable &other)=delete
int64_t size() const
int64_t append_and_get_index(const T &value)
void resize(const int64_t new_size)
VKRenderGraph(VKResourceStateTracker &resources)
void debug_group_begin(const char *name, const ColorTheme4f &color)
Vector< Vector< DebugGroupNameID > > used_groups
VKCopyBufferNode::Data & get_node_data(NodeHandle node_handle)
void debug_print(NodeHandle node_handle) const
std::string full_debug_group(NodeHandle node_handle) const
#define G(x, y, z)
uint64_t get_default_hash(const T &v, const Args &...args)
Definition BLI_hash.hh:233
ColorTheme4< float > ColorTheme4f
#define hash
Definition noise_c.cc:154
const char * name
static bNode * add_node(bNodeTree *ntree, const int type, const blender::float2 loc)
#define ADD_NODE(NODE_CLASS)