From 916e5d1aea2dbf6488547728055b737817fee6b4 Mon Sep 17 00:00:00 2001 From: byddha <55928036+byddha@users.noreply.github.com> Date: Sun, 7 Dec 2025 22:47:27 +0200 Subject: [PATCH] renderer/cm: make needsHDRupdate per-monitor state (#12564) Co-authored-by: drzbida <55928036+drzbida@users.noreply.github.com> --- src/helpers/Monitor.hpp | 1 + src/render/Renderer.cpp | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 94c8cc15e..fef392ca1 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -336,6 +336,7 @@ class CMonitor { bool m_enabled = false; bool m_renderingInitPassed = false; WP m_previousFSWindow; + bool m_needsHDRupdate = false; NColorManagement::SImageDescription m_imageDescription; bool m_noShaderCTM = false; // sets drm CTM, restore needed diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 4190018f4..2c8130004 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1557,8 +1557,6 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { static auto PAUTOHDR = CConfigValue("render:cm_auto_hdr"); static auto PNONSHADER = CConfigValue("render:non_shader_cm"); - static bool needsHDRupdate = false; - const bool configuredHDR = (pMonitor->m_cmType == NCMType::CM_HDR_EDID || pMonitor->m_cmType == NCMType::CM_HDR); bool wantHDR = configuredHDR; @@ -1587,7 +1585,7 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { const bool surfaceIsHDR = SURF->m_colorManagement->isHDR(); if (!SURF->m_colorManagement->isWindowsScRGB() && (*PPASS == 1 || ((*PPASS == 2 || !pMonitor->m_lastScanout.expired()) && surfaceIsHDR))) { // passthrough - bool needsHdrMetadataUpdate = SURF->m_colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != FS_WINDOW || needsHDRupdate; + bool needsHdrMetadataUpdate = SURF->m_colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != FS_WINDOW || pMonitor->m_needsHDRupdate; if (SURF->m_colorManagement->needsHdrMetadataUpdate()) { Debug::log(INFO, "[CM] Recreating HDR metadata for surface"); SURF->m_colorManagement->setHDRMetadata(createHDRMetadata(SURF->m_colorManagement->imageDescription(), pMonitor)); @@ -1596,8 +1594,8 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { Debug::log(INFO, "[CM] Updating HDR metadata from surface"); pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata()); } - hdrIsHandled = true; - needsHDRupdate = false; + hdrIsHandled = true; + pMonitor->m_needsHDRupdate = false; } else if (*PAUTOHDR && surfaceIsHDR) wantHDR = true; // auto-hdr: hdr on } @@ -1617,7 +1615,7 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { Debug::log(INFO, wantHDR ? "[CM] Updating HDR metadata from monitor" : "[CM] Restoring SDR mode"); pMonitor->m_output->state->setHDRMetadata(wantHDR ? createHDRMetadata(pMonitor->m_imageDescription, pMonitor) : NO_HDR_METADATA); } - needsHDRupdate = true; + pMonitor->m_needsHDRupdate = true; } }