diff options
| author | Dominick DiMaggio <ddimaggio324@gmail.com> | 2025-12-11 18:50:57 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-11 23:50:57 +0000 |
| commit | 5700736505557363f8574f5abcc6c0f489821466 (patch) | |
| tree | 33583b86aa8e1d4a41381aca3cf6da5e86f6b749 /src/helpers/Monitor.cpp | |
| parent | 75f6435f70dee8f8b685a02c52db7ba16f5db39c (diff) | |
cm: handle CM for SDR content with cm=hdr, cm_sdr_eotf=2 (#12127)
Diffstat (limited to 'src/helpers/Monitor.cpp')
| -rw-r--r-- | src/helpers/Monitor.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index fa76a982..d01d2ac8 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -1799,8 +1799,8 @@ uint16_t CMonitor::isDSBlocked(bool full) { return reasons; } - if (needsCM() && *PNONSHADER != CM_NS_IGNORE && !canNoShaderCM() && (!inHDR() || (PSURFACE->m_colorManagement.valid() && PSURFACE->m_colorManagement->isWindowsScRGB())) && - *PPASS != 1) + const bool surfaceIsHDR = PSURFACE->m_colorManagement.valid() && (PSURFACE->m_colorManagement->isHDR() || PSURFACE->m_colorManagement->isWindowsScRGB()); + if (needsCM() && *PNONSHADER != CM_NS_IGNORE && !canNoShaderCM() && ((inHDR() && (*PPASS == 0 || !surfaceIsHDR)) || (!inHDR() && (*PPASS != 1 || surfaceIsHDR)))) reasons |= DS_BLOCK_CM; return reasons; @@ -2065,10 +2065,13 @@ bool CMonitor::canNoShaderCM() { if (SRC_DESC->icc.fd >= 0 || m_imageDescription.icc.fd >= 0) return false; // no ICC support + static auto PSDREOTF = CConfigValue<Hyprlang::INT>("render:cm_sdr_eotf"); // only primaries differ - if (SRC_DESC->transferFunction == m_imageDescription.transferFunction && SRC_DESC->transferFunctionPower == m_imageDescription.transferFunctionPower && - (!inHDR() || SRC_DESC->luminances == m_imageDescription.luminances) && SRC_DESC->masteringLuminances == m_imageDescription.masteringLuminances && - SRC_DESC->maxCLL == m_imageDescription.maxCLL && SRC_DESC->maxFALL == m_imageDescription.maxFALL) + if ((SRC_DESC->transferFunction == m_imageDescription.transferFunction || + (*PSDREOTF == 2 && SRC_DESC->transferFunction == NColorManagement::CM_TRANSFER_FUNCTION_SRGB && + m_imageDescription.transferFunction == NColorManagement::CM_TRANSFER_FUNCTION_GAMMA22)) && + SRC_DESC->transferFunctionPower == m_imageDescription.transferFunctionPower && (!inHDR() || SRC_DESC->luminances == m_imageDescription.luminances) && + SRC_DESC->masteringLuminances == m_imageDescription.masteringLuminances && SRC_DESC->maxCLL == m_imageDescription.maxCLL && SRC_DESC->maxFALL == m_imageDescription.maxFALL) return true; return false; |
