hdr: fix overrides and missing edid hdr metadata (#11476)
This commit is contained in:
parent
1a0ed00f74
commit
1d67987459
3 changed files with 15 additions and 15 deletions
|
|
@ -1669,16 +1669,17 @@ bool CMonitor::supportsHDR() {
|
||||||
return supportsWideColor() && (m_supportsHDR || (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->supportsPQ : false));
|
return supportsWideColor() && (m_supportsHDR || (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->supportsPQ : false));
|
||||||
}
|
}
|
||||||
|
|
||||||
float CMonitor::minLuminance() {
|
float CMonitor::minLuminance(float defaultValue) {
|
||||||
return m_minLuminance >= 0 ? m_minLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance : 0);
|
return m_minLuminance >= 0 ? m_minLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance : defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CMonitor::maxLuminance() {
|
int CMonitor::maxLuminance(int defaultValue) {
|
||||||
return m_maxLuminance >= 0 ? m_maxLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance : 80);
|
return m_maxLuminance >= 0 ? m_maxLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance : defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CMonitor::maxAvgLuminance() {
|
int CMonitor::maxAvgLuminance(int defaultValue) {
|
||||||
return m_maxAvgLuminance >= 0 ? m_maxAvgLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance : 80);
|
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) {
|
CMonitorState::CMonitorState(CMonitor* owner) : m_owner(owner) {
|
||||||
|
|
|
||||||
|
|
@ -245,9 +245,9 @@ class CMonitor {
|
||||||
|
|
||||||
bool supportsWideColor();
|
bool supportsWideColor();
|
||||||
bool supportsHDR();
|
bool supportsHDR();
|
||||||
float minLuminance();
|
float minLuminance(float defaultValue = 0);
|
||||||
int maxLuminance();
|
int maxLuminance(int defaultValue = 80);
|
||||||
int maxAvgLuminance();
|
int maxAvgLuminance(int defaultValue = 80);
|
||||||
|
|
||||||
bool m_enabled = false;
|
bool m_enabled = false;
|
||||||
bool m_renderingInitPassed = false;
|
bool m_renderingInitPassed = false;
|
||||||
|
|
|
||||||
|
|
@ -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 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<CMonitor> monitor) {
|
||||||
uint8_t eotf = 0;
|
uint8_t eotf = 0;
|
||||||
switch (settings.transferFunction) {
|
switch (settings.transferFunction) {
|
||||||
case CM_TRANSFER_FUNCTION_SRGB: eotf = 0; break; // used to send primaries and luminances to AQ. ignored for now
|
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<uint16_t>(std::round(value * 50000)); };
|
const auto to16Bit = [](float value) { return sc<uint16_t>(std::round(value * 50000)); };
|
||||||
|
|
||||||
auto colorimetry = settings.primariesNameSet || settings.primaries == SPCPRimaries{} ? getPrimaries(settings.primariesNamed) : settings.primaries;
|
auto colorimetry = settings.primariesNameSet || settings.primaries == SPCPRimaries{} ? getPrimaries(settings.primariesNamed) : settings.primaries;
|
||||||
auto luminances = settings.masteringLuminances.max > 0 ?
|
auto luminances = settings.masteringLuminances.max > 0 ? settings.masteringLuminances :
|
||||||
settings.masteringLuminances :
|
SImageDescription::SPCMasteringLuminances{.min = monitor->minLuminance(), .max = monitor->maxLuminance(10000)};
|
||||||
SImageDescription::SPCMasteringLuminances{.min = edid.hdrMetadata->desiredContentMinLuminance, .max = edid.hdrMetadata->desiredContentMaxLuminance};
|
|
||||||
|
|
||||||
Debug::log(TRACE, "ColorManagement primaries {},{} {},{} {},{} {},{}", colorimetry.red.x, colorimetry.red.y, colorimetry.green.x, colorimetry.green.y, colorimetry.blue.x,
|
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);
|
colorimetry.blue.y, colorimetry.white.x, colorimetry.white.y);
|
||||||
|
|
@ -1530,7 +1529,7 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
|
||||||
// passthrough
|
// passthrough
|
||||||
bool needsHdrMetadataUpdate = SURF->m_colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW;
|
bool needsHdrMetadataUpdate = SURF->m_colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW;
|
||||||
if (SURF->m_colorManagement->needsHdrMetadataUpdate())
|
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)
|
if (needsHdrMetadataUpdate)
|
||||||
pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata());
|
pMonitor->m_output->state->setHDRMetadata(SURF->m_colorManagement->hdrMetadata());
|
||||||
hdrIsHandled = true;
|
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
|
// 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->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();
|
pMonitor->m_previousFSWindow.reset();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue