diff --git a/src/citron/configuration/shared_translation.cpp b/src/citron/configuration/shared_translation.cpp index 819a6a3bc..0fa823e1d 100644 --- a/src/citron/configuration/shared_translation.cpp +++ b/src/citron/configuration/shared_translation.cpp @@ -230,6 +230,10 @@ std::unique_ptr InitializeTranslations(QWidget* parent) { "unlocked.")); INSERT(Settings, barrier_feedback_loops, tr("Barrier feedback loops"), tr("Improves rendering of transparency effects in specific games.")); + INSERT(Settings, use_conditional_rendering, tr("Use conditional rendering"), + tr("Enables conditional rendering based on query results.\n" + "Disabling this can fix flickering objects in some games but may impact performance.\n" + "Try disabling if you see objects appearing and disappearing rapidly.")); // Renderer (Debug) diff --git a/src/common/settings.h b/src/common/settings.h index d55de5990..da8ae09db 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -469,6 +469,8 @@ struct Values { Category::RendererAdvanced}; SwitchableSetting barrier_feedback_loops{linkage, true, "barrier_feedback_loops", Category::RendererAdvanced}; + SwitchableSetting use_conditional_rendering{linkage, true, "use_conditional_rendering", + Category::RendererAdvanced}; Setting renderer_debug{linkage, false, "debug", Category::RendererDebug}; Setting renderer_shader_feedback{linkage, false, "shader_feedback", diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 9d5ec7a08..b215e9f06 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -1290,6 +1291,9 @@ void QueryCacheRuntime::EndHostConditionalRendering() { } void QueryCacheRuntime::PauseHostConditionalRendering() { + if (!Settings::values.use_conditional_rendering.GetValue()) [[unlikely]] { + return; + } if (!impl->hcr_is_set) { return; } @@ -1301,6 +1305,9 @@ void QueryCacheRuntime::PauseHostConditionalRendering() { } void QueryCacheRuntime::ResumeHostConditionalRendering() { + if (!Settings::values.use_conditional_rendering.GetValue()) [[unlikely]] { + return; + } if (!impl->hcr_is_set) { return; } @@ -1314,6 +1321,12 @@ void QueryCacheRuntime::ResumeHostConditionalRendering() { void QueryCacheRuntime::HostConditionalRenderingCompareValueImpl(VideoCommon::LookupData object, bool is_equal) { + // Early exit if conditional rendering is disabled by user + if (!Settings::values.use_conditional_rendering.GetValue()) [[unlikely]] { + impl->hcr_is_set = false; + return; + } + { std::scoped_lock lk(impl->buffer_cache.mutex); static constexpr auto sync_info = VideoCommon::ObtainBufferSynchronize::FullSynchronize; @@ -1340,6 +1353,12 @@ void QueryCacheRuntime::HostConditionalRenderingCompareValueImpl(VideoCommon::Lo } void QueryCacheRuntime::HostConditionalRenderingCompareBCImpl(DAddr address, bool is_equal) { + // Early exit if conditional rendering is disabled by user + if (!Settings::values.use_conditional_rendering.GetValue()) [[unlikely]] { + impl->hcr_is_set = false; + return; + } + VkBuffer to_resolve; u32 to_resolve_offset; {