Merge pull request #1181 from colobot/dev-vsync

Add VSync switch to Device tab
1008-fix
tomangelo 2018-08-21 12:16:03 +02:00 committed by GitHub
commit 7d46ee762a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 127 additions and 3 deletions

View File

@ -815,11 +815,29 @@ bool CApplication::CreateVideoSurface()
m_private->glcontext = SDL_GL_CreateContext(m_private->window);
int vsync = 0;
if (GetConfigFile().GetIntProperty("Experimental", "VSync", vsync))
if (GetConfigFile().GetIntProperty("Setup", "VSync", vsync))
{
SDL_GL_SetSwapInterval(vsync);
while (SDL_GL_SetSwapInterval(vsync) == -1)
{
switch(vsync)
{
case -1: //failed with adaptive sync?
GetLogger()->Warn("Adaptive sync not supported.\n");
vsync = 1;
break;
case 1: //failed with VSync enabled?
GetLogger()->Warn("Couldn't enable VSync.\n");
vsync = 0;
break;
case 0: //failed with VSync disabled?
GetLogger()->Warn("Couldn't disable VSync.\n");
vsync = 1;
break;
}
}
GetConfigFile().SetIntProperty("Setup", "VSync", vsync);
GetLogger()->Info("Using Vsync: %s\n", (vsync ? "true" : "false"));
GetLogger()->Info("Using Vsync: %s\n", (vsync == -1 ? "adaptive" : (vsync ? "true" : "false")));
}
return true;
@ -833,6 +851,27 @@ bool CApplication::ChangeVideoConfig(const Gfx::DeviceConfig &newConfig)
SDL_SetWindowSize(m_private->window, m_deviceConfig.size.x, m_deviceConfig.size.y);
SDL_SetWindowFullscreen(m_private->window, m_deviceConfig.fullScreen ? SDL_WINDOW_FULLSCREEN : 0);
int vsync = m_engine->GetVSync();
while (SDL_GL_SetSwapInterval(vsync) == -1)
{
switch(vsync)
{
case -1: //failed with adaptive sync?
GetLogger()->Warn("Adaptive sync not supported.\n");
vsync = 1;
break;
case 1: //failed with VSync enabled?
GetLogger()->Warn("Couldn't enable VSync.\n");
vsync = 0;
break;
case 0: //failed with VSync disabled?
GetLogger()->Warn("Couldn't disable VSync.\n");
vsync = 1;
break;
}
}
m_engine->SetVSync(vsync);
m_device->ConfigChanged(m_deviceConfig);
m_eventQueue->AddEvent(Event(EVENT_RESOLUTION_CHANGED));

View File

@ -232,6 +232,7 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY] = "EVENT_INTERFACE_SHADOW_MAPPING_QUALITY";
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = "EVENT_INTERFACE_SHADOW_MAPPING_BUFFER";
EVENT_TYPE_TEXT[EVENT_INTERFACE_LANGUAGE] = "EVENT_INTERFACE_LANGUAGE";
EVENT_TYPE_TEXT[EVENT_INTERFACE_VSYNC] = "EVENT_INTERFACE_VSYNC";
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO1] = "EVENT_INTERFACE_KINFO1";
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO2] = "EVENT_INTERFACE_KINFO2";

View File

@ -268,6 +268,7 @@ enum EventType
EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788,
EVENT_INTERFACE_SHADOW_MAPPING_BUFFER = 789,
EVENT_INTERFACE_LANGUAGE = 790,
EVENT_INTERFACE_VSYNC = 791,
EVENT_INTERFACE_KINFO1 = 500,
EVENT_INTERFACE_KINFO2 = 501,

View File

@ -216,6 +216,7 @@ void InitializeRestext()
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING] = TR("Dynamic shadows\\Beautiful shadows!");
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY]= TR("Dynamic shadows ++\\Dynamic shadows + self shadowing");
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = TR("Shadow resolution\\Higher means better range and quality, but slower");
stringsEvent[EVENT_INTERFACE_VSYNC] = TR("Vertical Synchronization\\Limits the number of frames per second to display frequency");
stringsEvent[EVENT_INTERFACE_KDEF] = TR("Standard controls\\Standard key functions");
assert(INPUT_SLOT_MAX < EVENT_INTERFACE_KEY_END-EVENT_INTERFACE_KEY);

View File

@ -112,6 +112,7 @@ void CSettings::SaveSettings()
// Experimental settings
GetConfigFile().SetBoolProperty("Experimental", "TerrainShadows", engine->GetTerrainShadows());
GetConfigFile().SetIntProperty("Setup", "VSync", engine->GetVSync());
CInput::GetInstancePointer()->SaveKeyBindings();
@ -274,6 +275,10 @@ void CSettings::LoadSettings()
if (GetConfigFile().GetBoolProperty("Experimental", "TerrainShadows", bValue))
engine->SetTerrainShadows(bValue);
if (GetConfigFile().GetIntProperty("Setup", "VSync", iValue))
{
engine->SetVSync(iValue);
}
CInput::GetInstancePointer()->LoadKeyBindings();

View File

@ -197,6 +197,7 @@ CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils)
m_terrainShadows = false;
m_shadowRange = 0.0f;
m_multisample = 2;
m_vsync = 0;
m_backForce = true;
m_lightMode = true;
@ -323,6 +324,7 @@ bool CEngine::Create()
SetShadowMappingOffscreen(m_offscreenShadowRendering);
SetShadowMappingOffscreenResolution(m_offscreenShadowRenderingResolution);
SetMultiSample(m_multisample);
SetVSync(m_vsync);
m_modelManager = MakeUnique<COldModelManager>(this);
m_pyroManager = MakeUnique<CPyroManager>();
@ -3023,6 +3025,19 @@ bool CEngine::GetTerrainShadows()
return m_terrainShadows;
}
void CEngine::SetVSync(int value)
{
if (value < -1) value = -1;
if (value > 1) value = 1;
if(m_vsync == value) return;
m_vsync = value;
}
int CEngine::GetVSync()
{
return m_vsync;
}
void CEngine::SetBackForce(bool present)
{
m_backForce = present;

View File

@ -1072,6 +1072,13 @@ public:
bool GetTerrainShadows();
//@}
//@{
//! Management of vertical synchronization
// NOTE: This is an user configuration setting
void SetVSync(int value);
int GetVSync();
//@}
//@{
//! Management of shadow color
// NOTE: This is a setting configurable only in INI file
@ -1336,6 +1343,9 @@ protected:
//! Texture bias for sampling shadow maps
Math::Matrix m_shadowBias;
//! Vertical synchronization controll
int m_vsync;
//! World matrix for 2D interface
Math::Matrix m_matWorldInterface;
//! Projection matrix for 2D interface

View File

@ -101,6 +101,36 @@ void CScreenSetupDisplay::CreateInterface()
pc->SetState(STATE_SHADOW);
pc->SetState(STATE_CHECK, m_setupFull);
pos.x = ox+sx*10;
pos.y = oy+sy*9;
ddim.x = dim.x*6;
ddim.y = dim.y*1;
GetResource(RES_EVENT, EVENT_INTERFACE_VSYNC, name);
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name);
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.x = ox+sx*10;
pos.y = oy+sy*7.97f;
ddim.x = dim.x*6;
ddim.y = dim.y*1.8f;
pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_VSYNC);
pli->SetState(STATE_SHADOW);
pli->SetItemName(0, "Off");
pli->SetItemName(1, "Adaptive");
pli->SetItemName(2, "On");
switch(m_engine->GetVSync())
{
case -1: //Adaptive?
pli->SetSelect(1);
break;
case 0: //Off?
pli->SetSelect(0);
break;
case 1: //On?
pli->SetSelect(2);
break;
}
ddim.x = dim.x*6;
ddim.y = dim.y*1;
pos.x = ox+sx*10;
@ -117,6 +147,7 @@ bool CScreenSetupDisplay::EventProcess(const Event &event)
CWindow* pw;
CCheck* pc;
CButton* pb;
CList* pl;
switch( event.type )
{
@ -153,6 +184,27 @@ bool CScreenSetupDisplay::EventProcess(const Event &event)
UpdateApply();
break;
case EVENT_INTERFACE_VSYNC:
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) break;
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_VSYNC));
if (pl == nullptr ) break;
switch(pl->GetSelect())
{
case 0: //Off?
m_engine->SetVSync(0);
break;
case 1: //Adaptive?
m_engine->SetVSync(-1);
break;
case 2: //On?
m_engine->SetVSync(1);
break;
}
ChangeDisplay();
UpdateApply();
break;
default:
return true;
}