From b1f3b568fbbcb41e3fbe3f86f3ba039f050efb15 Mon Sep 17 00:00:00 2001 From: Shinmegumi Date: Sat, 26 Jul 2025 18:12:54 +0200 Subject: [vk] Fix query cache leak on missed sync (#131) Provided by community member, elementary-particle. Submitted as PR by MaranBR. Fixed issues: 1. The queue cache forgot to put the host query into unregister queue if they weren't synced. This will block all the banks from freeing causing a major leak. 2. SamplesQueryCounter is not aligned with renderpass begin/end. This creates invalid queries. 3. Conditional rendering is not turned on/off at the correct location making them invalid. Co-authored-by: Maufeat Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/131 Co-authored-by: Shinmegumi Co-committed-by: Shinmegumi --- src/video_core/renderer_vulkan/vk_scheduler.cpp | 27 ++++++++----------------- 1 file changed, 8 insertions(+), 19 deletions(-) (limited to 'src/video_core/renderer_vulkan/vk_scheduler.cpp') diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 146923db4d..7c556588b6 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -257,16 +260,6 @@ u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_se void Scheduler::AllocateNewContext() { // Enable counters once again. These are disabled when a command buffer is finished. - if (query_cache) { -#if ANDROID - if (Settings::IsGPULevelHigh()) { - // This is problematic on Android, disable on GPU Normal. - query_cache->NotifySegment(true); - } -#else - query_cache->NotifySegment(true); -#endif - } } void Scheduler::InvalidateState() { @@ -276,15 +269,7 @@ void Scheduler::InvalidateState() { } void Scheduler::EndPendingOperations() { -#if ANDROID - if (Settings::IsGPULevelHigh()) { - // This is problematic on Android, disable on GPU Normal. - // query_cache->DisableStreams(); - } -#else - // query_cache->DisableStreams(); -#endif - query_cache->NotifySegment(false); + query_cache->CounterReset(VideoCommon::QueryType::ZPassPixelCount64); EndRenderPass(); } @@ -292,6 +277,10 @@ void Scheduler::EndRenderPass() { if (!state.renderpass) { return; } + + query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false); + query_cache->NotifySegment(false); + Record([num_images = num_renderpass_images, images = renderpass_images, ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) { std::array barriers; -- cgit v1.2.3