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 {