27 groups_extract_barriers(
35 groups_build_commands(
render_graph, command_buffer, node_handles);
48 NodeHandle node_handle = node_handles[nodes_range[node_group.
size()]];
53 node_group = nodes_range.
slice(0, node_group.
size() + 1);
56 group_nodes_.append(node_group);
57 nodes_range = nodes_range.drop_front(node_group.
size());
61void VKCommandBuilder::groups_extract_barriers(
VKRenderGraph &render_graph,
62 Span<NodeHandle> node_handles,
65 barrier_list_.clear();
66 vk_buffer_memory_barriers_.clear();
67 vk_image_memory_barriers_.clear();
69 LayeredImageTracker layered_tracker(*
this);
72 group_pre_barriers_.clear();
73 group_post_barriers_.clear();
74 node_pre_barriers_.resize(node_handles.
size());
79 Vector<Barrier> post_barriers;
82 Vector<Barrier> node_pre_barriers;
85 bool rendering_active =
false;
87 for (
const int64_t group_index : group_nodes_.index_range()) {
89 Barriers group_pre_barriers(barrier_list_.size(), 0);
90 const GroupNodes &node_group = group_nodes_[group_index];
91 for (
const int64_t group_node_index : node_group) {
92 NodeHandle node_handle = node_handles[group_node_index];
93 VKRenderGraphNode &node = render_graph.nodes_[node_handle];
95 build_pipeline_barriers(
96 render_graph, node_handle, node.pipeline_stage_get(), layered_tracker, barrier);
99 std::cout << __func__ <<
": node_group=" << group_index
100 <<
", node_group_range=" << node_group.first() <<
"-" << node_group.last()
101 <<
", node_handle=" << node_handle <<
", node_type=" << node.type
102 <<
", debug_group=" << render_graph.full_debug_group(node_handle) <<
"\n";
103 std::cout << __func__ <<
": " << to_string_barrier(barrier);
105 barrier_list_.append(barrier);
115 rendering_scope = node_handle;
116 rendering_active =
true;
117 layered_tracker.begin(render_graph, node_handle);
124 rendering_active =
false;
130 layered_tracker.end(barrier, use_local_read);
132 post_barriers.
append(barrier);
138 rendering_active =
false;
144 layered_tracker.suspend(barrier, use_local_read);
146 post_barriers.
append(barrier);
152 VKRenderGraphNode &rendering_node = render_graph.nodes_[rendering_scope];
154 build_pipeline_barriers(render_graph,
156 rendering_node.pipeline_stage_get(),
160 barrier_list_.append(barrier);
166 layered_tracker.resume(barrier, use_local_read);
168 barrier_list_.append(barrier);
171 rendering_active =
true;
176 node_has_input_attachments(render_graph, node_handle))
179 build_pipeline_barriers(
180 render_graph, node_handle, node.pipeline_stage_get(), layered_tracker, barrier,
true);
182 node_pre_barriers.
append(barrier);
186 if (rendering_active) {
194 layered_tracker.suspend(barrier, use_local_read);
196 post_barriers.
append(barrier);
198 rendering_active =
false;
204 group_pre_barriers_.append(group_pre_barriers.with_new_end(barrier_list_size));
205 barrier_list_.extend(std::move(post_barriers));
206 group_post_barriers_.append(
208 if (!node_pre_barriers.
is_empty()) {
209 barrier_list_size = barrier_list_.size();
210 barrier_list_.extend(std::move(node_pre_barriers));
212 for (
const int64_t group_node_index : node_group) {
213 NodeHandle node_handle = node_handles[group_node_index];
214 if (!node_pre_barriers_[node_handle].is_empty()) {
215 node_pre_barriers_[node_handle].from_begin_size(
216 node_pre_barriers_[node_handle].start() + barrier_list_size, 1);
222 BLI_assert(group_pre_barriers_.size() == group_nodes_.size());
223 BLI_assert(group_post_barriers_.size() == group_nodes_.size());
226void VKCommandBuilder::groups_build_commands(
VKRenderGraph &render_graph,
228 Span<NodeHandle> node_handles)
230 DebugGroups debug_groups = {};
231 VKBoundPipelines active_pipelines = {};
234 bool rendering_active =
false;
236 for (
int64_t group_index : group_nodes_.index_range()) {
237 IndexRange group_nodes = group_nodes_[group_index];
238 Span<NodeHandle> group_node_handles = node_handles.
slice(group_nodes);
241 for (BarrierIndex barrier_index : group_pre_barriers_[group_index]) {
243 "Pre group barriers must be executed outside a rendering scope.");
244 Barrier &
barrier = barrier_list_[barrier_index];
246 std::cout << __func__ <<
": node_group=" << group_index
247 <<
", node_group_range=" << group_node_handles.
first() <<
"-"
248 << group_node_handles.
last() <<
", pre_barrier=(" << to_string_barrier(barrier)
251 send_pipeline_barriers(command_buffer, barrier,
false);
255 for (
NodeHandle node_handle : group_node_handles) {
256 VKRenderGraphNode &node = render_graph.nodes_[node_handle];
259 activate_debug_group(render_graph, command_buffer, debug_groups, node_handle);
263 rendering_scope = node_handle;
264 rendering_active =
true;
268 rendering_active =
false;
271 if (!rendering_active) {
273 VKRenderGraphNode &rendering_node = render_graph.nodes_[rendering_scope];
275 render_graph.storage_.begin_rendering[rendering_node.storage_index]);
276 rendering_node.build_commands(command_buffer, render_graph.storage_, active_pipelines);
277 rendering_active =
true;
282 for (BarrierIndex node_pre_barrier_index : node_pre_barriers_[node_handle]) {
283 Barrier &
barrier = barrier_list_[node_pre_barrier_index];
285 std::cout << __func__ <<
": node_group=" << group_index
286 <<
", node_group_range=" << group_node_handles.first() <<
"-"
287 << group_node_handles.last() <<
", node_pre_barrier=(" << to_string_barrier(barrier)
291 send_pipeline_barriers(command_buffer, barrier,
true);
295 std::cout << __func__ <<
": node_group=" << group_index
296 <<
", node_group_range=" << group_node_handles.first() <<
"-"
297 << group_node_handles.last() <<
", node_handle=" << node_handle
298 <<
", node_type=" << node.type
299 <<
", debug group=" << render_graph.full_debug_group(node_handle) <<
"\n";
301 node.build_commands(command_buffer, render_graph.storage_, active_pipelines);
304 if (rendering_active) {
307 rendering_active =
false;
308 if (command_buffer.use_dynamic_rendering) {
309 command_buffer.end_rendering();
312 command_buffer.end_render_pass();
317 for (BarrierIndex barrier_index : group_post_barriers_[group_index]) {
319 "Post group barriers must be executed outside a rendering scope.");
320 Barrier &
barrier = barrier_list_[barrier_index];
322 std::cout << __func__ <<
": node_group=" << group_index
323 <<
", node_group_range=" << group_node_handles.first() <<
"-"
324 << group_node_handles.last() <<
", post_barrier=(" << to_string_barrier(barrier)
327 send_pipeline_barriers(command_buffer, barrier,
false);
331 finish_debug_groups(command_buffer, debug_groups);
334bool VKCommandBuilder::node_has_input_attachments(
const VKRenderGraph &render_graph,
337 const VKRenderGraphNodeLinks &links = render_graph.links_[node];
339 return std::any_of(
inputs.begin(),
inputs.end(), [](
const VKRenderGraphLink &
input) {
340 return input.vk_access_flags & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
344void VKCommandBuilder::activate_debug_group(
VKRenderGraph &render_graph,
346 DebugGroups &debug_groups,
349 VKRenderGraph::DebugGroupID debug_group = render_graph.debug_.node_group_map[node_handle];
350 if (debug_group == debug_groups.active_debug_group_id) {
358 if (debug_group == -1) {
359 num_ends = debug_groups.debug_level;
363 render_graph.debug_.used_groups[debug_group];
364 if (debug_groups.active_debug_group_id != -1) {
366 render_graph.debug_.used_groups[debug_groups.active_debug_group_id];
370 for (
int index : IndexRange(num_checks)) {
371 if (from_group[index] != to_group[index]) {
372 num_ends += num_checks - index;
378 num_begins = to_group.
size() - (debug_groups.debug_level - num_ends);
382 for (
int index = 0; index < num_ends; index++) {
383 command_buffer.end_debug_utils_label();
385 debug_groups.debug_level -= num_ends;
388 if (num_begins > 0) {
390 render_graph.debug_.used_groups[debug_group];
391 VkDebugUtilsLabelEXT debug_utils_label = {};
392 debug_utils_label.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
393 for (
int index : IndexRange(debug_groups.debug_level, num_begins)) {
394 const VKRenderGraph::DebugGroup &debug_group = render_graph.debug_.groups[to_group[index]];
395 debug_utils_label.pLabelName = debug_group.name.c_str();
396 copy_v4_v4(debug_utils_label.color, debug_group.color);
397 command_buffer.begin_debug_utils_label(&debug_utils_label);
401 debug_groups.debug_level += num_begins;
402 debug_groups.active_debug_group_id = debug_group;
406 DebugGroups &debug_groups)
408 for (
int i = 0;
i < debug_groups.debug_level;
i++) {
409 command_buffer.end_debug_utils_label();
411 debug_groups.debug_level = 0;
414void VKCommandBuilder::build_pipeline_barriers(
VKRenderGraph &render_graph,
416 VkPipelineStageFlags pipeline_stage,
417 LayeredImageTracker &layered_tracker,
419 bool within_rendering)
421 reset_barriers(r_barrier);
423 render_graph, node_handle, pipeline_stage, layered_tracker, r_barrier, within_rendering);
424 add_buffer_barriers(render_graph, node_handle, pipeline_stage, r_barrier);
433void VKCommandBuilder::reset_barriers(Barrier &r_barrier)
435 r_barrier.dst_stage_mask = r_barrier.src_stage_mask = VK_PIPELINE_STAGE_NONE;
439 const Barrier &barrier,
440 bool within_rendering)
451 VkPipelineStageFlags src_stage_mask = (
barrier.src_stage_mask == VK_PIPELINE_STAGE_NONE) ?
452 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT :
453 VkPipelineStageFlagBits(
barrier.src_stage_mask);
455 VkPipelineStageFlags dst_stage_mask =
barrier.dst_stage_mask;
457 if (within_rendering) {
462 src_stage_mask = dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
463 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
464 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
465 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
468 Span<VkBufferMemoryBarrier> buffer_barriers = vk_buffer_memory_barriers_.as_span().slice(
469 barrier.buffer_memory_barriers);
470 Span<VkImageMemoryBarrier> image_barriers = vk_image_memory_barriers_.as_span().slice(
471 barrier.image_memory_barriers);
473 command_buffer.pipeline_barrier(src_stage_mask,
475 VK_DEPENDENCY_BY_REGION_BIT,
478 buffer_barriers.
size(),
479 buffer_barriers.
data(),
480 image_barriers.size(),
481 image_barriers.data());
484void VKCommandBuilder::add_buffer_barriers(
VKRenderGraph &render_graph,
486 VkPipelineStageFlags node_stages,
489 r_barrier.buffer_memory_barriers = IndexRange(vk_buffer_memory_barriers_.size(), 0);
490 add_buffer_read_barriers(render_graph, node_handle, node_stages, r_barrier);
491 add_buffer_write_barriers(render_graph, node_handle, node_stages, r_barrier);
492 r_barrier.buffer_memory_barriers = r_barrier.buffer_memory_barriers.with_new_end(
493 vk_buffer_memory_barriers_.size());
496void VKCommandBuilder::add_buffer_read_barriers(
VKRenderGraph &render_graph,
498 VkPipelineStageFlags node_stages,
501 for (
const VKRenderGraphLink &link : render_graph.links_[node_handle].inputs) {
502 if (!link.is_link_to_buffer()) {
505 const ResourceWithStamp &versioned_resource = link.resource;
506 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
507 versioned_resource.handle);
508 VKResourceBarrierState &resource_state =
resource.barrier_state;
509 const bool is_first_read = resource_state.is_new_stamp();
510 if (!is_first_read &&
511 (resource_state.vk_access & link.vk_access_flags) == link.vk_access_flags &&
512 (resource_state.vk_pipeline_stages & node_stages) == node_stages)
518 const VkAccessFlags wait_access = resource_state.vk_access;
520 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
521 r_barrier.dst_stage_mask |= node_stages;
524 resource_state.vk_access = link.vk_access_flags;
525 resource_state.vk_pipeline_stages = node_stages;
528 resource_state.vk_access |= link.vk_access_flags;
529 resource_state.vk_pipeline_stages |= node_stages;
532 add_buffer_barrier(
resource.buffer.vk_buffer, r_barrier, wait_access, link.vk_access_flags);
536void VKCommandBuilder::add_buffer_write_barriers(
VKRenderGraph &render_graph,
538 VkPipelineStageFlags node_stages,
541 for (
const VKRenderGraphLink link : render_graph.links_[node_handle].outputs) {
542 if (!link.is_link_to_buffer()) {
545 const ResourceWithStamp &versioned_resource = link.resource;
546 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
547 versioned_resource.handle);
548 VKResourceBarrierState &resource_state =
resource.barrier_state;
549 const VkAccessFlags wait_access = resource_state.vk_access;
551 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
552 r_barrier.dst_stage_mask |= node_stages;
554 resource_state.vk_access = link.vk_access_flags;
555 resource_state.vk_pipeline_stages = node_stages;
557 if (wait_access != VK_ACCESS_NONE) {
558 add_buffer_barrier(
resource.buffer.vk_buffer, r_barrier, wait_access, link.vk_access_flags);
563void VKCommandBuilder::add_buffer_barrier(VkBuffer vk_buffer,
565 VkAccessFlags src_access_mask,
566 VkAccessFlags dst_access_mask)
568 for (VkBufferMemoryBarrier &vk_buffer_memory_barrier :
569 vk_buffer_memory_barriers_.as_mutable_span().drop_front(
570 r_barrier.buffer_memory_barriers.start()))
572 if (vk_buffer_memory_barrier.buffer == vk_buffer) {
575 if ((vk_buffer_memory_barrier.dstAccessMask & src_access_mask) == src_access_mask) {
576 vk_buffer_memory_barrier.dstAccessMask |= dst_access_mask;
581 if ((vk_buffer_memory_barrier.dstAccessMask & dst_access_mask) == dst_access_mask &&
582 (vk_buffer_memory_barrier.srcAccessMask & src_access_mask) == src_access_mask)
589 vk_buffer_memory_barriers_.append({VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
593 VK_QUEUE_FAMILY_IGNORED,
594 VK_QUEUE_FAMILY_IGNORED,
600void VKCommandBuilder::add_image_barriers(
VKRenderGraph &render_graph,
602 VkPipelineStageFlags node_stages,
603 LayeredImageTracker &layered_tracker,
605 bool within_rendering)
607 r_barrier.image_memory_barriers = IndexRange(vk_image_memory_barriers_.size(), 0);
608 add_image_read_barriers(
609 render_graph, node_handle, node_stages, layered_tracker, r_barrier, within_rendering);
610 add_image_write_barriers(
611 render_graph, node_handle, node_stages, layered_tracker, r_barrier, within_rendering);
612 r_barrier.image_memory_barriers = r_barrier.image_memory_barriers.with_new_end(
613 vk_image_memory_barriers_.size());
616void VKCommandBuilder::add_image_read_barriers(
VKRenderGraph &render_graph,
618 VkPipelineStageFlags node_stages,
619 LayeredImageTracker &layered_tracker,
621 bool within_rendering)
623 for (
const VKRenderGraphLink &link : render_graph.links_[node_handle].inputs) {
624 if (link.is_link_to_buffer()) {
627 const ResourceWithStamp &versioned_resource = link.resource;
628 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
629 versioned_resource.handle);
630 VKResourceBarrierState &resource_state =
resource.barrier_state;
631 const bool is_first_read = resource_state.is_new_stamp();
632 if ((!is_first_read) &&
633 (resource_state.vk_access & link.vk_access_flags) == link.vk_access_flags &&
634 (resource_state.vk_pipeline_stages & node_stages) == node_stages &&
635 resource_state.image_layout == link.vk_image_layout)
640 if (within_rendering && link.vk_image_layout != VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR) {
645 if (resource_state.image_layout != link.vk_image_layout &&
646 layered_tracker.contains(
resource.image.vk_image))
648 layered_tracker.update(
resource.image.vk_image,
651 resource_state.image_layout,
652 link.vk_image_layout,
657 VkAccessFlags wait_access = resource_state.vk_access;
659 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
660 r_barrier.dst_stage_mask |= node_stages;
663 resource_state.vk_access = link.vk_access_flags;
664 resource_state.vk_pipeline_stages = node_stages;
667 resource_state.vk_access |= link.vk_access_flags;
668 resource_state.vk_pipeline_stages |= node_stages;
671 add_image_barrier(
resource.image.vk_image,
674 link.vk_access_flags,
675 resource_state.image_layout,
676 link.vk_image_layout,
677 link.vk_image_aspect);
678 resource_state.image_layout = link.vk_image_layout;
682void VKCommandBuilder::add_image_write_barriers(
VKRenderGraph &render_graph,
684 VkPipelineStageFlags node_stages,
685 LayeredImageTracker &layered_tracker,
687 bool within_rendering)
689 for (
const VKRenderGraphLink link : render_graph.links_[node_handle].outputs) {
690 if (link.is_link_to_buffer()) {
693 const ResourceWithStamp &versioned_resource = link.resource;
694 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
695 versioned_resource.handle);
696 VKResourceBarrierState &resource_state =
resource.barrier_state;
697 const VkAccessFlags wait_access = resource_state.vk_access;
698 if (within_rendering && link.vk_image_layout != VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR) {
702 if (layered_tracker.contains(
resource.image.vk_image) &&
703 resource_state.image_layout != link.vk_image_layout)
705 layered_tracker.update(
resource.image.vk_image,
708 resource_state.image_layout,
709 link.vk_image_layout,
715 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
716 r_barrier.dst_stage_mask |= node_stages;
718 resource_state.vk_access = link.vk_access_flags;
719 resource_state.vk_pipeline_stages = node_stages;
721 if (wait_access != VK_ACCESS_NONE || link.vk_image_layout != resource_state.image_layout) {
722 add_image_barrier(
resource.image.vk_image,
725 link.vk_access_flags,
726 resource_state.image_layout,
727 link.vk_image_layout,
728 link.vk_image_aspect);
729 resource_state.image_layout = link.vk_image_layout;
734void VKCommandBuilder::add_image_barrier(VkImage vk_image,
736 VkAccessFlags src_access_mask,
737 VkAccessFlags dst_access_mask,
738 VkImageLayout old_layout,
739 VkImageLayout new_layout,
740 VkImageAspectFlags aspect_mask,
742 uint32_t layer_count)
744 BLI_assert(aspect_mask != VK_IMAGE_ASPECT_NONE);
745 for (VkImageMemoryBarrier &vk_image_memory_barrier :
746 vk_image_memory_barriers_.as_mutable_span().drop_front(
747 r_barrier.image_memory_barriers.start()))
749 if (vk_image_memory_barrier.image == vk_image) {
753 if ((vk_image_memory_barrier.dstAccessMask & src_access_mask) == src_access_mask) {
754 vk_image_memory_barrier.dstAccessMask |= dst_access_mask;
759 if ((vk_image_memory_barrier.dstAccessMask & dst_access_mask) == dst_access_mask &&
760 (vk_image_memory_barrier.srcAccessMask & src_access_mask) == src_access_mask &&
761 old_layout == new_layout)
768 vk_image_memory_barriers_.append(
769 {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
775 VK_QUEUE_FAMILY_IGNORED,
776 VK_QUEUE_FAMILY_IGNORED,
778 {aspect_mask, 0, VK_REMAINING_MIP_LEVELS, layer_base, layer_count}});
787void VKCommandBuilder::LayeredImageTracker::begin(
const VKRenderGraph &render_graph,
791 layered_attachments.clear();
792 layered_bindings.clear();
794 const VKRenderGraphNodeLinks &links = render_graph.links_[node_handle];
795 for (
const VKRenderGraphLink &link : links.outputs) {
796 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
797 link.resource.handle);
798 if (
resource.has_multiple_layers()) {
799 layered_attachments.add(
resource.image.vk_image);
804void VKCommandBuilder::LayeredImageTracker::update(VkImage vk_image,
806 uint32_t layer_count,
807 VkImageLayout old_layout,
808 VkImageLayout new_layout,
811 for (
const TrackedImage &binding : layered_bindings) {
812 if (binding.vk_image == vk_image && binding.layer == layer) {
814 "We don't support that one layer transitions multiple times during a "
822 layered_bindings.append({vk_image, new_layout, layer, layer_count});
825 r_barrier.src_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
826 r_barrier.dst_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
827 command_builder.add_image_barrier(vk_image,
829 VK_ACCESS_TRANSFER_WRITE_BIT,
830 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
831 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
832 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
833 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
836 VK_IMAGE_ASPECT_COLOR_BIT,
841void VKCommandBuilder::LayeredImageTracker::end(Barrier &r_barrier,
bool use_local_read)
843 suspend(r_barrier, use_local_read);
844 layered_attachments.clear();
845 layered_bindings.clear();
848void VKCommandBuilder::LayeredImageTracker::suspend(Barrier &r_barrier,
bool use_local_read)
851 if (layered_bindings.is_empty()) {
855 command_builder.reset_barriers(r_barrier);
857 r_barrier.src_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
858 r_barrier.dst_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
859 int64_t start_index = command_builder.vk_image_memory_barriers_.size();
861 for (
const TrackedImage &binding : layered_bindings) {
862 command_builder.add_image_barrier(
865 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
866 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
867 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
868 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
869 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
870 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
871 binding.vk_image_layout,
872 use_local_read ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR :
873 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
874 VK_IMAGE_ASPECT_COLOR_BIT,
876 binding.layer_count);
877 r_barrier.image_memory_barriers = r_barrier.image_memory_barriers.with_new_end(
878 command_builder.vk_image_memory_barriers_.size());
881 std::cout << __func__ <<
": transition layout image=" << binding.vk_image
882 <<
", layer=" << binding.layer <<
", count=" << binding.layer_count
883 <<
", from_layout=" <<
to_string(binding.vk_image_layout)
884 <<
", to_layout=" <<
to_string(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) <<
"\n";
889void VKCommandBuilder::LayeredImageTracker::resume(Barrier &r_barrier,
bool use_local_read)
891 if (layered_bindings.is_empty()) {
895 command_builder.reset_barriers(r_barrier);
897 r_barrier.src_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
898 r_barrier.dst_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
899 int64_t start_index = command_builder.vk_image_memory_barriers_.size();
902 for (
const TrackedImage &binding : layered_bindings) {
903 command_builder.add_image_barrier(
906 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
907 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
908 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
909 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
910 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
911 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
912 use_local_read ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR :
913 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
914 binding.vk_image_layout,
915 VK_IMAGE_ASPECT_COLOR_BIT,
917 binding.layer_count);
919 std::cout << __func__ <<
": transition layout image=" << binding.vk_image
920 <<
", layer=" << binding.layer <<
", count=" << binding.layer_count
921 <<
", from_layout=" <<
to_string(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
922 <<
", to_layout=" <<
to_string(binding.vk_image_layout) <<
"\n";
932std::string VKCommandBuilder::to_string_barrier(
const Barrier &barrier)
934 std::stringstream ss;
937 for (
const VkBufferMemoryBarrier &buffer_memory_barrier :
938 vk_buffer_memory_barriers_.as_span().slice(
barrier.buffer_memory_barriers))
942 <<
", vk_buffer=" <<
to_string(buffer_memory_barrier.buffer) <<
"\n";
945 for (
const VkImageMemoryBarrier &image_memory_barrier :
946 vk_image_memory_barriers_.as_span().slice(
barrier.image_memory_barriers))
950 <<
", vk_image=" <<
to_string(image_memory_barrier.image)
951 <<
", old_layout=" <<
to_string(image_memory_barrier.oldLayout)
952 <<
", new_layout=" <<
to_string(image_memory_barrier.newLayout)
953 <<
", subresource_range=" <<
to_string(image_memory_barrier.subresourceRange, 2) <<
"\n";
#define BLI_assert_msg(a, msg)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE void copy_v4_v4(float r[4], const float a[4])
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T * data() const
constexpr const T & first() const
constexpr int64_t size() const
constexpr const T & last(const int64_t n=0) const
void append(const T &value)
constexpr int64_t first() const
constexpr int64_t size() const
constexpr bool is_empty() const
static constexpr IndexRange from_begin_end(const int64_t begin, const int64_t end)
static constexpr IndexRange from_begin_size(const int64_t begin, const int64_t size)
constexpr IndexRange slice(int64_t start, int64_t size) const
constexpr IndexRange index_range() const
static void reconfigure_for_restart(VKBeginRenderingData &begin_rendering_data)
bool use_dynamic_rendering_local_read
void record_commands(VKRenderGraph &render_graph, VKCommandBufferInterface &command_buffer, Span< NodeHandle > node_handles)
void build_nodes(VKRenderGraph &render_graph, VKCommandBufferInterface &command_buffer, Span< NodeHandle > node_handles)
BLI_INLINE bool node_type_is_rendering(VKNodeType node_type)
BLI_INLINE bool node_type_is_within_rendering(VKNodeType node_type)
const char * to_string(ShaderStage stage)
std::string to_string_vk_pipeline_stage_flags(const VkPipelineStageFlags vk_pipeline_stage_flags)
std::string to_string_vk_access_flags(const VkAccessFlags vk_access_flags)
static blender::bke::bNodeSocketTemplate inputs[]