summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-07-08 12:41:10 +0200
committerGitHub <noreply@github.com>2025-07-08 12:41:10 +0200
commit8f948827a69499c0b112043debad35f82a312b6b (patch)
tree6d2c678a61db60e64c8cd1160267e2803f89066b /src/render/Renderer.cpp
parent9856563f8966856871a95f70757362f694ff22a6 (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.cpp13
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();
}