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 ImageTracker image_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(), image_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 image_tracker.begin(render_graph, node_handle);
124 rendering_active =
false;
130 image_tracker.end(barrier, use_local_read);
132 post_barriers.
append(barrier);
138 rendering_active =
false;
144 image_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 image_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(), image_tracker, barrier,
true);
182 node_pre_barriers.
append(barrier);
186 if (rendering_active) {
194 image_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 command_buffer.end_rendering();
312 for (BarrierIndex barrier_index : group_post_barriers_[group_index]) {
314 "Post group barriers must be executed outside a rendering scope.");
315 Barrier &
barrier = barrier_list_[barrier_index];
317 std::cout << __func__ <<
": node_group=" << group_index
318 <<
", node_group_range=" << group_node_handles.first() <<
"-"
319 << group_node_handles.last() <<
", post_barrier=(" << to_string_barrier(barrier)
322 send_pipeline_barriers(command_buffer, barrier,
false);
326 finish_debug_groups(command_buffer, debug_groups);
329bool VKCommandBuilder::node_has_input_attachments(
const VKRenderGraph &render_graph,
332 const VKRenderGraphNodeLinks &links = render_graph.links_[node];
333 const Vector<VKRenderGraphLink> &
inputs = links.inputs;
334 return std::any_of(
inputs.begin(),
inputs.end(), [](
const VKRenderGraphLink &
input) {
335 return input.vk_access_flags & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
339void VKCommandBuilder::activate_debug_group(
VKRenderGraph &render_graph,
341 DebugGroups &debug_groups,
344 VKRenderGraph::DebugGroupID debug_group = render_graph.debug_.node_group_map[node_handle];
345 if (debug_group == debug_groups.active_debug_group_id) {
353 if (debug_group == -1) {
354 num_ends = debug_groups.debug_level;
357 Vector<VKRenderGraph::DebugGroupNameID> &to_group =
358 render_graph.debug_.used_groups[debug_group];
359 if (debug_groups.active_debug_group_id != -1) {
360 Vector<VKRenderGraph::DebugGroupNameID> &from_group =
361 render_graph.debug_.used_groups[debug_groups.active_debug_group_id];
365 for (
int index : IndexRange(num_checks)) {
366 if (from_group[index] != to_group[index]) {
367 num_ends += num_checks - index;
373 num_begins = to_group.
size() - (debug_groups.debug_level - num_ends);
377 for (
int index = 0; index < num_ends; index++) {
378 command_buffer.end_debug_utils_label();
380 debug_groups.debug_level -= num_ends;
383 if (num_begins > 0) {
384 Vector<VKRenderGraph::DebugGroupNameID> &to_group =
385 render_graph.debug_.used_groups[debug_group];
386 VkDebugUtilsLabelEXT debug_utils_label = {};
387 debug_utils_label.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
388 for (
int index : IndexRange(debug_groups.debug_level, num_begins)) {
389 const VKRenderGraph::DebugGroup &debug_group = render_graph.debug_.groups[to_group[index]];
390 debug_utils_label.pLabelName = debug_group.name.c_str();
391 copy_v4_v4(debug_utils_label.color, debug_group.color);
392 command_buffer.begin_debug_utils_label(&debug_utils_label);
396 debug_groups.debug_level += num_begins;
397 debug_groups.active_debug_group_id = debug_group;
401 DebugGroups &debug_groups)
403 for (
int i = 0;
i < debug_groups.debug_level;
i++) {
404 command_buffer.end_debug_utils_label();
406 debug_groups.debug_level = 0;
409void VKCommandBuilder::build_pipeline_barriers(
VKRenderGraph &render_graph,
411 VkPipelineStageFlags pipeline_stage,
412 ImageTracker &image_tracker,
414 bool within_rendering)
416 reset_barriers(r_barrier);
418 render_graph, node_handle, pipeline_stage, image_tracker, r_barrier, within_rendering);
419 add_buffer_barriers(render_graph, node_handle, pipeline_stage, r_barrier);
428void VKCommandBuilder::reset_barriers(Barrier &r_barrier)
430 r_barrier.dst_stage_mask = r_barrier.src_stage_mask = VK_PIPELINE_STAGE_NONE;
434 const Barrier &barrier,
435 bool within_rendering)
446 VkPipelineStageFlags src_stage_mask = (
barrier.src_stage_mask == VK_PIPELINE_STAGE_NONE) ?
447 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT :
448 VkPipelineStageFlagBits(
barrier.src_stage_mask);
450 VkPipelineStageFlags dst_stage_mask =
barrier.dst_stage_mask;
452 if (within_rendering) {
457 src_stage_mask = dst_stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
458 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
459 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
460 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
463 Span<VkBufferMemoryBarrier> buffer_barriers = vk_buffer_memory_barriers_.as_span().slice(
464 barrier.buffer_memory_barriers);
465 Span<VkImageMemoryBarrier> image_barriers = vk_image_memory_barriers_.as_span().slice(
466 barrier.image_memory_barriers);
468 command_buffer.pipeline_barrier(src_stage_mask,
470 VK_DEPENDENCY_BY_REGION_BIT,
473 buffer_barriers.
size(),
474 buffer_barriers.
data(),
475 image_barriers.size(),
476 image_barriers.data());
479void VKCommandBuilder::add_buffer_barriers(
VKRenderGraph &render_graph,
481 VkPipelineStageFlags node_stages,
484 r_barrier.buffer_memory_barriers = IndexRange(vk_buffer_memory_barriers_.size(), 0);
485 add_buffer_read_barriers(render_graph, node_handle, node_stages, r_barrier);
486 add_buffer_write_barriers(render_graph, node_handle, node_stages, r_barrier);
487 r_barrier.buffer_memory_barriers = r_barrier.buffer_memory_barriers.with_new_end(
488 vk_buffer_memory_barriers_.size());
491void VKCommandBuilder::add_buffer_read_barriers(
VKRenderGraph &render_graph,
493 VkPipelineStageFlags node_stages,
496 for (
const VKRenderGraphLink &link : render_graph.links_[node_handle].inputs) {
497 if (!link.is_link_to_buffer()) {
500 const ResourceWithStamp &versioned_resource = link.resource;
501 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
502 versioned_resource.handle);
503 VKResourceBarrierState &resource_state =
resource.barrier_state;
504 const bool is_first_read = resource_state.is_new_stamp();
505 if (!is_first_read &&
506 (resource_state.vk_access & link.vk_access_flags) == link.vk_access_flags &&
507 (resource_state.vk_pipeline_stages & node_stages) == node_stages)
513 const VkAccessFlags wait_access = resource_state.vk_access;
515 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
516 r_barrier.dst_stage_mask |= node_stages;
519 resource_state.vk_access = link.vk_access_flags;
520 resource_state.vk_pipeline_stages = node_stages;
523 resource_state.vk_access |= link.vk_access_flags;
524 resource_state.vk_pipeline_stages |= node_stages;
527 add_buffer_barrier(
resource.buffer.vk_buffer, r_barrier, wait_access, link.vk_access_flags);
531void VKCommandBuilder::add_buffer_write_barriers(
VKRenderGraph &render_graph,
533 VkPipelineStageFlags node_stages,
536 for (
const VKRenderGraphLink link : render_graph.links_[node_handle].outputs) {
537 if (!link.is_link_to_buffer()) {
540 const ResourceWithStamp &versioned_resource = link.resource;
541 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
542 versioned_resource.handle);
543 VKResourceBarrierState &resource_state =
resource.barrier_state;
544 const VkAccessFlags wait_access = resource_state.vk_access;
546 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
547 r_barrier.dst_stage_mask |= node_stages;
549 resource_state.vk_access = link.vk_access_flags;
550 resource_state.vk_pipeline_stages = node_stages;
552 if (wait_access != VK_ACCESS_NONE) {
553 add_buffer_barrier(
resource.buffer.vk_buffer, r_barrier, wait_access, link.vk_access_flags);
558void VKCommandBuilder::add_buffer_barrier(VkBuffer vk_buffer,
560 VkAccessFlags src_access_mask,
561 VkAccessFlags dst_access_mask)
563 for (VkBufferMemoryBarrier &vk_buffer_memory_barrier :
564 vk_buffer_memory_barriers_.as_mutable_span().drop_front(
565 r_barrier.buffer_memory_barriers.start()))
567 if (vk_buffer_memory_barrier.buffer == vk_buffer) {
570 if ((vk_buffer_memory_barrier.dstAccessMask & src_access_mask) == src_access_mask) {
571 vk_buffer_memory_barrier.dstAccessMask |= dst_access_mask;
576 if ((vk_buffer_memory_barrier.dstAccessMask & dst_access_mask) == dst_access_mask &&
577 (vk_buffer_memory_barrier.srcAccessMask & src_access_mask) == src_access_mask)
584 vk_buffer_memory_barriers_.append({VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
588 VK_QUEUE_FAMILY_IGNORED,
589 VK_QUEUE_FAMILY_IGNORED,
595void VKCommandBuilder::add_image_barriers(
VKRenderGraph &render_graph,
597 VkPipelineStageFlags node_stages,
598 ImageTracker &image_tracker,
600 bool within_rendering)
602 r_barrier.image_memory_barriers = IndexRange(vk_image_memory_barriers_.size(), 0);
603 add_image_read_barriers(
604 render_graph, node_handle, node_stages, image_tracker, r_barrier, within_rendering);
605 add_image_write_barriers(
606 render_graph, node_handle, node_stages, image_tracker, r_barrier, within_rendering);
607 r_barrier.image_memory_barriers = r_barrier.image_memory_barriers.with_new_end(
608 vk_image_memory_barriers_.size());
611void VKCommandBuilder::add_image_read_barriers(
VKRenderGraph &render_graph,
613 VkPipelineStageFlags node_stages,
614 ImageTracker &image_tracker,
616 bool within_rendering)
618 for (
const VKRenderGraphLink &link : render_graph.links_[node_handle].inputs) {
619 if (link.is_link_to_buffer()) {
622 const ResourceWithStamp &versioned_resource = link.resource;
623 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
624 versioned_resource.handle);
625 VKResourceBarrierState &resource_state =
resource.barrier_state;
626 const bool is_first_read = resource_state.is_new_stamp();
627 if ((!is_first_read) &&
628 (resource_state.vk_access & link.vk_access_flags) == link.vk_access_flags &&
629 (resource_state.vk_pipeline_stages & node_stages) == node_stages &&
630 resource_state.image_layout == link.vk_image_layout)
635 if (within_rendering && link.vk_image_layout != VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR) {
640 if (resource_state.image_layout != link.vk_image_layout &&
641 image_tracker.contains(
resource.image.vk_image))
643 image_tracker.update(
resource.image.vk_image,
645 resource_state.image_layout,
646 link.vk_image_layout,
651 VkAccessFlags wait_access = resource_state.vk_access;
653 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
654 r_barrier.dst_stage_mask |= node_stages;
657 resource_state.vk_access = link.vk_access_flags;
658 resource_state.vk_pipeline_stages = node_stages;
661 resource_state.vk_access |= link.vk_access_flags;
662 resource_state.vk_pipeline_stages |= node_stages;
665 add_image_barrier(
resource.image.vk_image,
668 link.vk_access_flags,
669 resource_state.image_layout,
670 link.vk_image_layout,
671 link.vk_image_aspect,
673 resource_state.image_layout = link.vk_image_layout;
677void VKCommandBuilder::add_image_write_barriers(
VKRenderGraph &render_graph,
679 VkPipelineStageFlags node_stages,
680 ImageTracker &image_tracker,
682 bool within_rendering)
684 for (
const VKRenderGraphLink link : render_graph.links_[node_handle].outputs) {
685 if (link.is_link_to_buffer()) {
688 const ResourceWithStamp &versioned_resource = link.resource;
689 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
690 versioned_resource.handle);
691 VKResourceBarrierState &resource_state =
resource.barrier_state;
692 const VkAccessFlags wait_access = resource_state.vk_access;
693 if (within_rendering && link.vk_image_layout != VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR) {
697 if (image_tracker.contains(
resource.image.vk_image) &&
698 resource_state.image_layout != link.vk_image_layout)
700 image_tracker.update(
resource.image.vk_image,
702 resource_state.image_layout,
703 link.vk_image_layout,
709 r_barrier.src_stage_mask |= resource_state.vk_pipeline_stages;
710 r_barrier.dst_stage_mask |= node_stages;
712 resource_state.vk_access = link.vk_access_flags;
713 resource_state.vk_pipeline_stages = node_stages;
715 if (wait_access != VK_ACCESS_NONE || link.vk_image_layout != resource_state.image_layout) {
716 add_image_barrier(
resource.image.vk_image,
719 link.vk_access_flags,
720 resource_state.image_layout,
721 link.vk_image_layout,
722 link.vk_image_aspect,
724 resource_state.image_layout = link.vk_image_layout;
729void VKCommandBuilder::add_image_barrier(VkImage vk_image,
731 VkAccessFlags src_access_mask,
732 VkAccessFlags dst_access_mask,
733 VkImageLayout old_layout,
734 VkImageLayout new_layout,
735 VkImageAspectFlags aspect_mask,
736 const VKSubImageRange &subimage)
738 BLI_assert(aspect_mask != VK_IMAGE_ASPECT_NONE);
739 for (VkImageMemoryBarrier &vk_image_memory_barrier :
740 vk_image_memory_barriers_.as_mutable_span().drop_front(
741 r_barrier.image_memory_barriers.start()))
743 if (vk_image_memory_barrier.image == vk_image) {
747 if ((vk_image_memory_barrier.dstAccessMask & src_access_mask) == src_access_mask) {
748 vk_image_memory_barrier.dstAccessMask |= dst_access_mask;
753 if ((vk_image_memory_barrier.dstAccessMask & dst_access_mask) == dst_access_mask &&
754 (vk_image_memory_barrier.srcAccessMask & src_access_mask) == src_access_mask &&
755 old_layout == new_layout)
762 vk_image_memory_barriers_.append({VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
768 VK_QUEUE_FAMILY_IGNORED,
769 VK_QUEUE_FAMILY_IGNORED,
772 subimage.mipmap_level,
773 subimage.mipmap_count,
775 subimage.layer_count}});
784void VKCommandBuilder::ImageTracker::begin(
const VKRenderGraph &render_graph,
788 tracked_attachments.clear();
791 const VKRenderGraphNodeLinks &links = render_graph.links_[node_handle];
792 for (
const VKRenderGraphLink &link : links.outputs) {
793 VKResourceStateTracker::Resource &
resource = render_graph.resources_.resources_.lookup(
794 link.resource.handle);
795 if (
resource.use_subresource_tracking()) {
796 tracked_attachments.add(
resource.image.vk_image);
801void VKCommandBuilder::ImageTracker::update(VkImage vk_image,
802 const VKSubImageRange &subimage,
803 VkImageLayout old_layout,
804 VkImageLayout new_layout,
807 for (
const SubImageChange &change : changes) {
808 if (change.vk_image == vk_image && ((subimage.layer_count != VK_REMAINING_ARRAY_LAYERS &&
809 change.subimage.layer_base == subimage.layer_base) ||
810 (subimage.mipmap_count != VK_REMAINING_MIP_LEVELS &&
811 change.subimage.mipmap_level != subimage.mipmap_level)))
814 change.vk_image_layout == new_layout,
815 "We don't support more that one change of the same subimage multiple times during a "
823 changes.append({vk_image, new_layout, subimage});
826 r_barrier.src_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
827 r_barrier.dst_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
828 command_builder.add_image_barrier(vk_image,
830 VK_ACCESS_TRANSFER_WRITE_BIT,
831 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
832 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
833 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
834 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
837 VK_IMAGE_ASPECT_COLOR_BIT,
841void VKCommandBuilder::ImageTracker::end(Barrier &r_barrier,
bool use_local_read)
843 suspend(r_barrier, use_local_read);
844 tracked_attachments.clear();
848void VKCommandBuilder::ImageTracker::suspend(Barrier &r_barrier,
bool use_local_read)
851 if (changes.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 SubImageChange &change : changes) {
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 change.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 r_barrier.image_memory_barriers = r_barrier.image_memory_barriers.with_new_end(
877 command_builder.vk_image_memory_barriers_.size());
880 std::cout << __func__ <<
": transition layout image=" << binding.vk_image
881 <<
", layer=" << binding.layer <<
", count=" << binding.layer_count
882 <<
", from_layout=" <<
to_string(binding.vk_image_layout)
883 <<
", to_layout=" <<
to_string(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) <<
"\n";
888void VKCommandBuilder::ImageTracker::resume(Barrier &r_barrier,
bool use_local_read)
890 if (changes.is_empty()) {
894 command_builder.reset_barriers(r_barrier);
896 r_barrier.src_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
897 r_barrier.dst_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
898 int64_t start_index = command_builder.vk_image_memory_barriers_.size();
901 for (
const SubImageChange &change : changes) {
902 command_builder.add_image_barrier(
905 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
906 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
907 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
908 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
909 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
910 VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
911 use_local_read ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR :
912 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
913 change.vk_image_layout,
914 VK_IMAGE_ASPECT_COLOR_BIT,
917 std::cout << __func__ <<
": transition layout image=" << binding.vk_image
918 <<
", layer=" << binding.layer <<
", count=" << binding.layer_count
919 <<
", from_layout=" <<
to_string(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
920 <<
", to_layout=" <<
to_string(binding.vk_image_layout) <<
"\n";
930std::string VKCommandBuilder::to_string_barrier(
const Barrier &barrier)
932 std::stringstream ss;
935 for (
const VkBufferMemoryBarrier &buffer_memory_barrier :
936 vk_buffer_memory_barriers_.as_span().slice(
barrier.buffer_memory_barriers))
940 <<
", vk_buffer=" <<
to_string(buffer_memory_barrier.buffer) <<
"\n";
943 for (
const VkImageMemoryBarrier &image_memory_barrier :
944 vk_image_memory_barriers_.as_span().slice(
barrier.image_memory_barriers))
948 <<
", vk_image=" <<
to_string(image_memory_barrier.image)
949 <<
", old_layout=" <<
to_string(image_memory_barrier.oldLayout)
950 <<
", new_layout=" <<
to_string(image_memory_barrier.newLayout)
951 <<
", 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[]