Renderer: Expose present mode and allow to query/set it
This commit is contained in:
@@ -670,8 +670,6 @@ namespace Nz::GL
|
||||
m_state.renderStates.scissorTest = false;
|
||||
m_state.renderStates.stencilTest = false;
|
||||
|
||||
EnableVerticalSync(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -87,9 +87,33 @@ namespace Nz::GL
|
||||
}
|
||||
}
|
||||
|
||||
void EGLContextBase::EnableVerticalSync(bool enabled)
|
||||
PresentModeFlags EGLContextBase::GetSupportedPresentModes() const
|
||||
{
|
||||
// TODO
|
||||
PresentModeFlags supportedModes;
|
||||
if (m_maxSwapInterval >= 1)
|
||||
supportedModes |= PresentMode::VerticalSync;
|
||||
|
||||
if (m_minSwapInterval <= 0)
|
||||
supportedModes |= PresentMode::Immediate;
|
||||
|
||||
if (m_minSwapInterval <= -1)
|
||||
supportedModes |= PresentMode::RelaxedVerticalSync;
|
||||
|
||||
return supportedModes;
|
||||
}
|
||||
|
||||
void EGLContextBase::SetPresentMode(PresentMode presentMode)
|
||||
{
|
||||
int interval = 0;
|
||||
switch (presentMode)
|
||||
{
|
||||
case PresentMode::Immediate: interval = 0; break;
|
||||
case PresentMode::RelaxedVerticalSync: interval = -1; break;
|
||||
case PresentMode::VerticalSync: interval = 1; break;
|
||||
default: return; // TODO: Unreachable
|
||||
}
|
||||
|
||||
m_loader.eglSwapInterval(m_display, interval);
|
||||
}
|
||||
|
||||
void EGLContextBase::SwapBuffers()
|
||||
@@ -247,6 +271,9 @@ namespace Nz::GL
|
||||
return false;
|
||||
}
|
||||
|
||||
m_loader.eglGetConfigAttrib(m_display, config, EGL_MAX_SWAP_INTERVAL, &m_maxSwapInterval);
|
||||
m_loader.eglGetConfigAttrib(m_display, config, EGL_MIN_SWAP_INTERVAL, &m_minSwapInterval);
|
||||
|
||||
LoadEGLExt();
|
||||
|
||||
return true;
|
||||
|
||||
@@ -73,15 +73,34 @@ namespace Nz::GL
|
||||
}
|
||||
}
|
||||
|
||||
void WGLContext::EnableVerticalSync(bool enabled)
|
||||
PresentModeFlags WGLContext::GetSupportedPresentModes() const
|
||||
{
|
||||
PresentModeFlags supportedModes = PresentMode::Immediate;
|
||||
if (wglSwapIntervalEXT)
|
||||
{
|
||||
if (!SetCurrentContext(this))
|
||||
return;
|
||||
|
||||
wglSwapIntervalEXT(enabled);
|
||||
supportedModes |= PresentMode::VerticalSync;
|
||||
if (HasPlatformExtension("WGL_EXT_swap_control_tear"))
|
||||
supportedModes |= PresentMode::RelaxedVerticalSync;
|
||||
}
|
||||
|
||||
return supportedModes;
|
||||
}
|
||||
|
||||
void WGLContext::SetPresentMode(PresentMode presentMode)
|
||||
{
|
||||
if (!SetCurrentContext(this))
|
||||
return;
|
||||
|
||||
int interval = 0;
|
||||
switch (presentMode)
|
||||
{
|
||||
case PresentMode::Immediate: interval = 0; break;
|
||||
case PresentMode::RelaxedVerticalSync: interval = -1; break; //< WGL_EXT_swap_control_tear
|
||||
case PresentMode::VerticalSync: interval = 1; break;
|
||||
default: return; // TODO: Unreachable
|
||||
}
|
||||
|
||||
wglSwapIntervalEXT(interval);
|
||||
}
|
||||
|
||||
void WGLContext::SwapBuffers()
|
||||
|
||||
@@ -64,9 +64,15 @@ namespace Nz::GL
|
||||
}
|
||||
}
|
||||
|
||||
void WebContext::EnableVerticalSync(bool /*enabled*/)
|
||||
PresentModeFlags WebContext::GetSupportedPresentModes() const
|
||||
{
|
||||
// TODO
|
||||
// WebGL does not support disabling V-Sync
|
||||
return PresentMode::VerticalSync;
|
||||
}
|
||||
|
||||
void WebContext::SetPresentMode(PresentMode /*presentMode*/)
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
void WebContext::SwapBuffers()
|
||||
|
||||
Reference in New Issue
Block a user