diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 150e70f42f..99af60a814 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -769,8 +769,6 @@ void GLGSRender::on_init_thread() void GLGSRender::on_exit() { - glFinish(); - m_prog_buffer.clear(); if (draw_fbo) @@ -838,6 +836,9 @@ void GLGSRender::on_exit() glDeleteQueries(1, &query.handle); } + glFlush(); + glFinish(); + GSRender::on_exit(); } diff --git a/rpcs3/rpcs3qt/gl_gs_frame.cpp b/rpcs3/rpcs3qt/gl_gs_frame.cpp index a373871654..2896700a35 100644 --- a/rpcs3/rpcs3qt/gl_gs_frame.cpp +++ b/rpcs3/rpcs3qt/gl_gs_frame.cpp @@ -42,9 +42,24 @@ void gl_gs_frame::set_current(draw_context_t ctx) void gl_gs_frame::delete_context(draw_context_t ctx) { + auto gl_ctx = (QOpenGLContext*)ctx; gl_ctx->doneCurrent(); + +#ifndef _WIN32 delete gl_ctx; +#else + //AMD driver crashes when executing wglDeleteContext + //Catch with SEH + __try + { + delete gl_ctx; + } + __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) + { + LOG_FATAL(RSX, "Your graphics driver just crashed whilst cleaning up. All consumed VRAM should have been released, but you may want to restart the emulator just in case"); + } +#endif } void gl_gs_frame::flip(draw_context_t context, bool skip_frame)