From ae634bb87ed9dcadb0cbc9fc79f254a66cab5a6a Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 20 Jul 2016 15:16:19 +0300 Subject: [PATCH] RSX exception fix VBlank thread management fix --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 1 + rpcs3/Emu/RSX/GL/GLGSRender.cpp | 2 ++ rpcs3/Emu/RSX/RSXThread.cpp | 15 ++++++++++++--- rpcs3/Emu/RSX/RSXThread.h | 3 +++ rpcs3/Emu/RSX/VK/VKGSRender.cpp | 2 ++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 8f1580b860..0535639e3a 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -278,6 +278,7 @@ D3D12GSRender::~D3D12GSRender() void D3D12GSRender::on_exit() { + return GSRender::on_exit(); } bool D3D12GSRender::do_method(u32 cmd, u32 arg) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 48af66b2c2..ebe7764478 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -611,6 +611,8 @@ void GLGSRender::on_exit() m_attrib_ring_buffer.remove(); m_uniform_ring_buffer.remove(); m_index_ring_buffer.remove(); + + return GSRender::on_exit(); } void nv4097_clear_surface(u32 arg, GLGSRender* renderer) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index cee265b43c..75407de2c8 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -62,7 +62,7 @@ namespace rsx } catch (...) { - LOG_ERROR(RSX, "Cache file '%s' ignored", entry.name); + LOG_WARNING(RSX, "Cache file '%s' ignored", entry.name); continue; } @@ -376,7 +376,7 @@ namespace rsx last_flip_time = get_system_time() - 1000000; - scope_thread vblank("VBlank Thread", [this]() + m_vblank_thread = thread_ctrl::spawn("VBlank Thread", [this]() { const u64 start_time = get_system_time(); @@ -484,9 +484,18 @@ namespace rsx } } + void thread::on_exit() + { + if (m_vblank_thread) + { + m_vblank_thread->join(); + m_vblank_thread.reset(); + } + } + std::string thread::get_name() const { - return "rsx::thread"s; + return "rsx::thread"; } void thread::fill_scale_offset_data(void *buffer, bool is_d3d) const diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 9df2863d21..11ec5deb57 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -189,6 +189,8 @@ namespace rsx class thread : public named_thread { + std::shared_ptr m_vblank_thread; + protected: std::stack m_call_stack; @@ -267,6 +269,7 @@ namespace rsx virtual ~thread(); virtual void on_task() override; + virtual void on_exit() override; public: virtual std::string get_name() const override; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 275b5327cd..6926fee58e 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -754,6 +754,8 @@ void VKGSRender::on_init_thread() void VKGSRender::on_exit() { m_texture_cache.destroy(); + + return GSRender::on_exit(); } void VKGSRender::clear_surface(u32 mask)