rsx capture: Fix exceptions handler, fix tiny race condition on capture new capture

This commit is contained in:
Eladash 2020-03-09 21:06:38 +02:00 committed by Megamouse
parent 7e9dbeff7b
commit c04abac630
4 changed files with 11 additions and 12 deletions

View file

@ -28,8 +28,7 @@ class GSRender;
#define CMD_DEBUG 0 #define CMD_DEBUG 0
bool user_asked_for_frame_capture = false; std::atomic<bool> user_asked_for_frame_capture = false;
bool capture_current_frame = false;
rsx::frame_trace_data frame_debug; rsx::frame_trace_data frame_debug;
rsx::frame_capture_data frame_capture; rsx::frame_capture_data frame_capture;
@ -310,6 +309,8 @@ namespace rsx
m_graphics_state = pipeline_state::all_dirty; 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)) 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<rsx::overlays::display_manager>(0); m_overlay_manager = g_fxo->init<rsx::overlays::display_manager>(0);
@ -651,9 +652,6 @@ namespace rsx
std::this_thread::sleep_for(10ms); std::this_thread::sleep_for(10ms);
do_local_task(rsx::FIFO_state::lock_wait); do_local_task(rsx::FIFO_state::lock_wait);
user_asked_for_frame_capture = false;
capture_current_frame = false;
m_rsx_thread_exiting = true; m_rsx_thread_exiting = true;
g_fxo->get<rsx::dma_manager>()->join(); g_fxo->get<rsx::dma_manager>()->join();
} }
@ -2519,10 +2517,9 @@ namespace rsx
void thread::on_frame_end(u32 buffer, bool forced) void thread::on_frame_end(u32 buffer, bool forced)
{ {
// Marks the end of a frame scope GPU-side // 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; capture_current_frame = true;
user_asked_for_frame_capture = false;
frame_debug.reset(); frame_debug.reset();
frame_capture.reset(); frame_capture.reset();

View file

@ -3,6 +3,7 @@
#include <deque> #include <deque>
#include <variant> #include <variant>
#include <stack> #include <stack>
#include <atomic>
#include "GCM.h" #include "GCM.h"
#include "rsx_cache.h" #include "rsx_cache.h"
@ -26,8 +27,7 @@
extern u64 get_guest_system_time(); extern u64 get_guest_system_time();
extern u64 get_system_time(); extern u64 get_system_time();
extern bool user_asked_for_frame_capture; extern std::atomic<bool> user_asked_for_frame_capture;
extern bool capture_current_frame;
extern rsx::frame_trace_data frame_debug; extern rsx::frame_trace_data frame_debug;
extern rsx::frame_capture_data frame_capture; extern rsx::frame_capture_data frame_capture;
@ -717,6 +717,7 @@ namespace rsx
vm::ptr<void(u32)> user_handler = vm::null; vm::ptr<void(u32)> user_handler = vm::null;
vm::ptr<void(u32)> vblank_handler = vm::null; vm::ptr<void(u32)> vblank_handler = vm::null;
atomic_t<u64> vblank_count{0}; atomic_t<u64> vblank_count{0};
bool capture_current_frame = false;
public: public:
bool invalid_command_interrupt_raised = false; bool invalid_command_interrupt_raised = false;

View file

@ -176,7 +176,7 @@ namespace rsx
{ {
rsx->clear_surface(arg); rsx->clear_surface(arg);
if (capture_current_frame) if (rsx->capture_current_frame)
{ {
rsx->capture_frame("clear"); rsx->capture_frame("clear");
} }
@ -184,7 +184,7 @@ namespace rsx
void clear_zcull(thread* rsx, u32 _reg, u32 arg) void clear_zcull(thread* rsx, u32 _reg, u32 arg)
{ {
if (capture_current_frame) if (rsx->capture_current_frame)
{ {
rsx->capture_frame("clear zcull memory"); rsx->capture_frame("clear zcull memory");
} }

View file

@ -25,9 +25,10 @@
#include <QJSEngine> #include <QJSEngine>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QTimer> #include <QTimer>
#include <atomic>
constexpr auto qstr = QString::fromStdString; constexpr auto qstr = QString::fromStdString;
extern bool user_asked_for_frame_capture; extern std::atomic<bool> user_asked_for_frame_capture;
debugger_frame::debugger_frame(std::shared_ptr<gui_settings> settings, QWidget *parent) debugger_frame::debugger_frame(std::shared_ptr<gui_settings> settings, QWidget *parent)
: custom_dock_widget(tr("Debugger"), parent), xgui_settings(settings) : custom_dock_widget(tr("Debugger"), parent), xgui_settings(settings)