summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2025-01-17 23:23:57 +0300
committerGitHub <noreply@github.com>2025-01-17 20:23:57 +0000
commit078e13f463d56a4e773aa104bca5567b9e9c8658 (patch)
tree92750ca87c122146474184afe718c17a0c899eca /src/render/Renderer.cpp
parent47d645d84a7a290dc974cad552ee4912ca606069 (diff)
renderer: Auto enable wide color gamut in HDR mode (#9090)
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index fddb9a9a..384db1e6 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<Hyprlang::INT>("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<Hyprlang::INT>("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<Hyprlang::INT>("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;
+ }
}
}