From 023a4bceca3a3a9d021dd970ebd4605b20f97d60 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Mon, 19 Jan 2026 03:05:14 +0100 Subject: [PATCH] [video_core] Avoid false feedback loop barriers for render targets (#3338) Ignore views that are render targets when checking feedback loops. Fixes flickering caused by false barriers. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3338 Reviewed-by: Lizzie Co-authored-by: MaranBr Co-committed-by: MaranBr --- src/video_core/texture_cache/texture_cache.h | 34 ++++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 46a825ea39..a986f732c5 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -288,21 +288,41 @@ void TextureCache

::CheckFeedbackLoop(std::span views) { if (!view.id) { continue; } + + bool is_render_target = false; + + for (const auto& ct_view_id : render_targets.color_buffer_ids) { + if (ct_view_id && ct_view_id == view.id) { + is_render_target = true; + break; + } + } + + if (!is_render_target && render_targets.depth_buffer_id == view.id) { + is_render_target = true; + } + + if (is_render_target) { + continue; + } + auto& image_view = slot_image_views[view.id]; - // Check color targets for (const auto& ct_view_id : render_targets.color_buffer_ids) { - if (ct_view_id) { - auto& ct_view = slot_image_views[ct_view_id]; - if (image_view.image_id == ct_view.image_id) { - return true; - } + if (!ct_view_id) { + continue; + } + + auto& ct_view = slot_image_views[ct_view_id]; + + if (image_view.image_id == ct_view.image_id) { + return true; } } - // Check zeta target if (render_targets.depth_buffer_id) { auto& zt_view = slot_image_views[render_targets.depth_buffer_id]; + if (image_view.image_id == zt_view.image_id) { return true; }