Merge pull request #611 from turtleli/fix-toggling

Fix renderer toggling behavior and other related stuff
This commit is contained in:
bositman 2015-06-26 16:34:02 +03:00
commit 59a66f87c3
2 changed files with 27 additions and 26 deletions

View File

@ -179,6 +179,8 @@ static void dummyIrqCallback()
void SysMtgsThread::OpenPlugin() void SysMtgsThread::OpenPlugin()
{ {
static bool stored_renderswitch = false;
if( m_PluginOpened ) return; if( m_PluginOpened ) return;
memcpy( RingBuffer.Regs, PS2MEM_GS, sizeof(PS2MEM_GS) ); memcpy( RingBuffer.Regs, PS2MEM_GS, sizeof(PS2MEM_GS) );
@ -192,25 +194,14 @@ void SysMtgsThread::OpenPlugin()
else else
result = GSopen( (void*)pDsp, "PCSX2", renderswitch ? 2 : 1 ); result = GSopen( (void*)pDsp, "PCSX2", renderswitch ? 2 : 1 );
// Vsync on / off ? if( stored_renderswitch != renderswitch )
if( renderswitch )
{ {
stored_renderswitch = renderswitch;
Console.Indent(2).WriteLn( "Toggling GSdx Hardware/Software renderer" ); 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 ) if( result != 0 )
{ {
DevCon.WriteLn( "GSopen Failed: return code: 0x%x", result ); DevCon.WriteLn( "GSopen Failed: return code: 0x%x", result );

View File

@ -445,17 +445,24 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
EXPORT_C_(int) GSopen2(void** dsp, uint32 flags) EXPORT_C_(int) GSopen2(void** dsp, uint32 flags)
{ {
#ifdef __linux__ static bool stored_toggle_state = false;
// Use ogl renderer as default otherwise it crash at startup bool toggle_state = !!(flags & 4);
// GSRenderOGL only GSDeviceOGL (not GSDeviceNULL)
int renderer = theApp.GetConfig("Renderer", 12);
#else
int renderer = theApp.GetConfig("Renderer", 0);
#endif
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 int best_sw_renderer = GSUtil::CheckDirect3D11Level() >= D3D_FEATURE_LEVEL_10_0 ? 4 : 1; // dx11 / dx9 sw
switch(renderer){ switch(renderer){
@ -477,6 +484,7 @@ EXPORT_C_(int) GSopen2(void** dsp, uint32 flags)
} }
#endif #endif
} }
stored_toggle_state = toggle_state;
int retval = _GSopen(dsp, NULL, renderer); int retval = _GSopen(dsp, NULL, renderer);
@ -761,17 +769,19 @@ EXPORT_C GSconfigure()
GSshutdown(); GSshutdown();
} }
// Force a reload of the gs state
s_renderer = -1;
} }
#else #else
if (RunLinuxDialog()) { if (RunLinuxDialog()) {
theApp.ReloadConfig(); theApp.ReloadConfig();
// Force a reload of the gs state
s_renderer = -1;
} }
#endif #endif
// Force a reload of the gs state
s_renderer = -1;
} catch (GSDXRecoverableError) } catch (GSDXRecoverableError)
{ {