23 result_.append(node_handle);
36 move_transfer_and_dispatch_outside_rendering_scope(
render_graph);
39std::optional<std::pair<int64_t, int64_t>> VKScheduler::find_rendering_scope(
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)
67 Vector<NodeHandle> data_transfers;
68 Vector<NodeHandle> other_nodes;
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);
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);
112void VKScheduler::move_transfer_and_dispatch_outside_rendering_scope(
115 Vector<NodeHandle> pre_rendering_scope;
116 Vector<NodeHandle> rendering_scope;
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;
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);
187 for (
const VKRenderGraphLink &
output : links.outputs) {
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();
constexpr void copy_from(Span< T > values) const
bool contains(const Key &key) const
void append(const T &value)
void reserve(const int64_t min_capacity)
void extend(Span< T > array)
Span< NodeHandle > select_nodes(const VKRenderGraph &render_graph)
BLI_INLINE bool node_type_is_rendering(VKNodeType node_type)