From 6c55017480ef6dc4f79d8318da03b55ac3ab7fa4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 29 Nov 2025 04:13:04 +0000 Subject: [PATCH] [vk] Add option to force smaller buffers This can fix some games which run out of memory (Smash bros ultimate with 6 G&W) due to recent VMA changes Signed-off-by: lizzie --- src/common/settings.h | 2 ++ src/qt_common/config/shared_translation.cpp | 4 ++++ src/video_core/renderer_vulkan/vk_query_cache.cpp | 5 ++++- src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 674813452e..e8f3e6984a 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -525,6 +525,8 @@ struct Values { Category::RendererAdvanced}; SwitchableSetting use_video_framerate{linkage, false, "use_video_framerate", Category::RendererAdvanced}; + SwitchableSetting force_smaller_buffers{linkage, false, "force_smaller_buffers", + Category::RendererAdvanced}; SwitchableSetting barrier_feedback_loops{linkage, true, "barrier_feedback_loops", Category::RendererAdvanced}; diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index c601d25d80..99be602c55 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -319,6 +319,10 @@ std::unique_ptr InitializeTranslations(QObject* parent) tr("Sync to framerate of video playback"), tr("Run the game at normal speed during video playback, even when the framerate is " "unlocked.")); + INSERT(Settings, + force_smaller_buffers, + tr("Force smaller buffers"), + tr("Forces buffers to be smaller, may cause reads/writes out of bounds for some games but can fix Out-of-memory errors.")); INSERT(Settings, barrier_feedback_loops, tr("Barrier feedback loops"), diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 89e0b1114e..923502c4cd 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -15,6 +15,7 @@ #include #include "video_core/renderer_vulkan/vk_texture_cache.h" #include "common/bit_util.h" +#include "common/settings.h" #include "common/common_types.h" #include "video_core/engines/draw_manager.h" #include "video_core/host1x/gpu_device_memory_manager.h" @@ -556,7 +557,9 @@ private: .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = nullptr, .flags = 0, - .size = SamplesQueryBank::QUERY_SIZE * (1ULL << log_2), + .size = ::Settings::values.force_smaller_buffers.GetValue() + ? (SamplesQueryBank::QUERY_SIZE * (1ULL << log_2)) + : (SamplesQueryBank::QUERY_SIZE * num_needed), .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, 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 08513d1534..0ae9873424 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -14,6 +14,7 @@ #include "common/assert.h" #include "common/bit_util.h" #include "common/common_types.h" +#include "common/settings.h" #include "common/literals.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" @@ -186,7 +187,7 @@ StagingBufferRef StagingBufferPool::CreateStagingBuffer(size_t size, MemoryUsage .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = nullptr, .flags = 0, - .size = 1ULL << log2, + .size = ::Settings::values.force_smaller_buffers.GetValue() ? size : (1ULL << log2), .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,