From 790f78e0ec309a4100260b11c57c08fb8415aa31 Mon Sep 17 00:00:00 2001 From: Ribbit Date: Wed, 8 Oct 2025 21:23:22 -0700 Subject: [PATCH] last hope --- src/video_core/renderer_vulkan/vk_buffer_cache.h | 8 ++++---- src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 1 + src/video_core/renderer_vulkan/vk_staging_buffer_pool.h | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 784e1f7c5c..c03cbd958b 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -127,7 +127,7 @@ public: std::span BindMappedUniformBuffer([[maybe_unused]] size_t stage, [[maybe_unused]] u32 binding_index, u32 size) { const StagingBufferRef ref = staging_pool.Request(size, MemoryUsage::Upload); - BindBuffer(ref.buffer, static_cast(ref.offset), size); + BindBuffer(ref.buffer, ref.offset, static_cast(size)); #ifdef YUZU_DEBUG ASSERT(ref.mapped_span.size() >= size); const VkDeviceSize ubo_align = device.GetUniformBufferAlignment(); @@ -136,7 +136,7 @@ public: return ref.mapped_span; } - void BindUniformBuffer(VkBuffer buffer, u32 offset, u32 size) { + void BindUniformBuffer(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size) { #ifdef YUZU_DEBUG const VkDeviceSize ubo_align = device.GetUniformBufferAlignment(); ASSERT(ubo_align == 0 || (offset % ubo_align) == 0); @@ -144,7 +144,7 @@ public: BindBuffer(buffer, offset, size); } - void BindStorageBuffer(VkBuffer buffer, u32 offset, u32 size, + void BindStorageBuffer(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, [[maybe_unused]] bool is_written) { #ifdef YUZU_DEBUG const VkDeviceSize ssbo_align = device.GetStorageBufferAlignment(); @@ -163,7 +163,7 @@ public: } private: - void BindBuffer(VkBuffer buffer, u32 offset, u32 size) { + void BindBuffer(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size) { guest_descriptor_queue.AddBuffer(buffer, offset, size); } diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index 88da60b190..2980957696 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -194,6 +194,7 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { .owner = &stream_buffer, .atom_size = non_coherent_atom_size, .is_coherent = stream_is_coherent, + .is_stream_ring = true, }; } diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h index 8bd325c51f..6f9d2d1151 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h @@ -32,9 +32,10 @@ struct StagingBufferRef { const vk::Buffer* owner = nullptr; VkDeviceSize atom_size = 1; bool is_coherent = true; + bool is_stream_ring = false; void FlushRange(VkDeviceSize range_offset, VkDeviceSize size) const { - if (!owner || is_coherent || size == 0) { + if (!owner || is_coherent || size == 0 || is_stream_ring) { return; } if (size == VK_WHOLE_SIZE) { @@ -53,7 +54,7 @@ struct StagingBufferRef { } void InvalidateRange(VkDeviceSize range_offset, VkDeviceSize size) const { - if (!owner || is_coherent || size == 0) { + if (!owner || is_coherent || size == 0 || is_stream_ring) { return; } if (size == VK_WHOLE_SIZE) { @@ -119,6 +120,7 @@ private: .owner = buffer.get(), .atom_size = atom_size, .is_coherent = is_coherent, + .is_stream_ring = false, }; } };