From 941520d2819e500e89ecffca703935d2cc509297 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 | 22 +++++++++++++++++++ src/qt_common/config/shared_translation.cpp | 4 ++++ .../renderer_vulkan/vk_query_cache.cpp | 5 ++++- .../vk_staging_buffer_pool.cpp | 3 ++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index d5bf9f7660..1f8cf7d309 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -478,6 +478,28 @@ struct Values { "use_reactive_flushing", Category::RendererAdvanced}; + SwitchableSetting fast_gpu_time{linkage, + GpuOverclock::Low, + "fast_gpu_time", + Category::RendererAdvanced, + Specialization::Default, + true, + true, + &use_fast_gpu_time}; + + SwitchableSetting use_vulkan_driver_pipeline_cache{linkage, + true, + "use_vulkan_driver_pipeline_cache", + Category::RendererAdvanced, + Specialization::Default, + true, + true}; + SwitchableSetting enable_compute_pipelines{linkage, false, "enable_compute_pipelines", + 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 163eb57138..aea1dee36f 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -325,6 +325,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 414c270c8e..ba2195734a 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" @@ -543,7 +544,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,