diff options
| author | 2023-05-23 09:42:49 -0400 | |
|---|---|---|
| committer | 2023-05-23 09:42:49 -0400 | |
| commit | 58be9b12f403d8466f9a09cf65002400b1832dda (patch) | |
| tree | f2d71089506499d9cc734230a65b9f3743ae4ef6 /src | |
| parent | Merge pull request #10411 from scorpion81/gc-steamdeck-fix-attempt (diff) | |
| parent | renderer_vulkan: barrier attachment feedback loops (diff) | |
| download | yuzu-58be9b12f403d8466f9a09cf65002400b1832dda.tar.gz yuzu-58be9b12f403d8466f9a09cf65002400b1832dda.tar.xz yuzu-58be9b12f403d8466f9a09cf65002400b1832dda.zip | |
Merge pull request #10402 from liamwhite/uh
renderer_vulkan: barrier attachment feedback loops
Diffstat (limited to 'src')
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 | |||
| 147 | private: | 151 | private: |
| 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 | ||
| 487 | void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling, | 489 | void 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 | ||
| 864 | void TextureCacheRuntime::BarrierFeedbackLoop() { | ||
| 865 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 866 | } | ||
| 867 | |||
| 864 | void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, | 868 | void 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 | ||
| 186 | template <class P> | 186 | template <class P> |
| 187 | void 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 | |||
| 222 | template <class P> | ||
| 187 | typename P::Sampler* TextureCache<P>::GetGraphicsSampler(u32 index) { | 223 | typename 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 | ||