rsx capture: Fix exceptions handler, fix tiny race condition on capture new capture
This commit is contained in:
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user