From 0a34fc4bcd7754888b5ebd3a318c484b38f16bbb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 27 Jan 2021 20:19:36 +0300 Subject: [PATCH] vk: Offload garbage collection to offloader thread --- rpcs3/Emu/RSX/VK/VKCommandStream.h | 3 ++- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 6 ++++++ rpcs3/Emu/RSX/VK/VKResourceManager.cpp | 13 +++++++++++-- rpcs3/Emu/RSX/VK/VKResourceManager.h | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKCommandStream.h b/rpcs3/Emu/RSX/VK/VKCommandStream.h index 3d6098bf6e..e559a688f4 100644 --- a/rpcs3/Emu/RSX/VK/VKCommandStream.h +++ b/rpcs3/Emu/RSX/VK/VKCommandStream.h @@ -8,7 +8,8 @@ namespace vk enum // callback commands { - rctrl_queue_submit = 0x80000000 + rctrl_queue_submit = 0x80000000, + rctrl_run_gc = 0x80000001 }; struct submit_packet diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 2a6f083241..20c0aa32a6 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2233,6 +2233,12 @@ void VKGSRender::renderctl(u32 request_code, void* args) free(packet); break; } + case vk::rctrl_run_gc: + { + auto eid = reinterpret_cast(args); + vk::on_event_completed(eid, true); + break; + } default: fmt::throw_exception("Unhandled request code 0x%x", request_code); } diff --git a/rpcs3/Emu/RSX/VK/VKResourceManager.cpp b/rpcs3/Emu/RSX/VK/VKResourceManager.cpp index 4fe4451221..f67be7c7c7 100644 --- a/rpcs3/Emu/RSX/VK/VKResourceManager.cpp +++ b/rpcs3/Emu/RSX/VK/VKResourceManager.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "VKResourceManager.h" #include "VKGSRender.h" +#include "VKCommandStream.h" namespace vk { @@ -27,9 +28,17 @@ namespace vk return g_event_ctr.load(); } - void on_event_completed(u64 event_id) + void on_event_completed(u64 event_id, bool flush) { - // TODO: Offload this to a secondary thread + if (!flush && g_cfg.video.multithreaded_rsx) + { + auto offloader_thread = g_fxo->get(); + ensure(!offloader_thread->is_current_thread()); + + offloader_thread->backend_ctrl(rctrl_run_gc, reinterpret_cast(event_id)); + return; + } + g_resource_manager.eid_completed(event_id); } diff --git a/rpcs3/Emu/RSX/VK/VKResourceManager.h b/rpcs3/Emu/RSX/VK/VKResourceManager.h index be065976d3..ed5f32a5c2 100644 --- a/rpcs3/Emu/RSX/VK/VKResourceManager.h +++ b/rpcs3/Emu/RSX/VK/VKResourceManager.h @@ -11,7 +11,7 @@ namespace vk { u64 get_event_id(); u64 current_event_id(); - void on_event_completed(u64 event_id); + void on_event_completed(u64 event_id, bool flush = false); struct eid_scope_t {