InitializeTranslations(QObject* parent) {
INSERT(Settings, enable_buffer_history, tr("Enable buffer history"),
tr("Enables access to previous buffer states.\nThis option may improve rendering "
"quality and performance consistency in some games."));
+ INSERT(Settings, enable_multi_range_storage, tr("Multi-range storage buffers"),
+ tr("toggle for test on multi-range."));
+ INSERT(Settings, enable_sparse_buffer_binding, tr("Sparse buffer binding"),
+ tr("toggle for test on sparse buffer binding."));
INSERT(Settings, fix_bloom_effects, tr("Fix bloom effects"), tr("Removes bloom in Burnout."));
INSERT(Settings, rescale_hack, tr("Enable Legacy Rescale Pass"),
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index e1689390c0..dd99a4facd 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -114,7 +114,12 @@ void BufferCache::TickFrame() {
template
void BufferCache::UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size) {
- virtual_ranges.Unmap(as_id, gpu_addr, size);
+ if constexpr (requires { runtime.SupportsMultiRange(); }) {
+ if (!runtime.SupportsMultiRange()) {
+ return;
+ }
+ virtual_ranges.Unmap(as_id, gpu_addr, size);
+ }
}
template
@@ -1009,6 +1014,9 @@ void BufferCache::ResolveMultiRangeStorage(Binding& binding, bool is_written,
binding.segment_first = 0;
binding.segment_count = 0;
if constexpr (requires { runtime.BindMultiRangeStorageBuffer(u64{}); }) {
+ if (!runtime.SupportsMultiRange()) {
+ return;
+ }
if (binding.gpu_addr == 0 || binding.size == 0) {
return;
}
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h
index e9b162fb0f..203da3f43d 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.h
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h
@@ -175,6 +175,10 @@ public:
return multi_range_buffers.BlockSize();
}
+ [[nodiscard]] bool SupportsMultiRange() const noexcept {
+ return Settings::values.enable_multi_range_storage.GetValue();
+ }
+
[[nodiscard]] bool PrefersSparseSources() const noexcept {
return multi_range_buffers.UsesSparse();
}
diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp
index 79086c4244..6386e2661a 100644
--- a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp
+++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp
@@ -94,7 +94,7 @@ u64 MultiRangeBufferCache::HashSources(std::span sources
}
bool MultiRangeBufferCache::CanBindSparse(std::span sources) const {
- if (!use_sparse) {
+ if (!UsesSparse()) {
return false;
}
for (const MultiRangeSource& source : sources) {
diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.h b/src/video_core/renderer_vulkan/vk_multi_range_buffer.h
index 6c9b738876..d64d1f2fa7 100644
--- a/src/video_core/renderer_vulkan/vk_multi_range_buffer.h
+++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.h
@@ -8,6 +8,7 @@
#include
#include "common/common_types.h"
+#include "common/settings.h"
#include "video_core/vulkan_common/vulkan_memory_allocator.h"
#include "video_core/vulkan_common/vulkan_wrapper.h"
@@ -44,7 +45,7 @@ public:
MultiRangeBufferCache& operator=(const MultiRangeBufferCache&) = delete;
[[nodiscard]] bool UsesSparse() const noexcept {
- return use_sparse;
+ return use_sparse && Settings::values.enable_sparse_buffer_binding.GetValue();
}
[[nodiscard]] VkDeviceSize BlockSize() const noexcept {