From 8758932031ff4836652e7577ec566fd733f46e0b Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 22 May 2023 01:13:47 -0400 Subject: renderer_vulkan: barrier attachment feedback loops --- src/video_core/texture_cache/texture_cache.h | 36 +++++++++++++++++++++++ src/video_core/texture_cache/texture_cache_base.h | 3 ++ 2 files changed, 39 insertions(+) (limited to 'src/video_core/texture_cache') diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index b24086fce..8e62a5f78 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -183,6 +183,42 @@ void TextureCache

::FillComputeImageViews(std::span views) { views); } +template +void TextureCache

::CheckFeedbackLoop(std::span views) { + const bool requires_barrier = [&] { + for (const auto& view : views) { + if (!view.id) { + 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; + } + } + } + + // 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; + } + } + } + + return false; + }(); + + if (requires_barrier) { + runtime.BarrierFeedbackLoop(); + } +} + template typename P::Sampler* TextureCache

::GetGraphicsSampler(u32 index) { if (index > channel_state->graphics_sampler_table.Limit()) { diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index 0720494e5..1a3308e2d 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -148,6 +148,9 @@ public: /// Fill image_view_ids with the compute images in indices void FillComputeImageViews(std::span views); + /// Handle feedback loops during draws. + void CheckFeedbackLoop(std::span views); + /// Get the sampler from the graphics descriptor table in the specified index Sampler* GetGraphicsSampler(u32 index); -- cgit v1.2.3