From f5560deab7b04f4a86d2a4c48952c09f5f8550eb Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sat, 4 Jul 2026 21:41:00 -0400 Subject: [PATCH] [vulkan] Added tracker for reused uploads --- src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 7 +++++-- src/video_core/renderer_vulkan/vk_buffer_cache.h | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 7bc23a5e8b..43d32c2213 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -84,7 +84,7 @@ vk::Buffer CreateBuffer(const Device& device, const MemoryAllocator& memory_allo } // Anonymous namespace Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_params) - : VideoCommon::BufferBase(null_params), tracker{4096} { + : VideoCommon::BufferBase(null_params), scheduler{&runtime.scheduler}, tracker{4096} { if (runtime.device.HasNullDescriptor()) { return; } @@ -95,6 +95,7 @@ Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_p Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_) : VideoCommon::BufferBase(cpu_addr_, size_bytes_), device{&runtime.device}, + scheduler{&runtime.scheduler}, buffer{CreateBuffer(*device, runtime.memory_allocator, SizeBytes())}, tracker{SizeBytes()} { if (runtime.device.HasDebuggingToolAttached()) { buffer.SetObjectNameEXT(fmt::format("Buffer 0x{:x}", CpuAddr()).c_str()); @@ -384,7 +385,9 @@ u32 BufferCacheRuntime::GetStorageBufferAlignment() const { void BufferCacheRuntime::TickFrame(Common::SlotVector& slot_buffers) noexcept { for (auto it = slot_buffers.begin(); it != slot_buffers.end(); it++) { - it->ResetUsageTracking(); + if (scheduler.IsFree(it->LastUsageTick())) { + it->ResetUsageTracking(); + } } } diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 6a4f720231..f0ec5399b1 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -45,12 +45,17 @@ public: void MarkUsage(u64 offset, u64 size) noexcept { tracker.Track(offset, size); + last_usage_tick = scheduler->CurrentTick(); } void ResetUsageTracking() noexcept { tracker.Reset(); } + [[nodiscard]] u64 LastUsageTick() const noexcept { + return last_usage_tick; + } + operator VkBuffer() const noexcept { return *buffer; } @@ -64,9 +69,11 @@ private: }; const Device* device{}; + Scheduler* scheduler{}; vk::Buffer buffer; std::vector views; VideoCommon::UsageTracker tracker; + u64 last_usage_tick{}; bool is_null{}; };