diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 8e7633d76..212ea454a 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -124,6 +124,10 @@ void Liverpool::Process(std::stop_token stoken) { if (task.done()) { task.destroy(); + if (rasterizer) { + rasterizer->ProcessFaultBuffer(); + } + std::scoped_lock lock{queue.m_access}; queue.submits.pop(); @@ -136,7 +140,7 @@ void Liverpool::Process(std::stop_token stoken) { if (submit_done) { VideoCore::EndCapture(); if (rasterizer) { - rasterizer->EndCommandList(); + rasterizer->ProcessDownloadImages(); rasterizer->Flush(); } submit_done = false; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 5227c2ac6..f8dd9ef89 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -449,11 +449,14 @@ void Rasterizer::Finish() { scheduler.Finish(); } -void Rasterizer::EndCommandList() { +void Rasterizer::ProcessFaultBuffer() { if (fault_process_pending) { fault_process_pending = false; buffer_cache.ProcessFaultBuffer(); } +} + +void Rasterizer::ProcessDownloadImages() { texture_cache.ProcessDownloadImages(); } @@ -482,7 +485,7 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) { uses_dma |= stage->uses_dma; } - if (uses_dma) { + if (uses_dma && !fault_process_pending) { // We only use fault buffer for DMA right now. { Common::RecursiveSharedLock lock{mapped_ranges_mutex}; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index b4cc82c43..60e17111c 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -72,7 +72,8 @@ public: void CpSync(); u64 Flush(); void Finish(); - void EndCommandList(); + void ProcessFaultBuffer(); + void ProcessDownloadImages(); PipelineCache& GetPipelineCache() { return pipeline_cache;