diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2025-07-08 12:41:10 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-08 12:41:10 +0200 |
| commit | 8f948827a69499c0b112043debad35f82a312b6b (patch) | |
| tree | 6d2c678a61db60e64c8cd1160267e2803f89066b /src/render/Renderer.cpp | |
| parent | 9856563f8966856871a95f70757362f694ff22a6 (diff) | |
Renderer: Implement new render scheduling (#10936)
Implements a new render scheduling method, where we triple buffer when necessary.
Enabled by default, improves FPS on underpowered devices.
---------
Co-authored-by: Mihai Fufezan <mihai@fufexan.net>
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index e85d59b5..da52eaef 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1153,7 +1153,7 @@ void CHyprRenderer::calculateUVForSurface(PHLWINDOW pWindow, SP<CWLSurfaceResour } } -void CHyprRenderer::renderMonitor(PHLMONITOR pMonitor) { +void CHyprRenderer::renderMonitor(PHLMONITOR pMonitor, bool commit) { static std::chrono::high_resolution_clock::time_point renderStart = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point renderStartOverlay = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point endRenderOverlay = std::chrono::high_resolution_clock::now(); @@ -1425,7 +1425,8 @@ void CHyprRenderer::renderMonitor(PHLMONITOR pMonitor) { pMonitor->m_output->state->setPresentationMode(shouldTear ? Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_IMMEDIATE : Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_VSYNC); - commitPendingAndDoExplicitSync(pMonitor); + if (commit) + commitPendingAndDoExplicitSync(pMonitor); if (shouldTear) pMonitor->m_tearingState.busy = true; @@ -2247,12 +2248,10 @@ bool CHyprRenderer::beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMod return true; } - /* This is a constant expression, as we always use double-buffering in our swapchain - TODO: Rewrite the CDamageRing to take advantage of that maybe? It's made to support longer swapchains atm because we used to do wlroots */ - static constexpr const int HL_BUFFER_AGE = 2; + int bufferAge = 0; if (!buffer) { - m_currentBuffer = pMonitor->m_output->swapchain->next(nullptr); + m_currentBuffer = pMonitor->m_output->swapchain->next(&bufferAge); if (!m_currentBuffer) { Debug::log(ERR, "Failed to acquire swapchain buffer for {}", pMonitor->m_name); return false; @@ -2273,7 +2272,7 @@ bool CHyprRenderer::beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMod } if (mode == RENDER_MODE_NORMAL) { - damage = pMonitor->m_damage.getBufferDamage(HL_BUFFER_AGE); + damage = pMonitor->m_damage.getBufferDamage(bufferAge); pMonitor->m_damage.rotate(); } |
