From 68839943b34888a9840822347712c6dfed183ee8 Mon Sep 17 00:00:00 2001 From: Ribbit Date: Fri, 10 Oct 2025 22:08:44 -0700 Subject: [PATCH] [vk] Fix stock qualcomm driver regression --- src/video_core/buffer_cache/buffer_cache.h | 18 ++++++++++++++++-- .../buffer_cache/buffer_cache_base.h | 2 ++ .../renderer_vulkan/vk_buffer_cache.h | 4 ++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 9eaa322c9c..c47db2a0eb 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -790,9 +790,10 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 const Binding& binding = channel_state->uniform_buffers[stage][index]; const DAddr device_addr = binding.device_addr; const u32 size = (std::min)(binding.size, (*channel_state->uniform_buffer_sizes)[stage][index]); + const bool force_old_ubo = ForceOldUBOMethod(); Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); - const bool use_fast_buffer = binding.buffer_id != NULL_BUFFER_ID && + const bool use_fast_buffer = !force_old_ubo && binding.buffer_id != NULL_BUFFER_ID && size <= channel_state->uniform_buffer_skip_cache_size && !memory_tracker.IsRegionGpuModified(device_addr, size); if (use_fast_buffer) { @@ -848,7 +849,9 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 } else { runtime.BindUniformBuffer(buffer, offset, size); } - channel_state->fast_bound_uniform_buffers[stage] &= ~(1u << binding_index); + if (!force_old_ubo) { + channel_state->fast_bound_uniform_buffers[stage] &= ~(1u << binding_index); + } } template @@ -1781,8 +1784,19 @@ std::span BufferCache

::ImmediateBuffer(size_t wanted_capacity) { return std::span(immediate_buffer_alloc.data(), wanted_capacity); } +template +bool BufferCache

::ForceOldUBOMethod() const noexcept { + if constexpr (requires(const Runtime& r) { r.ForceOldUniformBufferMethod(); }) { + return runtime.ForceOldUniformBufferMethod(); + } + return false; +} + template bool BufferCache

::HasFastUniformBufferBound(size_t stage, u32 binding_index) const noexcept { + if (ForceOldUBOMethod()) { + return false; + } return ((channel_state->fast_bound_uniform_buffers[stage] >> binding_index) & 1u) != 0; } diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 1b551931a4..722930fe3e 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -449,6 +449,8 @@ private: [[nodiscard]] bool HasFastUniformBufferBound(size_t stage, u32 binding_index) const noexcept; + [[nodiscard]] bool ForceOldUBOMethod() const noexcept; + void ClearDownload(DAddr base_addr, u64 size); void InlineMemoryImplementation(DAddr dest_address, size_t copy_size, diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 86bce01596..b3a41d1149 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -94,6 +94,10 @@ public: bool CanReportMemoryUsage() const; + [[nodiscard]] bool ForceOldUniformBufferMethod() const noexcept { + return device.GetDriverID() == VK_DRIVER_ID_QUALCOMM_PROPRIETARY; + } + u32 GetStorageBufferAlignment() const; [[nodiscard]] StagingBufferRef UploadStagingBuffer(size_t size);