aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache/texture_cache.h
diff options
context:
space:
mode:
authorMaranBr <maranbr@outlook.com>2026-01-19 03:05:14 +0100
committercrueter <crueter@eden-emu.dev>2026-01-19 03:05:14 +0100
commit023a4bceca3a3a9d021dd970ebd4605b20f97d60 (patch)
tree6eb91057d5e9beebae9a09fad4f9d44a90b4e6b0 /src/video_core/texture_cache/texture_cache.h
parent4025925539c067df1811129813cdc85d66b6d244 (diff)
[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 <lizzie@eden-emu.dev> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src/video_core/texture_cache/texture_cache.h')
-rw-r--r--src/video_core/texture_cache/texture_cache.h34
1 files 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<P>::CheckFeedbackLoop(std::span<const ImageViewInOut> 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;
}