22 for (
NodeHandle node_handle : render_graph.nodes_.index_range()) {
23 result_.
append(node_handle);
25 reorder_nodes(render_graph);
33void VKScheduler::reorder_nodes(
const VKRenderGraph &render_graph)
35 move_initial_transfer_to_start(render_graph);
36 move_transfer_and_dispatch_outside_rendering_scope(render_graph);
39std::optional<std::pair<int64_t, int64_t>> VKScheduler::find_rendering_scope(
40 const VKRenderGraph &render_graph,
IndexRange search_range)
const
44 for (
int64_t index : search_range) {
46 const VKRenderGraphNode &
node = render_graph.nodes_[node_handle];
48 rendering_start = index;
51 return std::pair(rendering_start, index);
65void VKScheduler::move_initial_transfer_to_start(
const VKRenderGraph &render_graph)
70 data_transfers.reserve(result_.
size());
71 other_nodes.reserve(result_.
size());
73 for (
const int64_t index : result_.index_range()) {
75 const VKRenderGraphNode &
node = render_graph.nodes_[node_handle];
81 const VKRenderGraphNodeLinks &links = render_graph.links_[node_handle];
82 if (links.inputs[0].resource.stamp == 0 && links.outputs[0].resource.stamp == 0) {
83 data_transfers.
append(index);
88 const VKRenderGraphNodeLinks &links = render_graph.links_[node_handle];
89 if (links.outputs[0].resource.stamp == 0) {
90 data_transfers.append(index);
95 other_nodes.append(index);
98 MutableSpan<NodeHandle> store_data_transfers = result_.
as_mutable_span().slice(
99 0, data_transfers.size());
100 MutableSpan<NodeHandle> store_other = result_.
as_mutable_span().slice(data_transfers.size(),
102 store_data_transfers.copy_from(data_transfers);
103 store_other.copy_from(other_nodes);
112void VKScheduler::move_transfer_and_dispatch_outside_rendering_scope(
113 const VKRenderGraph &render_graph)
117 Set<ResourceHandle> used_buffers;
119 foreach_rendering_scope(render_graph, [&](
int64_t start_index,
int64_t end_index) {
121 for (
int index = end_index - 1; index >= start_index; index--) {
123 const VKRenderGraphNode &
node = render_graph.nodes_[node_handle];
127 std::swap(result_[end_index], result_[index]);
132 for (
int index = start_index + 1; index < end_index; index++) {
134 const VKRenderGraphNode &
node = render_graph.nodes_[node_handle];
138 std::swap(result_[start_index], result_[index]);
146 pre_rendering_scope.clear();
147 rendering_scope.clear();
148 used_buffers.clear();
150 for (
int index = start_index + 1; index < end_index; index++) {
152 const VKRenderGraphNode &
node = render_graph.nodes_[node_handle];
157 bool add_to_rendering_scope = !rendering_scope.
is_empty();
160 if (!used_buffers.contains(render_graph.links_[node_handle].outputs[0].resource.handle)) {
163 pre_rendering_scope.append(node_handle);
164 add_to_rendering_scope =
false;
168 if (rendering_scope.is_empty()) {
169 rendering_scope.extend(Span<NodeHandle>(&result_[start_index], index - start_index));
173 if (add_to_rendering_scope) {
176 rendering_scope.append(node_handle);
181 const VKRenderGraphNodeLinks &links = render_graph.links_[node_handle];
182 for (
const VKRenderGraphLink &
input : links.
inputs) {
183 if (
input.is_link_to_buffer()) {
184 used_buffers.add(
input.resource.handle);
188 if (
output.is_link_to_buffer()) {
189 used_buffers.add(
output.resource.handle);
196 if (!pre_rendering_scope.is_empty()) {
197 MutableSpan<NodeHandle> store_none_rendering = result_.
as_mutable_span().slice(
198 start_index, pre_rendering_scope.size());
199 MutableSpan<NodeHandle> store_rendering = result_.
as_mutable_span().slice(
200 start_index + pre_rendering_scope.size(), rendering_scope.size());
201 store_none_rendering.copy_from(pre_rendering_scope);
202 store_rendering.copy_from(rendering_scope);
203 start_index += pre_rendering_scope.size();
214void VKScheduler::debug_print(
const VKRenderGraph &render_graph)
const
216 std::stringstream ss;
219 for (
int index : result_.index_range()) {
220 const NodeHandle node_handle = result_[index];
221 const VKRenderGraphNode &
node = render_graph.nodes_[node_handle];
225 for (
int i = 0; i < indent; i++) {
228 ss <<
node.type <<
"\n";
230 render_graph.debug_print(node_handle);
238 std::cout << ss.str();
void append(const T &value)
MutableSpan< T > as_mutable_span()
Span< NodeHandle > select_nodes(const VKRenderGraph &render_graph)
BLI_INLINE bool node_type_is_rendering(VKNodeType node_type)
static blender::bke::bNodeSocketTemplate outputs[]
static blender::bke::bNodeSocketTemplate inputs[]