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
bool user_asked_for_frame_capture = false;
bool capture_current_frame = false;
std::atomic<bool> 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<rsx::overlays::display_manager>(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<rsx::dma_manager>()->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();

View File

@ -3,6 +3,7 @@
#include <deque>
#include <variant>
#include <stack>
#include <atomic>
#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<bool> 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<void(u32)> user_handler = vm::null;
vm::ptr<void(u32)> vblank_handler = vm::null;
atomic_t<u64> vblank_count{0};
bool capture_current_frame = false;
public:
bool invalid_command_interrupt_raised = false;

View File

@ -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");
}

View File

@ -25,9 +25,10 @@
#include <QJSEngine>
#include <QVBoxLayout>
#include <QTimer>
#include <atomic>
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)
: custom_dock_widget(tr("Debugger"), parent), xgui_settings(settings)