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(
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();
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;
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()) {
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();
constexpr void copy_from(Span< T > values) const
bool contains(const Key &key) const
void append(const T &value)
void extend(Span< T > array)
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)