diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index d6d9fedd..a84c4c64 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -1669,16 +1669,17 @@ bool CMonitor::supportsHDR() { return supportsWideColor() && (m_supportsHDR || (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->supportsPQ : false)); } -float CMonitor::minLuminance() { - return m_minLuminance >= 0 ? m_minLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance : 0); +float CMonitor::minLuminance(float defaultValue) { + return m_minLuminance >= 0 ? m_minLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance : defaultValue); } -int CMonitor::maxLuminance() { - return m_maxLuminance >= 0 ? m_maxLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance : 80); +int CMonitor::maxLuminance(int defaultValue) { + return m_maxLuminance >= 0 ? m_maxLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance : defaultValue); } -int CMonitor::maxAvgLuminance() { - return m_maxAvgLuminance >= 0 ? m_maxAvgLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance : 80); +int CMonitor::maxAvgLuminance(int defaultValue) { + return m_maxAvgLuminance >= 0 ? m_maxAvgLuminance : + (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance : defaultValue); } CMonitorState::CMonitorState(CMonitor* owner) : m_owner(owner) { diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 14a72a9c..09c6c49d 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -245,9 +245,9 @@ class CMonitor { bool supportsWideColor(); bool supportsHDR(); - float minLuminance(); - int maxLuminance(); - int maxAvgLuminance(); + float minLuminance(float defaultValue = 0); + int maxLuminance(int defaultValue = 80); + int maxAvgLuminance(int defaultValue = 80); bool m_enabled = false; bool m_renderingInitPassed = false; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index d204355b..b277086c 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1455,7 +1455,7 @@ void CHyprRenderer::renderMonitor(PHLMONITOR pMonitor, bool commit) { static const hdr_output_metadata NO_HDR_METADATA = {.hdmi_metadata_type1 = hdr_metadata_infoframe{.eotf = 0}}; -static hdr_output_metadata createHDRMetadata(SImageDescription settings, Aquamarine::IOutput::SParsedEDID edid) { +static hdr_output_metadata createHDRMetadata(SImageDescription settings, SP monitor) { uint8_t eotf = 0; switch (settings.transferFunction) { case CM_TRANSFER_FUNCTION_SRGB: eotf = 0; break; // used to send primaries and luminances to AQ. ignored for now @@ -1468,9 +1468,8 @@ static hdr_output_metadata createHDRMetadata(SImageDescription settings, A const auto to16Bit = [](float value) { return sc(std::round(value * 50000)); }; auto colorimetry = settings.primariesNameSet || settings.primaries == SPCPRimaries{} ? getPrimaries(settings.primariesNamed) : settings.primaries; - auto luminances = settings.masteringLuminances.max > 0 ? - settings.masteringLuminances : - SImageDescription::SPCMasteringLuminances{.min = edid.hdrMetadata->desiredContentMinLuminance, .max = edid.hdrMetadata->desiredContentMaxLuminance}; + auto luminances = settings.masteringLuminances.max > 0 ? settings.masteringLuminances : + SImageDescription::SPCMasteringLuminances{.min = monitor->minLuminance(), .max = monitor->maxLuminance(10000)}; Debug::log(TRACE, "ColorManagement primaries {},{} {},{} {},{} {},{}", colorimetry.red.x, colorimetry.red.y, colorimetry.green.x, colorimetry.green.y, colorimetry.blue.x, colorimetry.blue.y, colorimetry.white.x, colorimetry.white.y); @@ -1530,7 +1529,7 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { // 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)); + SURF->m_colorManagement->setHDRMetadata(createHDRMetadata(SURF->m_colorManagement->imageDescription(), pMonitor)); if (needsHdrMetadataUpdate) pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata()); hdrIsHandled = true; @@ -1548,7 +1547,7 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) { // 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_output->state->setHDRMetadata(wantHDR ? createHDRMetadata(pMonitor->m_imageDescription, pMonitor) : NO_HDR_METADATA); } pMonitor->m_previousFSWindow.reset(); }