diff --git a/pcsx2/MTGS.cpp b/pcsx2/MTGS.cpp index acd739fa1b..4bdf671d84 100644 --- a/pcsx2/MTGS.cpp +++ b/pcsx2/MTGS.cpp @@ -179,6 +179,8 @@ static void dummyIrqCallback() void SysMtgsThread::OpenPlugin() { + static bool stored_renderswitch = false; + if( m_PluginOpened ) return; memcpy( RingBuffer.Regs, PS2MEM_GS, sizeof(PS2MEM_GS) ); @@ -192,25 +194,14 @@ void SysMtgsThread::OpenPlugin() else result = GSopen( (void*)pDsp, "PCSX2", renderswitch ? 2 : 1 ); - // Vsync on / off ? - if( renderswitch ) + if( stored_renderswitch != renderswitch ) { + stored_renderswitch = renderswitch; Console.Indent(2).WriteLn( "Toggling GSdx Hardware/Software renderer" ); - if ( EmuConfig.GS.VsyncEnable ) - { - // Better turn Vsync off now, as in most cases sw rendering is not fast enough to support a steady 60fps. - // Having Vsync still enabled then means a big cut in speed and sloppy rendering. - // It's possible though that some users have very fast machines, and rather kept Vsync enabled, - // but let's assume this is the minority. At least for now ;) - GSsetVsync( false ); - Console.Indent(2).WriteLn( "Vsync temporarily disabled" ); - } - } - else - { - GSsetVsync( EmuConfig.GS.FrameLimitEnable && EmuConfig.GS.VsyncEnable ); } + GSsetVsync(EmuConfig.GS.FrameLimitEnable && EmuConfig.GS.VsyncEnable); + if( result != 0 ) { DevCon.WriteLn( "GSopen Failed: return code: 0x%x", result ); diff --git a/plugins/GSdx/GS.cpp b/plugins/GSdx/GS.cpp index f250547c53..d29b3b98d1 100644 --- a/plugins/GSdx/GS.cpp +++ b/plugins/GSdx/GS.cpp @@ -445,17 +445,24 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1) EXPORT_C_(int) GSopen2(void** dsp, uint32 flags) { -#ifdef __linux__ - // Use ogl renderer as default otherwise it crash at startup - // GSRenderOGL only GSDeviceOGL (not GSDeviceNULL) - int renderer = theApp.GetConfig("Renderer", 12); -#else - int renderer = theApp.GetConfig("Renderer", 0); -#endif + static bool stored_toggle_state = false; + bool toggle_state = !!(flags & 4); - if(flags & 4) + int renderer = s_renderer; + // Fresh start up or config file changed + if (renderer == -1) { -#ifdef _WINDOWS +#ifdef __linux__ + // Use ogl renderer as default otherwise it crash at startup + // GSRenderOGL only GSDeviceOGL (not GSDeviceNULL) + renderer = theApp.GetConfig("Renderer", 12); +#else + renderer = theApp.GetConfig("Renderer", 0); +#endif + } + else if (stored_toggle_state != toggle_state) + { +#ifdef _WIN32 int best_sw_renderer = GSUtil::CheckDirect3D11Level() >= D3D_FEATURE_LEVEL_10_0 ? 4 : 1; // dx11 / dx9 sw switch(renderer){ @@ -477,6 +484,7 @@ EXPORT_C_(int) GSopen2(void** dsp, uint32 flags) } #endif } + stored_toggle_state = toggle_state; int retval = _GSopen(dsp, NULL, renderer); @@ -761,17 +769,19 @@ EXPORT_C GSconfigure() GSshutdown(); } + // Force a reload of the gs state + s_renderer = -1; } #else if (RunLinuxDialog()) { theApp.ReloadConfig(); + // Force a reload of the gs state + s_renderer = -1; } #endif - // Force a reload of the gs state - s_renderer = -1; } catch (GSDXRecoverableError) {