mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-08-16 04:23:49 -07:00
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>
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user