@@ -536,10 +536,11 @@ static uint32_t deduce_acquire_release_family_index(Device &device, const Image
536
536
return family;
537
537
}
538
538
539
- void CommandBuffer::release_external_image_barrier (
539
+ void CommandBuffer::release_image_barrier (
540
540
const Image &image,
541
541
VkImageLayout old_layout, VkImageLayout new_layout,
542
- VkPipelineStageFlags2 src_stage, VkAccessFlags2 src_access)
542
+ VkPipelineStageFlags2 src_stage, VkAccessFlags2 src_access,
543
+ uint32_t dst_queue_family)
543
544
{
544
545
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
545
546
uint32_t family_index = device->get_queue_info ().family_indices [device->get_physical_queue_type (type)];
@@ -552,19 +553,21 @@ void CommandBuffer::release_external_image_barrier(
552
553
};
553
554
barrier.oldLayout = old_layout;
554
555
barrier.newLayout = new_layout;
555
- barrier.srcAccessMask = src_access;
556
556
557
557
barrier.srcQueueFamilyIndex = deduce_acquire_release_family_index (*device, image, family_index);
558
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_EXTERNAL;
558
+ barrier.dstQueueFamilyIndex = dst_queue_family;
559
+
560
+ barrier.srcAccessMask = src_access;
559
561
barrier.srcStageMask = src_stage;
560
562
561
563
image_barriers (1 , &barrier);
562
564
}
563
565
564
- void CommandBuffer::acquire_external_image_barrier (
566
+ void CommandBuffer::acquire_image_barrier (
565
567
const Image &image,
566
568
VkImageLayout old_layout, VkImageLayout new_layout,
567
- VkPipelineStageFlags2 dst_stage, VkAccessFlags2 dst_access)
569
+ VkPipelineStageFlags2 dst_stage, VkAccessFlags2 dst_access,
570
+ uint32_t src_queue_family)
568
571
{
569
572
VkImageMemoryBarrier2 b = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
570
573
uint32_t family_index = device->get_queue_info ().family_indices [device->get_physical_queue_type (type)];
@@ -577,90 +580,43 @@ void CommandBuffer::acquire_external_image_barrier(
577
580
};
578
581
b.oldLayout = old_layout;
579
582
b.newLayout = new_layout;
580
- b.dstAccessMask = dst_access;
581
- b.srcQueueFamilyIndex = VK_QUEUE_FAMILY_EXTERNAL;
583
+ b.srcQueueFamilyIndex = src_queue_family;
582
584
b.dstQueueFamilyIndex = deduce_acquire_release_family_index (*device, image, family_index);
583
- b. srcStageMask = VK_PIPELINE_STAGE_NONE;
585
+
584
586
b.dstStageMask = dst_stage;
587
+ b.dstAccessMask = dst_access;
588
+
585
589
image_barriers (1 , &b);
586
590
}
587
591
588
- void CommandBuffer::release_external_buffer_barrier (
592
+ void CommandBuffer::release_buffer_barrier (
589
593
const Buffer &buffer,
590
- VkPipelineStageFlags2 src_stage, VkAccessFlags2 src_access)
594
+ VkPipelineStageFlags2 src_stage, VkAccessFlags2 src_access,
595
+ uint32_t dst_queue_family)
591
596
{
592
597
VkBufferMemoryBarrier2 b = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 };
593
598
b.buffer = buffer.get_buffer ();
594
599
b.size = buffer.get_create_info ().size ;
595
- b.srcAccessMask = src_access;
596
600
b.srcQueueFamilyIndex = deduce_acquire_release_family_index (*device);
597
- b.dstQueueFamilyIndex = VK_QUEUE_FAMILY_EXTERNAL ;
601
+ b.dstQueueFamilyIndex = dst_queue_family ;
598
602
b.srcStageMask = src_stage;
599
- b.dstStageMask = VK_PIPELINE_STAGE_NONE ;
603
+ b.srcAccessMask = src_access ;
600
604
buffer_barriers (1 , &b);
601
605
}
602
606
603
- void CommandBuffer::acquire_external_buffer_barrier (
607
+ void CommandBuffer::acquire_buffer_barrier (
604
608
const Buffer &buffer,
605
- VkPipelineStageFlags2 dst_stage, VkAccessFlags2 dst_access)
609
+ VkPipelineStageFlags2 dst_stage, VkAccessFlags2 dst_access,
610
+ uint32_t src_queue_family)
606
611
{
607
612
VkBufferMemoryBarrier2 b = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 };
608
613
b.buffer = buffer.get_buffer ();
609
614
b.size = buffer.get_create_info ().size ;
610
- b.dstAccessMask = dst_access;
611
- b.srcQueueFamilyIndex = VK_QUEUE_FAMILY_EXTERNAL;
615
+ b.srcQueueFamilyIndex = src_queue_family;
612
616
b.dstQueueFamilyIndex = deduce_acquire_release_family_index (*device);
613
- b.srcStageMask = VK_PIPELINE_STAGE_NONE;
614
617
b.dstStageMask = dst_stage;
615
- buffer_barriers (1 , &b);
616
- }
617
-
618
- void CommandBuffer::image_barrier_acquire (const Vulkan::Image &image,
619
- VkImageLayout old_layout, VkImageLayout new_layout,
620
- uint32_t src_queue_family,
621
- VkPipelineStageFlags2 dst_stage, VkAccessFlags2 dst_access)
622
- {
623
- VK_ASSERT (!actual_render_pass);
624
- VK_ASSERT (!framebuffer);
625
- VK_ASSERT (image.get_create_info ().domain != ImageDomain::Transient);
626
-
627
- VkImageMemoryBarrier2 b = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
628
- b.oldLayout = old_layout;
629
- b.newLayout = new_layout;
630
- b.image = image.get_image ();
631
- b.subresourceRange .aspectMask = format_to_aspect_mask (image.get_create_info ().format );
632
- b.subresourceRange .levelCount = image.get_create_info ().levels ;
633
- b.subresourceRange .layerCount = image.get_create_info ().layers ;
634
- b.srcQueueFamilyIndex = src_queue_family;
635
- b.dstQueueFamilyIndex = device->get_queue_info ().family_indices [device->get_physical_queue_type (type)];
636
618
b.dstAccessMask = dst_access;
637
- b.dstStageMask = dst_stage;
638
-
639
- image_barriers (1 , &b);
640
- }
641
-
642
- void CommandBuffer::image_barrier_release (const Vulkan::Image &image,
643
- VkImageLayout old_layout, VkImageLayout new_layout,
644
- VkPipelineStageFlags2 src_stage, VkAccessFlags2 src_access,
645
- uint32_t dst_queue_family)
646
- {
647
- VK_ASSERT (!actual_render_pass);
648
- VK_ASSERT (!framebuffer);
649
- VK_ASSERT (image.get_create_info ().domain != ImageDomain::Transient);
650
-
651
- VkImageMemoryBarrier2 b = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
652
- b.oldLayout = old_layout;
653
- b.newLayout = new_layout;
654
- b.image = image.get_image ();
655
- b.subresourceRange .aspectMask = format_to_aspect_mask (image.get_create_info ().format );
656
- b.subresourceRange .levelCount = image.get_create_info ().levels ;
657
- b.subresourceRange .layerCount = image.get_create_info ().layers ;
658
- b.srcQueueFamilyIndex = device->get_queue_info ().family_indices [device->get_physical_queue_type (type)];
659
- b.dstQueueFamilyIndex = dst_queue_family;
660
- b.srcAccessMask = src_access;
661
- b.srcStageMask = src_stage;
662
-
663
- image_barriers (1 , &b);
619
+ buffer_barriers (1 , &b);
664
620
}
665
621
666
622
void CommandBuffer::image_barrier (const Image &image,
0 commit comments