summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp3
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h2
-rw-r--r--src/video_core/texture_cache/texture_cache.h36
-rw-r--r--src/video_core/texture_cache/texture_cache_base.h3
6 files changed, 51 insertions, 1 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index 1190999a8..3e9b3302b 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -144,6 +144,10 @@ public:
144 return state_tracker; 144 return state_tracker;
145 } 145 }
146 146
147 void BarrierFeedbackLoop() const noexcept {
148 // OpenGL does not require a barrier for attachment feedback loops.
149 }
150
147private: 151private:
148 struct StagingBuffers { 152 struct StagingBuffers {
149 explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_); 153 explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_);
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
index f1bcd5cd6..506b78f08 100644
--- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
@@ -481,12 +481,13 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
481 if constexpr (Spec::enabled_stages[4]) { 481 if constexpr (Spec::enabled_stages[4]) {
482 prepare_stage(4); 482 prepare_stage(4);
483 } 483 }
484 texture_cache.UpdateRenderTargets(false);
485 texture_cache.CheckFeedbackLoop(views);
484 ConfigureDraw(rescaling, render_area); 486 ConfigureDraw(rescaling, render_area);
485} 487}
486 488
487void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling, 489void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling,
488 const RenderAreaPushConstant& render_area) { 490 const RenderAreaPushConstant& render_area) {
489 texture_cache.UpdateRenderTargets(false);
490 scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); 491 scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
491 492
492 if (!is_built.load(std::memory_order::relaxed)) { 493 if (!is_built.load(std::memory_order::relaxed)) {
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 4d0481f2a..da5af25eb 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -861,6 +861,10 @@ VkBuffer TextureCacheRuntime::GetTemporaryBuffer(size_t needed_size) {
861 return *buffers[level]; 861 return *buffers[level];
862} 862}
863 863
864void TextureCacheRuntime::BarrierFeedbackLoop() {
865 scheduler.RequestOutsideRenderPassOperationContext();
866}
867
864void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, 868void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src,
865 std::span<const VideoCommon::ImageCopy> copies) { 869 std::span<const VideoCommon::ImageCopy> copies) {
866 std::vector<VkBufferImageCopy> vk_in_copies(copies.size()); 870 std::vector<VkBufferImageCopy> vk_in_copies(copies.size());
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h
index 4166b3d20..0f7a5ffd4 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.h
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.h
@@ -103,6 +103,8 @@ public:
103 103
104 [[nodiscard]] VkBuffer GetTemporaryBuffer(size_t needed_size); 104 [[nodiscard]] VkBuffer GetTemporaryBuffer(size_t needed_size);
105 105
106 void BarrierFeedbackLoop();
107
106 const Device& device; 108 const Device& device;
107 Scheduler& scheduler; 109 Scheduler& scheduler;
108 MemoryAllocator& memory_allocator; 110 MemoryAllocator& memory_allocator;
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
@@ -184,6 +184,42 @@ void TextureCache<P>::FillComputeImageViews(std::span<ImageViewInOut> views) {
184} 184}
185 185
186template <class P> 186template <class P>
187void TextureCache<P>::CheckFeedbackLoop(std::span<const ImageViewInOut> views) {
188 const bool requires_barrier = [&] {
189 for (const auto& view : views) {
190 if (!view.id) {
191 continue;
192 }
193 auto& image_view = slot_image_views[view.id];
194
195 // Check color targets
196 for (const auto& ct_view_id : render_targets.color_buffer_ids) {
197 if (ct_view_id) {
198 auto& ct_view = slot_image_views[ct_view_id];
199 if (image_view.image_id == ct_view.image_id) {
200 return true;
201 }
202 }
203 }
204
205 // Check zeta target
206 if (render_targets.depth_buffer_id) {
207 auto& zt_view = slot_image_views[render_targets.depth_buffer_id];
208 if (image_view.image_id == zt_view.image_id) {
209 return true;
210 }
211 }
212 }
213
214 return false;
215 }();
216
217 if (requires_barrier) {
218 runtime.BarrierFeedbackLoop();
219 }
220}
221
222template <class P>
187typename P::Sampler* TextureCache<P>::GetGraphicsSampler(u32 index) { 223typename P::Sampler* TextureCache<P>::GetGraphicsSampler(u32 index) {
188 if (index > channel_state->graphics_sampler_table.Limit()) { 224 if (index > channel_state->graphics_sampler_table.Limit()) {
189 LOG_DEBUG(HW_GPU, "Invalid sampler index={}", index); 225 LOG_DEBUG(HW_GPU, "Invalid sampler index={}", index);
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:
148 /// Fill image_view_ids with the compute images in indices 148 /// Fill image_view_ids with the compute images in indices
149 void FillComputeImageViews(std::span<ImageViewInOut> views); 149 void FillComputeImageViews(std::span<ImageViewInOut> views);
150 150
151 /// Handle feedback loops during draws.
152 void CheckFeedbackLoop(std::span<const ImageViewInOut> views);
153
151 /// Get the sampler from the graphics descriptor table in the specified index 154 /// Get the sampler from the graphics descriptor table in the specified index
152 Sampler* GetGraphicsSampler(u32 index); 155 Sampler* GetGraphicsSampler(u32 index);
153 156