From c04abac63029372c30183e3c50edb1f8ee0f0970 Mon Sep 17 00:00:00 2001 From: Eladash Date: Mon, 9 Mar 2020 21:06:38 +0200 Subject: [PATCH] rsx capture: Fix exceptions handler, fix tiny race condition on capture new capture --- rpcs3/Emu/RSX/RSXThread.cpp | 11 ++++------- rpcs3/Emu/RSX/RSXThread.h | 5 +++-- rpcs3/Emu/RSX/rsx_methods.cpp | 4 ++-- rpcs3/rpcs3qt/debugger_frame.cpp | 3 ++- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 28132ff242..fa8febf87c 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -28,8 +28,7 @@ class GSRender; #define CMD_DEBUG 0 -bool user_asked_for_frame_capture = false; -bool capture_current_frame = false; +std::atomic user_asked_for_frame_capture = false; rsx::frame_trace_data frame_debug; rsx::frame_capture_data frame_capture; @@ -310,6 +309,8 @@ namespace rsx m_graphics_state = pipeline_state::all_dirty; + user_asked_for_frame_capture = false; + if (g_cfg.misc.use_native_interface && (g_cfg.video.renderer == video_renderer::opengl || g_cfg.video.renderer == video_renderer::vulkan)) { m_overlay_manager = g_fxo->init(0); @@ -651,9 +652,6 @@ namespace rsx std::this_thread::sleep_for(10ms); do_local_task(rsx::FIFO_state::lock_wait); - user_asked_for_frame_capture = false; - capture_current_frame = false; - m_rsx_thread_exiting = true; g_fxo->get()->join(); } @@ -2519,10 +2517,9 @@ namespace rsx void thread::on_frame_end(u32 buffer, bool forced) { // Marks the end of a frame scope GPU-side - if (user_asked_for_frame_capture && !capture_current_frame) + if (user_asked_for_frame_capture.exchange(false) && !capture_current_frame) { capture_current_frame = true; - user_asked_for_frame_capture = false; frame_debug.reset(); frame_capture.reset(); diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 3ae4b99f10..bbcf2e4bcb 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "GCM.h" #include "rsx_cache.h" @@ -26,8 +27,7 @@ extern u64 get_guest_system_time(); extern u64 get_system_time(); -extern bool user_asked_for_frame_capture; -extern bool capture_current_frame; +extern std::atomic user_asked_for_frame_capture; extern rsx::frame_trace_data frame_debug; extern rsx::frame_capture_data frame_capture; @@ -717,6 +717,7 @@ namespace rsx vm::ptr user_handler = vm::null; vm::ptr vblank_handler = vm::null; atomic_t vblank_count{0}; + bool capture_current_frame = false; public: bool invalid_command_interrupt_raised = false; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 85c73bbaea..a89f7df389 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -176,7 +176,7 @@ namespace rsx { rsx->clear_surface(arg); - if (capture_current_frame) + if (rsx->capture_current_frame) { rsx->capture_frame("clear"); } @@ -184,7 +184,7 @@ namespace rsx void clear_zcull(thread* rsx, u32 _reg, u32 arg) { - if (capture_current_frame) + if (rsx->capture_current_frame) { rsx->capture_frame("clear zcull memory"); } diff --git a/rpcs3/rpcs3qt/debugger_frame.cpp b/rpcs3/rpcs3qt/debugger_frame.cpp index 1f0d33a353..4d0a64d6f7 100644 --- a/rpcs3/rpcs3qt/debugger_frame.cpp +++ b/rpcs3/rpcs3qt/debugger_frame.cpp @@ -25,9 +25,10 @@ #include #include #include +#include constexpr auto qstr = QString::fromStdString; -extern bool user_asked_for_frame_capture; +extern std::atomic user_asked_for_frame_capture; debugger_frame::debugger_frame(std::shared_ptr settings, QWidget *parent) : custom_dock_widget(tr("Debugger"), parent), xgui_settings(settings)