|
|
|
@ -183,6 +183,42 @@ void TextureCache<P>::FillComputeImageViews(std::span<ImageViewInOut> views) { |
|
|
|
views); |
|
|
|
} |
|
|
|
|
|
|
|
template <class P> |
|
|
|
void TextureCache<P>::CheckFeedbackLoop(std::span<const ImageViewInOut> 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 <class P> |
|
|
|
typename P::Sampler* TextureCache<P>::GetGraphicsSampler(u32 index) { |
|
|
|
if (index > channel_state->graphics_sampler_table.Limit()) { |
|
|
|
|