From fa45db49c65948e43a39a30d0651bbc3fec2fbc2 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Tue, 4 Aug 2026 22:14:55 +0200 Subject: [PATCH] hdr: reset surface metadata on change (#15598) if we dont reset surface metadata, the monitor is stuck in using the surfaces metadata, and doesnt restore back ours. meaning after DS and gaming and returning, colors stay stuck fringed until a new metadata modeset. however this causes a modeset on returning that isnt wanted if a notification temporarly shows and vanishes. but a future PR in perhaps using a timer if DS reenters in a short bit we dont care about the notif fringing? better then leaving the monitor permanently wrong colors. --- src/output/Monitor.hpp | 3 ++- src/render/Renderer.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/output/Monitor.hpp b/src/output/Monitor.hpp index a7a74a708..c10f38c69 100644 --- a/src/output/Monitor.hpp +++ b/src/output/Monitor.hpp @@ -358,7 +358,8 @@ namespace Monitor { bool m_renderingInitPassed = false; PHLWINDOWREF m_previousFSWindow; - bool m_needsHDRupdate = false; + bool m_needsHDRupdate = false; + bool m_hdrMetadataFromSurface = false; std::optional m_cachedAllocatorDRMDev; std::optional m_cachedCompositorDRMDev; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 0fbe45257..76a05cec8 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2335,6 +2335,7 @@ void IHyprRenderer::handleFullscreenSettings(PHLMONITOR pMonitor) { if (needsHdrMetadataUpdate) { Log::logger->log(Log::INFO, "[CM] Updating HDR metadata from surface"); pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata()); + pMonitor->m_hdrMetadataFromSurface = true; } hdrIsHandled = true; pMonitor->m_needsHDRupdate = false; @@ -2347,8 +2348,10 @@ void IHyprRenderer::handleFullscreenSettings(PHLMONITOR pMonitor) { wantHDR = configuredHDR; if (!hdrIsHandled) { - if (pMonitor->inHDR() != wantHDR) { - if (*PAUTOHDR && !(pMonitor->inHDR() && configuredHDR)) { + const bool HDR_CHANGED = pMonitor->inHDR() != wantHDR; + + if (HDR_CHANGED || pMonitor->m_hdrMetadataFromSurface) { + if (HDR_CHANGED && *PAUTOHDR && !(pMonitor->inHDR() && configuredHDR)) { // modify or restore monitor image description for auto-hdr // FIXME ok for now, will need some other logic if monitor image description can be modified some other way const auto targetCM = wantHDR ? (*PAUTOHDR == 2 ? NCMType::CM_HDR_EDID : NCMType::CM_HDR) : pMonitor->m_cmType; @@ -2359,6 +2362,7 @@ void IHyprRenderer::handleFullscreenSettings(PHLMONITOR pMonitor) { } Log::logger->log(Log::INFO, wantHDR ? "[CM] Updating HDR metadata from monitor" : "[CM] Restoring SDR mode"); pMonitor->m_output->state->setHDRMetadata(wantHDR ? createHDRMetadata(pMonitor->m_imageDescription->value(), pMonitor) : NO_HDR_METADATA); + pMonitor->m_hdrMetadataFromSurface = false; } pMonitor->m_needsHDRupdate = true; }