23 select_all_nodes(render_graph);
24 reorder_nodes(render_graph);
32 select_all_nodes(render_graph);
33 reorder_nodes(render_graph);
39 select_all_nodes(render_graph);
40 reorder_nodes(render_graph);
44void VKScheduler::select_all_nodes(
const VKRenderGraph &render_graph)
49 for (
NodeHandle node_handle : render_graph.nodes_.index_range()) {
50 result_.
append(node_handle);
58void VKScheduler::reorder_nodes(
const VKRenderGraph &render_graph)
60 move_transfer_and_dispatch_outside_rendering_scope(render_graph);
63std::optional<std::pair<int64_t, int64_t>> VKScheduler::find_rendering_scope(
64 const VKRenderGraph &render_graph, IndexRange search_range)
const
68 for (
int64_t index : search_range) {
70 const VKRenderGraphNode &node = render_graph.nodes_[node_handle];
72 rendering_start = index;
75 return std::pair(rendering_start, index);
89void VKScheduler::move_transfer_and_dispatch_outside_rendering_scope(
90 const VKRenderGraph &render_graph)
92 Vector<NodeHandle> pre_rendering_scope;
93 Vector<NodeHandle> rendering_scope;
94 Set<ResourceHandle> used_buffers;
96 foreach_rendering_scope(render_graph, [&](
int64_t start_index,
int64_t end_index) {
98 for (
int index = end_index - 1; index >= start_index; index--) {
100 const VKRenderGraphNode &node = render_graph.nodes_[node_handle];
104 std::swap(result_[end_index], result_[index]);
109 for (
int index = start_index + 1; index < end_index; index++) {
111 const VKRenderGraphNode &node = render_graph.nodes_[node_handle];
115 std::swap(result_[start_index], result_[index]);
123 pre_rendering_scope.clear();
124 rendering_scope.clear();
125 used_buffers.clear();
127 for (
int index = start_index + 1; index < end_index; index++) {
129 const VKRenderGraphNode &node = render_graph.nodes_[node_handle];
134 bool add_to_rendering_scope = !rendering_scope.is_empty();
136 if (!used_buffers.contains(
137 render_graph.resources_.buffer_resources_.lookup(node.update_buffer.dst_buffer)))
141 pre_rendering_scope.append(node_handle);
142 add_to_rendering_scope =
false;
146 if (rendering_scope.is_empty()) {
147 rendering_scope.extend(Span<NodeHandle>(&result_[start_index], index - start_index));
151 if (add_to_rendering_scope) {
154 rendering_scope.append(node_handle);
159 const VKRenderGraphNodeLinks &links = render_graph.links_[node_handle];
160 for (
const VKRenderGraphLink &input : links.inputs) {
161 if (render_graph.resources_.resource_type_get(input.resource.handle) ==
164 used_buffers.add(input.resource.handle);
167 for (
const VKRenderGraphLink &output : links.outputs) {
168 if (render_graph.resources_.resource_type_get(output.resource.handle) ==
171 used_buffers.add(output.resource.handle);
178 if (!pre_rendering_scope.is_empty()) {
179 MutableSpan<NodeHandle> store_none_rendering = result_.
as_mutable_span().slice(
180 start_index, pre_rendering_scope.size());
181 MutableSpan<NodeHandle> store_rendering = result_.
as_mutable_span().slice(
182 start_index + pre_rendering_scope.size(), rendering_scope.size());
183 store_none_rendering.copy_from(pre_rendering_scope);
184 store_rendering.copy_from(rendering_scope);
185 start_index += pre_rendering_scope.size();
196void VKScheduler::debug_print(
const VKRenderGraph &render_graph)
const
198 std::stringstream ss;
201 for (
int index : result_.index_range()) {
202 const NodeHandle node_handle = result_[index];
203 const VKRenderGraphNode &node = render_graph.nodes_[node_handle];
207 for (
int i = 0; i < indent; i++) {
210 ss << node.type <<
"\n";
212 render_graph.debug_print(node_handle);
220 std::cout << ss.str();
void append(const T &value)
MutableSpan< T > as_mutable_span()
Span< NodeHandle > select_nodes(const VKRenderGraph &render_graph)
Span< NodeHandle > select_nodes_for_image(const VKRenderGraph &render_graph, VkImage vk_image)
Span< NodeHandle > select_nodes_for_buffer(const VKRenderGraph &render_graph, VkBuffer vk_buffer)
BLI_INLINE bool node_type_is_rendering(VKNodeType node_type)