Renderer: Expose present mode and allow to query/set it

This commit is contained in:
SirLynix
2023-08-13 18:16:03 +02:00
parent 28d69ab552
commit e8620894f7
21 changed files with 420 additions and 43 deletions

View File

@@ -670,8 +670,6 @@ namespace Nz::GL
m_state.renderStates.scissorTest = false;
m_state.renderStates.stencilTest = false;
EnableVerticalSync(false);
return true;
}

View File

@@ -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;

View File

@@ -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()

View File

@@ -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()