diff options
| author | UjinT34 <41110182+UjinT34@users.noreply.github.com> | 2025-06-23 15:33:09 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-23 14:33:09 +0200 |
| commit | cf7e3aa448f8c9e0d9e8f407e6ed730da55acc69 (patch) | |
| tree | ef6629f968deb7adba3ac0793d181c9681961f9f /src/render/Renderer.cpp | |
| parent | c7c8ca475b295b42de128c818d4675f5c8b994b3 (diff) | |
renderer/cm: Add automatic hdr (#9785)
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 419ebd74..34347277 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -26,6 +26,7 @@ #include "../hyprerror/HyprError.hpp" #include "../debug/HyprDebugOverlay.hpp" #include "../debug/HyprNotificationOverlay.hpp" +#include "helpers/Monitor.hpp" #include "pass/TexPassElement.hpp" #include "pass/ClearPassElement.hpp" #include "pass/RectPassElement.hpp" @@ -1489,9 +1490,13 @@ static hdr_output_metadata createHDRMetadata(SImageDescription settings, A } bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { - static auto PCT = CConfigValue<Hyprlang::INT>("render:send_content_type"); - static auto PPASS = CConfigValue<Hyprlang::INT>("render:cm_fs_passthrough"); - const bool PHDR = pMonitor->m_imageDescription.transferFunction == CM_TRANSFER_FUNCTION_ST2084_PQ; + static auto PCT = CConfigValue<Hyprlang::INT>("render:send_content_type"); + static auto PPASS = CConfigValue<Hyprlang::INT>("render:cm_fs_passthrough"); + static auto PAUTOHDR = CConfigValue<Hyprlang::INT>("render:cm_auto_hdr"); + + const bool configuredHDR = (pMonitor->m_cmType == CM_HDR_EDID || pMonitor->m_cmType == CM_HDR); + const bool hdsIsActive = pMonitor->m_output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2; + bool wantHDR = configuredHDR; if (pMonitor->supportsHDR()) { // HDR metadata determined by @@ -1504,32 +1509,40 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { // fullscreen SDR surface: monitor settings // fullscreen HDR surface: surface settings - bool wantHDR = PHDR; bool hdrIsHandled = false; - if (*PPASS && pMonitor->m_activeWorkspace && pMonitor->m_activeWorkspace->m_hasFullscreenWindow && pMonitor->m_activeWorkspace->m_fullscreenMode == FSMODE_FULLSCREEN) { + if (pMonitor->m_activeWorkspace && pMonitor->m_activeWorkspace->m_hasFullscreenWindow && pMonitor->m_activeWorkspace->m_fullscreenMode == FSMODE_FULLSCREEN) { const auto WINDOW = pMonitor->m_activeWorkspace->getFullscreenWindow(); const auto ROOT_SURF = WINDOW->m_wlSurface->resource(); const auto SURF = ROOT_SURF->findFirstPreorder([ROOT_SURF](SP<CWLSurfaceResource> surf) { return surf->m_colorManagement.valid() && surf->extends() == ROOT_SURF->extends(); }); - wantHDR = PHDR && *PPASS == 2; - - // we have a surface with image description and it's allowed by wantHDR - if (SURF && SURF->m_colorManagement.valid() && SURF->m_colorManagement->hasImageDescription() && - (!wantHDR || SURF->m_colorManagement->imageDescription().transferFunction == CM_TRANSFER_FUNCTION_ST2084_PQ)) { - bool needsHdrMetadataUpdate = SURF->m_colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW; - if (SURF->m_colorManagement->needsHdrMetadataUpdate()) - SURF->m_colorManagement->setHDRMetadata(createHDRMetadata(SURF->m_colorManagement->imageDescription(), pMonitor->m_output->parsedEDID)); - if (needsHdrMetadataUpdate) - pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata()); - hdrIsHandled = true; + // we have a surface with image description + if (SURF && SURF->m_colorManagement.valid() && SURF->m_colorManagement->hasImageDescription()) { + const bool surfaceIsHDR = SURF->m_colorManagement->imageDescription().transferFunction == CM_TRANSFER_FUNCTION_ST2084_PQ; + if (*PPASS == 1 || (*PPASS == 2 && surfaceIsHDR)) { + // passthrough + bool needsHdrMetadataUpdate = SURF->m_colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW; + if (SURF->m_colorManagement->needsHdrMetadataUpdate()) + SURF->m_colorManagement->setHDRMetadata(createHDRMetadata(SURF->m_colorManagement->imageDescription(), pMonitor->m_output->parsedEDID)); + if (needsHdrMetadataUpdate) + pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata()); + hdrIsHandled = true; + } else if (*PAUTOHDR && surfaceIsHDR) + wantHDR = true; // auto-hdr: hdr on } pMonitor->m_previousFSWindow = WINDOW; } + if (!hdrIsHandled) { - if ((pMonitor->m_output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != wantHDR) + if (hdsIsActive != wantHDR) { + if (*PAUTOHDR && !(hdsIsActive && 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 + pMonitor->applyCMType(wantHDR ? (*PAUTOHDR == 2 ? CM_HDR_EDID : CM_HDR) : pMonitor->m_cmType); + } pMonitor->m_output->state->setHDRMetadata(wantHDR ? createHDRMetadata(pMonitor->m_imageDescription, pMonitor->m_output->parsedEDID) : NO_HDR_METADATA); + } pMonitor->m_previousFSWindow.reset(); } } |
