From 6cbb304afc8301846c9d42dd1db84cb0c392846c Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Thu, 17 Jul 2025 15:44:23 +0300 Subject: [PATCH] buffer_cache: Remove per-draw memory barrier There are already barriers on every buffer upload and shader can only read from page table --- src/video_core/buffer_cache/buffer_cache.cpp | 19 ------------------- src/video_core/buffer_cache/buffer_cache.h | 3 --- .../renderer_vulkan/vk_rasterizer.cpp | 1 - 3 files changed, 23 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 42e3c61a5..b5475263a 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -1036,25 +1036,6 @@ void BufferCache::SynchronizeBuffersInRange(VAddr device_addr, u64 size) { }); } -void BufferCache::MemoryBarrier() { - // Vulkan doesn't know which buffer we access in a shader if we use - // BufferDeviceAddress. We need a full memory barrier. - // For now, we only read memory using BDA. If we want to write to it, - // we might need to change this. - scheduler.EndRendering(); - const auto cmdbuf = scheduler.CommandBuffer(); - vk::MemoryBarrier2 barrier = { - .srcStageMask = vk::PipelineStageFlagBits2::eTransfer, - .srcAccessMask = vk::AccessFlagBits2::eMemoryWrite, - .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands, - .dstAccessMask = vk::AccessFlagBits2::eMemoryRead, - }; - cmdbuf.pipelineBarrier2(vk::DependencyInfo{ - .memoryBarrierCount = 1, - .pMemoryBarriers = &barrier, - }); -} - void BufferCache::InlineDataBuffer(Buffer& buffer, VAddr address, const void* value, u32 num_bytes) { scheduler.EndRendering(); diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index b509ce2d0..b552d0b1f 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -159,9 +159,6 @@ public: /// Synchronizes all buffers neede for DMA. void SynchronizeDmaBuffers(); - /// Record memory barrier. Used for buffers when accessed via BDA. - void MemoryBarrier(); - private: template void ForEachBufferInRange(VAddr device_addr, u64 size, Func&& func) { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index c5f894b10..4c7b2e3a1 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -488,7 +488,6 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) { range.upper() - range.lower()); } } - buffer_cache.MemoryBarrier(); } fault_process_pending |= uses_dma;