From 078e13f463d56a4e773aa104bca5567b9e9c8658 Mon Sep 17 00:00:00 2001 From: UjinT34 <41110182+UjinT34@users.noreply.github.com> Date: Fri, 17 Jan 2025 23:23:57 +0300 Subject: [PATCH] renderer: Auto enable wide color gamut in HDR mode (#9090) --- src/helpers/Monitor.hpp | 1 + src/render/Renderer.cpp | 29 ++++++++++++++++++++--------- src/render/Renderer.hpp | 1 - 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 3335a896e..b33725d57 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -192,6 +192,7 @@ class CMonitor { bool m_bEnabled = false; bool m_bRenderingInitPassed = false; + WP m_previousFSWindow; // For the list lookup diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index fddb9a9a1..384db1e6d 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1466,12 +1466,6 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { if (inFD >= 0) pMonitor->output->state->setExplicitInFence(inFD); - static auto PWIDE = CConfigValue("experimental:wide_color_gamut"); - if (pMonitor->output->state->state().wideColorGamut != *PWIDE) { - Debug::log(TRACE, "Setting wide color gamut {}", *PWIDE ? "on" : "off"); - pMonitor->output->state->setWideColorGamut(*PWIDE); - } - static auto PHDR = CConfigValue("experimental:hdr"); const bool SUPPORTSPQ = pMonitor->output->parsedEDID.hdrMetadata.has_value() ? pMonitor->output->parsedEDID.hdrMetadata->supportsPQ : false; @@ -1481,18 +1475,35 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { const auto WINDOW = pMonitor->activeWorkspace->getFullscreenWindow(); const auto SURF = WINDOW->m_pWLSurface->resource(); if (SURF->colorManagement.valid() && SURF->colorManagement->hasImageDescription()) { - bool needsHdrMetadataUpdate = SURF->colorManagement->needsHdrMetadataUpdate() || m_previousFSWindow != WINDOW; + bool needsHdrMetadataUpdate = SURF->colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW; if (SURF->colorManagement->needsHdrMetadataUpdate()) SURF->colorManagement->setHDRMetadata(createHDRMetadata(SURF->colorManagement.get()->imageDescription(), pMonitor->output->parsedEDID)); if (needsHdrMetadataUpdate) pMonitor->output->state->setHDRMetadata(SURF->colorManagement->hdrMetadata()); } else if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != *PHDR) pMonitor->output->state->setHDRMetadata(*PHDR ? createHDRMetadata(2, pMonitor->output->parsedEDID) : createHDRMetadata(0, pMonitor->output->parsedEDID)); - m_previousFSWindow = WINDOW; + pMonitor->m_previousFSWindow = WINDOW; } else { if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != *PHDR) pMonitor->output->state->setHDRMetadata(*PHDR ? createHDRMetadata(2, pMonitor->output->parsedEDID) : createHDRMetadata(0, pMonitor->output->parsedEDID)); - m_previousFSWindow.reset(); + pMonitor->m_previousFSWindow.reset(); + } + } + + static auto PWIDE = CConfigValue("experimental:wide_color_gamut"); + const bool needsWCG = *PWIDE || pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2; + if (pMonitor->output->state->state().wideColorGamut != needsWCG) { + Debug::log(TRACE, "Setting wide color gamut {}", needsWCG ? "on" : "off"); + pMonitor->output->state->setWideColorGamut(needsWCG); + + // FIXME do not trust enabled10bit, auto switch to 10bit and back if needed + if (needsWCG && !pMonitor->enabled10bit) { + Debug::log(WARN, "Wide color gamut is enabled but the display is not in 10bit mode"); + static bool shown = false; + if (!shown) { + g_pHyprNotificationOverlay->addNotification("Wide color gamut is enabled but the display is not in 10bit mode", CHyprColor{}, 15000, ICON_WARNING); + shown = true; + } } } diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 6ba7a654d..7aef96e68 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -130,7 +130,6 @@ class CHyprRenderer { bool commitPendingAndDoExplicitSync(PHLMONITOR pMonitor); - WP m_previousFSWindow; bool m_bCursorHidden = false; bool m_bCursorHasSurface = false; SP m_pCurrentRenderbuffer = nullptr;