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 ::ImmediateBuffer(size_t wanted_capacity) {
return std::span ::ForceOldUBOMethod() const noexcept {
+ if constexpr (requires(const Runtime& r) { r.ForceOldUniformBufferMethod(); }) {
+ return runtime.ForceOldUniformBufferMethod();
+ }
+ return false;
+}
+
template ::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);