From 07cc8de8686efcae0ac25169d67a04791fc1b540 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 3 Dec 2025 00:09:26 -0400 Subject: [PATCH] [vk, qcom] TimelineSemaphore syncs to GPUTick. --- src/video_core/renderer_opengl/gl_fence_manager.h | 3 +++ src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 5 ++--- .../renderer_vulkan/vk_staging_buffer_pool.cpp | 1 + src/video_core/vulkan_common/vulkan_device.cpp | 10 ++++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_fence_manager.h b/src/video_core/renderer_opengl/gl_fence_manager.h index 26622c396f..696e03ae36 100644 --- a/src/video_core/renderer_opengl/gl_fence_manager.h +++ b/src/video_core/renderer_opengl/gl_fence_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 668dad397b..babb41243f 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -361,9 +361,8 @@ size_t GetTotalPipelineWorkers() { const size_t max_core_threads = std::max(static_cast(std::thread::hardware_concurrency()), 2ULL) - 1ULL; #ifdef ANDROID - // Leave at least one core free on Android. Previously we reserved two, but - // shipping builds benefit from one extra compilation worker. - constexpr size_t free_cores = 1ULL; + // Leave at least two cores free on Android to reduce thermal pressure. + constexpr size_t free_cores = 2ULL; if (max_core_threads <= free_cores) { return 1ULL; } 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 b6676041db..492df8867f 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -147,6 +147,7 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { } bool StagingBufferPool::AreRegionsActive(size_t region_begin, size_t region_end) const { + scheduler.GetMasterSemaphore().Refresh(); const u64 gpu_tick = scheduler.GetMasterSemaphore().KnownGpuTick(); return std::any_of(sync_ticks.begin() + region_begin, sync_ticks.begin() + region_end, [gpu_tick](u64 sync_tick) { return gpu_tick < sync_tick; }); diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 5db1f72344..32596dc656 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -938,6 +938,16 @@ bool Device::HasTimelineSemaphore() const { if (GetDriverID() == VK_DRIVER_ID_MESA_TURNIP) { return false; } + + if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY) { + // Drop the variant bits before comparing to the minimum supported timeline build. + const u32 driver_version = (GetDriverVersion() << 3) >> 3; + constexpr u32 min_timeline_driver = VK_MAKE_API_VERSION(0, 500, 800, 51); + if (driver_version < min_timeline_driver) { + // Older Qualcomm stacks still need binary fences for stability. + return false; + } + } return features.timeline_semaphore.timelineSemaphore; }