@@ -259,7 +259,16 @@ void BufferCache::InlineData(VAddr address, const void* value, u32 num_bytes, bo
259
259
const BufferId buffer_id = FindBuffer (address, num_bytes);
260
260
return &slot_buffers[buffer_id];
261
261
}();
262
- const vk::BufferMemoryBarrier2 buf_barrier = {
262
+ const vk::BufferMemoryBarrier2 pre_barrier = {
263
+ .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands,
264
+ .srcAccessMask = vk::AccessFlagBits2::eMemoryRead,
265
+ .dstStageMask = vk::PipelineStageFlagBits2::eTransfer,
266
+ .dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
267
+ .buffer = buffer->Handle (),
268
+ .offset = buffer->Offset (address),
269
+ .size = num_bytes,
270
+ };
271
+ const vk::BufferMemoryBarrier2 post_barrier = {
263
272
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
264
273
.srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
265
274
.dstStageMask = vk::PipelineStageFlagBits2::eAllCommands,
@@ -271,9 +280,14 @@ void BufferCache::InlineData(VAddr address, const void* value, u32 num_bytes, bo
271
280
cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
272
281
.dependencyFlags = vk::DependencyFlagBits::eByRegion,
273
282
.bufferMemoryBarrierCount = 1 ,
274
- .pBufferMemoryBarriers = &buf_barrier,
283
+ .pBufferMemoryBarriers = &pre_barrier,
284
+ });
285
+ cmdbuf.updateBuffer (buffer->Handle (), buffer->Offset (address), num_bytes, value);
286
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
287
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
288
+ .bufferMemoryBarrierCount = 1 ,
289
+ .pBufferMemoryBarriers = &post_barrier,
275
290
});
276
- cmdbuf.updateBuffer (buffer->Handle (), buf_barrier.offset , num_bytes, value);
277
291
}
278
292
279
293
std::pair<Buffer*, u32 > BufferCache::ObtainHostUBO (std::span<const u32 > data) {
@@ -465,21 +479,48 @@ void BufferCache::JoinOverlap(BufferId new_buffer_id, BufferId overlap_id,
465
479
};
466
480
scheduler.EndRendering ();
467
481
const auto cmdbuf = scheduler.CommandBuffer ();
468
- static constexpr vk::MemoryBarrier READ_BARRIER{
469
- .srcAccessMask = vk::AccessFlagBits::eMemoryWrite,
470
- .dstAccessMask = vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eTransferWrite,
482
+ const std::array pre_barriers = {
483
+ vk::BufferMemoryBarrier2{
484
+ .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands,
485
+ .srcAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite,
486
+ .dstStageMask = vk::PipelineStageFlagBits2::eTransfer,
487
+ .dstAccessMask = vk::AccessFlagBits2::eTransferRead,
488
+ .buffer = overlap.Handle (),
489
+ .offset = 0 ,
490
+ .size = overlap.SizeBytes (),
491
+ },
471
492
};
472
- static constexpr vk::MemoryBarrier WRITE_BARRIER{
473
- .srcAccessMask = vk::AccessFlagBits::eTransferWrite,
474
- .dstAccessMask = vk::AccessFlagBits::eMemoryRead | vk::AccessFlagBits::eMemoryWrite,
493
+ const std::array post_barriers = {
494
+ vk::BufferMemoryBarrier2{
495
+ .srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
496
+ .srcAccessMask = vk::AccessFlagBits2::eTransferRead,
497
+ .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands,
498
+ .dstAccessMask = vk::AccessFlagBits2::eMemoryWrite,
499
+ .buffer = overlap.Handle (),
500
+ .offset = 0 ,
501
+ .size = overlap.SizeBytes (),
502
+ },
503
+ vk::BufferMemoryBarrier2{
504
+ .srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
505
+ .srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
506
+ .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands,
507
+ .dstAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite,
508
+ .buffer = new_buffer.Handle (),
509
+ .offset = dst_base_offset,
510
+ .size = overlap.SizeBytes (),
511
+ },
475
512
};
476
- cmdbuf.pipelineBarrier (vk::PipelineStageFlagBits::eAllCommands,
477
- vk::PipelineStageFlagBits::eTransfer, vk::DependencyFlagBits::eByRegion,
478
- READ_BARRIER, {}, {});
479
- cmdbuf.copyBuffer (overlap.buffer , new_buffer.buffer , copy);
480
- cmdbuf.pipelineBarrier (vk::PipelineStageFlagBits::eTransfer,
481
- vk::PipelineStageFlagBits::eAllCommands,
482
- vk::DependencyFlagBits::eByRegion, WRITE_BARRIER, {}, {});
513
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
514
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
515
+ .bufferMemoryBarrierCount = 1 ,
516
+ .pBufferMemoryBarriers = pre_barriers.data (),
517
+ });
518
+ cmdbuf.copyBuffer (overlap.Handle (), new_buffer.Handle (), copy);
519
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
520
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
521
+ .bufferMemoryBarrierCount = static_cast <u32 >(post_barriers.size ()),
522
+ .pBufferMemoryBarriers = post_barriers.data (),
523
+ });
483
524
DeleteBuffer (overlap_id);
484
525
}
485
526
@@ -583,21 +624,35 @@ void BufferCache::SynchronizeBuffer(Buffer& buffer, VAddr device_addr, u32 size,
583
624
}
584
625
scheduler.EndRendering ();
585
626
const auto cmdbuf = scheduler.CommandBuffer ();
586
- static constexpr vk::MemoryBarrier READ_BARRIER{
587
- .srcAccessMask = vk::AccessFlagBits::eMemoryWrite,
588
- .dstAccessMask = vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eTransferWrite,
627
+ const vk::BufferMemoryBarrier2 pre_barrier = {
628
+ .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands,
629
+ .srcAccessMask = vk::AccessFlagBits2::eMemoryRead,
630
+ .dstStageMask = vk::PipelineStageFlagBits2::eTransfer,
631
+ .dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
632
+ .buffer = buffer.Handle (),
633
+ .offset = 0 ,
634
+ .size = buffer.SizeBytes (),
589
635
};
590
- static constexpr vk::MemoryBarrier WRITE_BARRIER{
591
- .srcAccessMask = vk::AccessFlagBits::eTransferWrite,
592
- .dstAccessMask = vk::AccessFlagBits::eMemoryRead | vk::AccessFlagBits::eMemoryWrite,
636
+ const vk::BufferMemoryBarrier2 post_barrier = {
637
+ .srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
638
+ .srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
639
+ .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands,
640
+ .dstAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite,
641
+ .buffer = buffer.Handle (),
642
+ .offset = 0 ,
643
+ .size = buffer.SizeBytes (),
593
644
};
594
- cmdbuf.pipelineBarrier (vk::PipelineStageFlagBits::eAllCommands,
595
- vk::PipelineStageFlagBits::eTransfer, vk::DependencyFlagBits::eByRegion,
596
- READ_BARRIER, {}, {});
645
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
646
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
647
+ .bufferMemoryBarrierCount = 1 ,
648
+ .pBufferMemoryBarriers = &pre_barrier,
649
+ });
597
650
cmdbuf.copyBuffer (src_buffer, buffer.buffer , copies);
598
- cmdbuf.pipelineBarrier (vk::PipelineStageFlagBits::eTransfer,
599
- vk::PipelineStageFlagBits::eAllCommands,
600
- vk::DependencyFlagBits::eByRegion, WRITE_BARRIER, {}, {});
651
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
652
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
653
+ .bufferMemoryBarrierCount = 1 ,
654
+ .pBufferMemoryBarriers = &post_barrier,
655
+ });
601
656
}
602
657
603
658
bool BufferCache::SynchronizeBufferFromImage (Buffer& buffer, VAddr device_addr, u32 size) {
@@ -647,10 +702,42 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
647
702
}
648
703
if (!copies.empty ()) {
649
704
scheduler.EndRendering ();
650
- image.Transit (vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {});
705
+ const vk::BufferMemoryBarrier2 pre_barrier = {
706
+ .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands,
707
+ .srcAccessMask = vk::AccessFlagBits2::eMemoryRead,
708
+ .dstStageMask = vk::PipelineStageFlagBits2::eTransfer,
709
+ .dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
710
+ .buffer = buffer.Handle (),
711
+ .offset = max_offset - size,
712
+ .size = size,
713
+ };
714
+ const vk::BufferMemoryBarrier2 post_barrier = {
715
+ .srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
716
+ .srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
717
+ .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands,
718
+ .dstAccessMask = vk::AccessFlagBits2::eMemoryRead,
719
+ .buffer = buffer.Handle (),
720
+ .offset = max_offset - size,
721
+ .size = size,
722
+ };
723
+ auto barriers = image.GetBarriers (vk::ImageLayout::eTransferSrcOptimal,
724
+ vk::AccessFlagBits2::eTransferRead,
725
+ vk::PipelineStageFlagBits2::eTransfer, {});
651
726
const auto cmdbuf = scheduler.CommandBuffer ();
652
- cmdbuf.copyImageToBuffer (image.image , vk::ImageLayout::eTransferSrcOptimal, buffer.buffer ,
727
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
728
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
729
+ .bufferMemoryBarrierCount = 1 ,
730
+ .pBufferMemoryBarriers = &pre_barrier,
731
+ .imageMemoryBarrierCount = static_cast <u32 >(barriers.size ()),
732
+ .pImageMemoryBarriers = barriers.data (),
733
+ });
734
+ cmdbuf.copyImageToBuffer (image.image , vk::ImageLayout::eTransferSrcOptimal, buffer.Handle (),
653
735
copies);
736
+ cmdbuf.pipelineBarrier2 (vk::DependencyInfo{
737
+ .dependencyFlags = vk::DependencyFlagBits::eByRegion,
738
+ .bufferMemoryBarrierCount = 1 ,
739
+ .pBufferMemoryBarriers = &post_barrier,
740
+ });
654
741
}
655
742
return true ;
656
743
}
0 commit comments