protocols/cm: Fix image description info events (#12781)
* fix image description info events * always send some target primaries * set edid values as target primaries and luminances * init monitor image description * set default luminances for tf * fix BT1886 luminances * fix mastering values and overrides * set maxCLL & maxFALL * typo * add FALL & CLL to preferred HDR image description * fix ref luminances
This commit is contained in:
parent
e43f949f8a
commit
e0cf88809d
7 changed files with 151 additions and 74 deletions
|
|
@ -2973,13 +2973,16 @@ PImageDescription CCompositor::getHDRImageDescription() {
|
|||
}
|
||||
|
||||
return m_monitors.size() == 1 && m_monitors[0]->m_output && m_monitors[0]->m_output->parsedEDID.hdrMetadata.has_value() ?
|
||||
CImageDescription::from(SImageDescription{.transferFunction = NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_BT2020),
|
||||
.luminances = {.min = m_monitors[0]->m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance,
|
||||
.max = m_monitors[0]->m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance,
|
||||
.reference = m_monitors[0]->m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance}}) :
|
||||
CImageDescription::from(SImageDescription{
|
||||
.transferFunction = NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_BT2020),
|
||||
.masteringPrimaries = m_monitors[0]->getMasteringPrimaries(),
|
||||
.luminances = {.min = m_monitors[0]->minLuminance(HDR_MIN_LUMINANCE), .max = m_monitors[0]->maxLuminance(HDR_MAX_LUMINANCE), .reference = HDR_REF_LUMINANCE},
|
||||
.masteringLuminances = m_monitors[0]->getMasteringLuminances(),
|
||||
.maxCLL = m_monitors[0]->maxCLL(),
|
||||
.maxFALL = m_monitors[0]->maxFALL()}) :
|
||||
DEFAULT_HDR_IMAGE_DESCRIPTION;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ using namespace Hyprutils::OS;
|
|||
using enum NContentType::eContentType;
|
||||
using namespace NColorManagement;
|
||||
|
||||
CMonitor::CMonitor(SP<Aquamarine::IOutput> output_) : m_state(this), m_output(output_) {
|
||||
CMonitor::CMonitor(SP<Aquamarine::IOutput> output_) : m_state(this), m_output(output_), m_imageDescription(DEFAULT_IMAGE_DESCRIPTION) {
|
||||
g_pAnimationManager->createAnimation(0.f, m_specialFade, g_pConfigManager->getAnimationPropertyConfig("specialWorkspaceIn"), AVARDAMAGE_NONE);
|
||||
m_specialFade->setUpdateCallback([this](auto) { g_pHyprRenderer->damageMonitor(m_self.lock()); });
|
||||
static auto PZOOMFACTOR = CConfigValue<Hyprlang::FLOAT>("cursor:zoom_factor");
|
||||
|
|
@ -479,70 +479,87 @@ void CMonitor::applyCMType(NCMType::eCMType cmType, int cmSdrEotf) {
|
|||
auto chosenSdrEotf = cmSdrEotf == 0 ? (*PSDREOTF != 3 ? NColorManagement::CM_TRANSFER_FUNCTION_GAMMA22 : NColorManagement::CM_TRANSFER_FUNCTION_SRGB) :
|
||||
(cmSdrEotf == 1 ? NColorManagement::CM_TRANSFER_FUNCTION_SRGB : NColorManagement::CM_TRANSFER_FUNCTION_GAMMA22);
|
||||
|
||||
const auto masteringPrimaries = getMasteringPrimaries();
|
||||
const NColorManagement::SImageDescription::SPCMasteringLuminances masteringLuminances = getMasteringLuminances();
|
||||
|
||||
const auto maxFALL = this->maxFALL();
|
||||
const auto maxCLL = this->maxCLL();
|
||||
|
||||
switch (cmType) {
|
||||
case NCMType::CM_SRGB: m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf}); break; // assumes SImageDescription defaults to sRGB
|
||||
case NCMType::CM_WIDE:
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_BT2020)});
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_BT2020),
|
||||
.masteringPrimaries = masteringPrimaries,
|
||||
.masteringLuminances = masteringLuminances,
|
||||
.maxCLL = maxCLL,
|
||||
.maxFALL = maxFALL});
|
||||
break;
|
||||
case NCMType::CM_DCIP3:
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_DCI_P3,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_DCI_P3)});
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_DCI_P3,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_DCI_P3),
|
||||
.masteringPrimaries = masteringPrimaries,
|
||||
.masteringLuminances = masteringLuminances,
|
||||
.maxCLL = maxCLL,
|
||||
.maxFALL = maxFALL});
|
||||
break;
|
||||
case NCMType::CM_DP3:
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_DISPLAY_P3,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_DISPLAY_P3)});
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_DISPLAY_P3,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_DISPLAY_P3),
|
||||
.masteringPrimaries = masteringPrimaries,
|
||||
.masteringLuminances = masteringLuminances,
|
||||
.maxCLL = maxCLL,
|
||||
.maxFALL = maxFALL});
|
||||
break;
|
||||
case NCMType::CM_ADOBE:
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_ADOBE_RGB,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_ADOBE_RGB)});
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = true,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_ADOBE_RGB,
|
||||
.primaries = NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_ADOBE_RGB),
|
||||
.masteringPrimaries = masteringPrimaries,
|
||||
.masteringLuminances = masteringLuminances,
|
||||
.maxCLL = maxCLL,
|
||||
.maxFALL = maxFALL});
|
||||
break;
|
||||
case NCMType::CM_EDID:
|
||||
m_imageDescription =
|
||||
CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = false,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = {
|
||||
.red = {.x = m_output->parsedEDID.chromaticityCoords->red.x, .y = m_output->parsedEDID.chromaticityCoords->red.y},
|
||||
.green = {.x = m_output->parsedEDID.chromaticityCoords->green.x, .y = m_output->parsedEDID.chromaticityCoords->green.y},
|
||||
.blue = {.x = m_output->parsedEDID.chromaticityCoords->blue.x, .y = m_output->parsedEDID.chromaticityCoords->blue.y},
|
||||
.white = {.x = m_output->parsedEDID.chromaticityCoords->white.x, .y = m_output->parsedEDID.chromaticityCoords->white.y},
|
||||
}});
|
||||
m_imageDescription = CImageDescription::from({.transferFunction = chosenSdrEotf,
|
||||
.primariesNameSet = false,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = masteringPrimaries,
|
||||
.masteringPrimaries = masteringPrimaries,
|
||||
.masteringLuminances = masteringLuminances,
|
||||
.maxCLL = maxCLL,
|
||||
.maxFALL = maxFALL});
|
||||
break;
|
||||
case NCMType::CM_HDR: m_imageDescription = DEFAULT_HDR_IMAGE_DESCRIPTION; break;
|
||||
case NCMType::CM_HDR_EDID:
|
||||
m_imageDescription =
|
||||
CImageDescription::from({.transferFunction = NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ,
|
||||
.primariesNameSet = false,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = m_output->parsedEDID.chromaticityCoords.has_value() ?
|
||||
NColorManagement::SPCPRimaries{
|
||||
.red = {.x = m_output->parsedEDID.chromaticityCoords->red.x, .y = m_output->parsedEDID.chromaticityCoords->red.y},
|
||||
.green = {.x = m_output->parsedEDID.chromaticityCoords->green.x, .y = m_output->parsedEDID.chromaticityCoords->green.y},
|
||||
.blue = {.x = m_output->parsedEDID.chromaticityCoords->blue.x, .y = m_output->parsedEDID.chromaticityCoords->blue.y},
|
||||
.white = {.x = m_output->parsedEDID.chromaticityCoords->white.x, .y = m_output->parsedEDID.chromaticityCoords->white.y},
|
||||
} :
|
||||
NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_BT2020),
|
||||
.luminances = {.min = m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance,
|
||||
.max = m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance,
|
||||
.reference = m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance}});
|
||||
m_imageDescription = CImageDescription::from(
|
||||
{.transferFunction = NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ,
|
||||
.primariesNameSet = false,
|
||||
.primariesNamed = NColorManagement::CM_PRIMARIES_BT2020,
|
||||
.primaries = m_output->parsedEDID.chromaticityCoords.has_value() ? masteringPrimaries : NColorManagement::getPrimaries(NColorManagement::CM_PRIMARIES_BT2020),
|
||||
.masteringPrimaries = masteringPrimaries,
|
||||
.luminances = {.min = DEFAULT_HDR_IMAGE_DESCRIPTION->value().getTFMinLuminance(),
|
||||
.max = DEFAULT_HDR_IMAGE_DESCRIPTION->value().getTFMaxLuminance(),
|
||||
.reference = DEFAULT_HDR_IMAGE_DESCRIPTION->value().getTFRefLuminance()},
|
||||
.masteringLuminances = masteringLuminances,
|
||||
.maxCLL = maxCLL,
|
||||
.maxFALL = maxFALL});
|
||||
|
||||
break;
|
||||
default: UNREACHABLE();
|
||||
}
|
||||
if (m_minLuminance >= 0 || m_maxLuminance >= 0 || m_maxAvgLuminance >= 0)
|
||||
if ((m_minLuminance >= 0 || m_maxLuminance >= 0 || m_maxAvgLuminance >= 0) && (cmType == NCMType::CM_HDR || cmType == NCMType::CM_HDR_EDID))
|
||||
m_imageDescription = m_imageDescription->with({
|
||||
.min = m_minLuminance >= 0 ? m_minLuminance : m_imageDescription->value().luminances.min, //
|
||||
.max = m_maxLuminance >= 0 ? m_maxLuminance : m_imageDescription->value().luminances.max, //
|
||||
.reference = m_maxAvgLuminance >= 0 ? m_maxAvgLuminance : m_imageDescription->value().luminances.reference //
|
||||
.min = m_minLuminance >= 0 ? m_minLuminance : m_imageDescription->value().luminances.min, //
|
||||
.max = m_maxLuminance >= 0 ? m_maxLuminance : m_imageDescription->value().luminances.max, //
|
||||
.reference = m_imageDescription->value().luminances.reference //
|
||||
});
|
||||
|
||||
if (oldImageDescription != m_imageDescription) {
|
||||
|
|
@ -2022,6 +2039,14 @@ int CMonitor::maxAvgLuminance(int defaultValue) {
|
|||
(m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance : defaultValue);
|
||||
}
|
||||
|
||||
float CMonitor::maxFALL() {
|
||||
return m_maxAvgLuminance >= 0 ? m_maxAvgLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredMaxFrameAverageLuminance : 0);
|
||||
}
|
||||
|
||||
float CMonitor::maxCLL() {
|
||||
return m_maxLuminance >= 0 ? m_maxLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance : 0);
|
||||
}
|
||||
|
||||
bool CMonitor::wantsWideColor() {
|
||||
return supportsWideColor() && (wantsHDR() || m_imageDescription->value().primariesNamed == CM_PRIMARIES_BT2020);
|
||||
}
|
||||
|
|
@ -2063,6 +2088,24 @@ std::optional<NColorManagement::PImageDescription> CMonitor::getFSImageDescripti
|
|||
return SURF ? NColorManagement::CImageDescription::from(SURF->m_colorManagement->imageDescription()) : DEFAULT_IMAGE_DESCRIPTION;
|
||||
}
|
||||
|
||||
NColorManagement::SPCPRimaries CMonitor::getMasteringPrimaries() {
|
||||
return m_output->parsedEDID.chromaticityCoords.has_value() ?
|
||||
NColorManagement::SPCPRimaries{
|
||||
.red = {.x = m_output->parsedEDID.chromaticityCoords->red.x, .y = m_output->parsedEDID.chromaticityCoords->red.y},
|
||||
.green = {.x = m_output->parsedEDID.chromaticityCoords->green.x, .y = m_output->parsedEDID.chromaticityCoords->green.y},
|
||||
.blue = {.x = m_output->parsedEDID.chromaticityCoords->blue.x, .y = m_output->parsedEDID.chromaticityCoords->blue.y},
|
||||
.white = {.x = m_output->parsedEDID.chromaticityCoords->white.x, .y = m_output->parsedEDID.chromaticityCoords->white.y},
|
||||
} :
|
||||
NColorManagement::SPCPRimaries{};
|
||||
}
|
||||
|
||||
NColorManagement::SImageDescription::SPCMasteringLuminances CMonitor::getMasteringLuminances() {
|
||||
return {
|
||||
.min = m_minLuminance >= 0 ? m_minLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMinLuminance : 0),
|
||||
.max = m_maxLuminance >= 0 ? m_maxLuminance : (m_output->parsedEDID.hdrMetadata.has_value() ? m_output->parsedEDID.hdrMetadata->desiredContentMaxLuminance : 0),
|
||||
};
|
||||
}
|
||||
|
||||
bool CMonitor::needsCM() {
|
||||
const auto SRC_DESC = getFSImageDescription();
|
||||
return SRC_DESC.has_value() && SRC_DESC.value() != m_imageDescription;
|
||||
|
|
|
|||
|
|
@ -321,6 +321,8 @@ class CMonitor {
|
|||
float minLuminance(float defaultValue = 0);
|
||||
int maxLuminance(int defaultValue = 80);
|
||||
int maxAvgLuminance(int defaultValue = 80);
|
||||
float maxFALL();
|
||||
float maxCLL();
|
||||
|
||||
bool wantsWideColor();
|
||||
bool wantsHDR();
|
||||
|
|
@ -330,10 +332,13 @@ class CMonitor {
|
|||
/// Has an active workspace with a real fullscreen window (includes special workspace)
|
||||
bool inFullscreenMode();
|
||||
/// Get fullscreen window from active or special workspace
|
||||
PHLWINDOW getFullscreenWindow();
|
||||
std::optional<NColorManagement::PImageDescription> getFSImageDescription();
|
||||
PHLWINDOW getFullscreenWindow();
|
||||
std::optional<NColorManagement::PImageDescription> getFSImageDescription();
|
||||
|
||||
bool needsCM();
|
||||
NColorManagement::SPCPRimaries getMasteringPrimaries();
|
||||
NColorManagement::SImageDescription::SPCMasteringLuminances getMasteringLuminances();
|
||||
|
||||
bool needsCM();
|
||||
/// Can do CM without shader
|
||||
bool canNoShaderCM();
|
||||
bool doesNoShaderCM();
|
||||
|
|
|
|||
|
|
@ -505,6 +505,14 @@ CColorManagementParametricCreator::CColorManagementParametricCreator(SP<CWpImage
|
|||
return;
|
||||
}
|
||||
|
||||
if ((m_valuesSet & PC_TF) && !(m_valuesSet & PC_LUMINANCES)) {
|
||||
m_settings.luminances = {
|
||||
.min = m_settings.getTFMinLuminance(),
|
||||
.max = m_settings.getTFMaxLuminance(),
|
||||
.reference = m_settings.getTFRefLuminance(),
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE->m_self = RESOURCE;
|
||||
RESOURCE->m_settings = CImageDescription::from(m_settings);
|
||||
RESOURCE->resource()->sendReady(RESOURCE->m_settings->id());
|
||||
|
|
@ -730,19 +738,39 @@ CColorManagementImageDescriptionInfo::CColorManagementImageDescriptionInfo(SP<CW
|
|||
m_resource->sendPrimaries(toProto(m_settings.primaries.red.x), toProto(m_settings.primaries.red.y), toProto(m_settings.primaries.green.x),
|
||||
toProto(m_settings.primaries.green.y), toProto(m_settings.primaries.blue.x), toProto(m_settings.primaries.blue.y),
|
||||
toProto(m_settings.primaries.white.x), toProto(m_settings.primaries.white.y));
|
||||
|
||||
if (m_settings.primariesNameSet)
|
||||
m_resource->sendPrimariesNamed(m_settings.primariesNamed);
|
||||
m_resource->sendTfPower(std::round(m_settings.transferFunctionPower * 10000));
|
||||
|
||||
m_resource->sendTfNamed(m_settings.transferFunction);
|
||||
|
||||
if (m_settings.transferFunctionPower != 1.0f)
|
||||
m_resource->sendTfPower(std::round(m_settings.transferFunctionPower * 10000));
|
||||
|
||||
m_resource->sendLuminances(std::round(m_settings.luminances.min * 10000), m_settings.luminances.max, m_settings.luminances.reference);
|
||||
|
||||
// send expected display paramateres
|
||||
m_resource->sendTargetPrimaries(toProto(m_settings.masteringPrimaries.red.x), toProto(m_settings.masteringPrimaries.red.y), toProto(m_settings.masteringPrimaries.green.x),
|
||||
toProto(m_settings.masteringPrimaries.green.y), toProto(m_settings.masteringPrimaries.blue.x), toProto(m_settings.masteringPrimaries.blue.y),
|
||||
toProto(m_settings.masteringPrimaries.white.x), toProto(m_settings.masteringPrimaries.white.y));
|
||||
m_resource->sendTargetLuminance(std::round(m_settings.masteringLuminances.min * 10000), m_settings.masteringLuminances.max);
|
||||
m_resource->sendTargetMaxCll(m_settings.maxCLL);
|
||||
m_resource->sendTargetMaxFall(m_settings.maxFALL);
|
||||
const auto& targetPrimaries = ( //
|
||||
m_settings.masteringPrimaries.red.x != 0 || m_settings.masteringPrimaries.red.y != 0 || //
|
||||
m_settings.masteringPrimaries.green.x != 0 || m_settings.masteringPrimaries.green.y != 0 || //
|
||||
m_settings.masteringPrimaries.blue.x != 0 || m_settings.masteringPrimaries.blue.y != 0) ?
|
||||
m_settings.masteringPrimaries :
|
||||
m_settings.primaries;
|
||||
|
||||
m_resource->sendTargetPrimaries( //
|
||||
toProto(targetPrimaries.red.x), toProto(targetPrimaries.red.y), //
|
||||
toProto(targetPrimaries.green.x), toProto(targetPrimaries.green.y), //
|
||||
toProto(targetPrimaries.blue.x), toProto(targetPrimaries.blue.y), //
|
||||
toProto(targetPrimaries.white.x), toProto(targetPrimaries.white.y));
|
||||
|
||||
if (m_settings.masteringLuminances.max > 0)
|
||||
m_resource->sendTargetLuminance(std::round(m_settings.masteringLuminances.min * 10000), m_settings.masteringLuminances.max);
|
||||
else
|
||||
m_resource->sendTargetLuminance(std::round(m_settings.luminances.min * 10000), m_settings.luminances.max);
|
||||
|
||||
if (m_settings.maxCLL > 0 || m_settings.maxFALL > 0) {
|
||||
m_resource->sendTargetMaxCll(m_settings.maxCLL);
|
||||
m_resource->sendTargetMaxFall(m_settings.maxFALL);
|
||||
}
|
||||
|
||||
m_resource->sendDone();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -223,9 +223,9 @@ namespace NColorManagement {
|
|||
case CM_TRANSFER_FUNCTION_EXT_LINEAR: return 0;
|
||||
case CM_TRANSFER_FUNCTION_ST2084_PQ:
|
||||
case CM_TRANSFER_FUNCTION_HLG: return HDR_MIN_LUMINANCE;
|
||||
case CM_TRANSFER_FUNCTION_BT1886: return 0.01;
|
||||
case CM_TRANSFER_FUNCTION_GAMMA22:
|
||||
case CM_TRANSFER_FUNCTION_GAMMA28:
|
||||
case CM_TRANSFER_FUNCTION_BT1886:
|
||||
case CM_TRANSFER_FUNCTION_ST240:
|
||||
case CM_TRANSFER_FUNCTION_LOG_100:
|
||||
case CM_TRANSFER_FUNCTION_LOG_316:
|
||||
|
|
@ -243,9 +243,9 @@ namespace NColorManagement {
|
|||
return SDR_MAX_LUMINANCE; // assume Windows scRGB. white color range 1.0 - 125.0 maps to SDR_MAX_LUMINANCE (80) - HDR_MAX_LUMINANCE (10000)
|
||||
case CM_TRANSFER_FUNCTION_ST2084_PQ: return HDR_MAX_LUMINANCE;
|
||||
case CM_TRANSFER_FUNCTION_HLG: return HLG_MAX_LUMINANCE;
|
||||
case CM_TRANSFER_FUNCTION_BT1886: return 100;
|
||||
case CM_TRANSFER_FUNCTION_GAMMA22:
|
||||
case CM_TRANSFER_FUNCTION_GAMMA28:
|
||||
case CM_TRANSFER_FUNCTION_BT1886:
|
||||
case CM_TRANSFER_FUNCTION_ST240:
|
||||
case CM_TRANSFER_FUNCTION_LOG_100:
|
||||
case CM_TRANSFER_FUNCTION_LOG_316:
|
||||
|
|
@ -262,9 +262,9 @@ namespace NColorManagement {
|
|||
case CM_TRANSFER_FUNCTION_EXT_LINEAR:
|
||||
case CM_TRANSFER_FUNCTION_ST2084_PQ:
|
||||
case CM_TRANSFER_FUNCTION_HLG: return HDR_REF_LUMINANCE;
|
||||
case CM_TRANSFER_FUNCTION_BT1886: return 100;
|
||||
case CM_TRANSFER_FUNCTION_GAMMA22:
|
||||
case CM_TRANSFER_FUNCTION_GAMMA28:
|
||||
case CM_TRANSFER_FUNCTION_BT1886:
|
||||
case CM_TRANSFER_FUNCTION_ST240:
|
||||
case CM_TRANSFER_FUNCTION_LOG_100:
|
||||
case CM_TRANSFER_FUNCTION_LOG_316:
|
||||
|
|
|
|||
|
|
@ -1244,15 +1244,13 @@ void CHyprOpenGLImpl::passCMUniforms(WP<CShader> shader, const NColorManagement:
|
|||
shader->setUniformFloat2(SHADER_DST_TF_RANGE, targetImageDescription->value().getTFMinLuminance(needsSDRmod ? sdrMinLuminance : -1),
|
||||
targetImageDescription->value().getTFMaxLuminance(needsSDRmod ? sdrMaxLuminance : -1));
|
||||
|
||||
shader->setUniformFloat(SHADER_SRC_REF_LUMINANCE, imageDescription->value().getTFRefLuminance(-1));
|
||||
shader->setUniformFloat(SHADER_DST_REF_LUMINANCE, targetImageDescription->value().getTFRefLuminance(-1));
|
||||
shader->setUniformFloat(SHADER_SRC_REF_LUMINANCE, imageDescription->value().luminances.reference);
|
||||
shader->setUniformFloat(SHADER_DST_REF_LUMINANCE, targetImageDescription->value().luminances.reference);
|
||||
|
||||
const float maxLuminance = needsHDRmod ?
|
||||
imageDescription->value().getTFMaxLuminance(-1) :
|
||||
(imageDescription->value().luminances.max > 0 ? imageDescription->value().luminances.max : imageDescription->value().luminances.reference);
|
||||
shader->setUniformFloat(SHADER_MAX_LUMINANCE,
|
||||
maxLuminance * targetImageDescription->value().luminances.reference /
|
||||
(needsHDRmod ? imageDescription->value().getTFRefLuminance(-1) : imageDescription->value().luminances.reference));
|
||||
shader->setUniformFloat(SHADER_MAX_LUMINANCE, maxLuminance * targetImageDescription->value().luminances.reference / imageDescription->value().luminances.reference);
|
||||
shader->setUniformFloat(SHADER_DST_MAX_LUMINANCE, targetImageDescription->value().luminances.max > 0 ? targetImageDescription->value().luminances.max : 10000);
|
||||
shader->setUniformFloat(SHADER_SDR_SATURATION, needsSDRmod && m_renderData.pMonitor->m_sdrSaturation > 0 ? m_renderData.pMonitor->m_sdrSaturation : 1.0f);
|
||||
shader->setUniformFloat(SHADER_SDR_BRIGHTNESS, needsSDRmod && m_renderData.pMonitor->m_sdrBrightness > 0 ? m_renderData.pMonitor->m_sdrBrightness : 1.0f);
|
||||
|
|
|
|||
|
|
@ -1552,8 +1552,8 @@ static hdr_output_metadata createHDRMetadata(SImageDescription settings, S
|
|||
.white_point = {.x = to16Bit(colorimetry.white.x), .y = to16Bit(colorimetry.white.y)},
|
||||
.max_display_mastering_luminance = toNits(luminances.max),
|
||||
.min_display_mastering_luminance = toNits(luminances.min * 10000),
|
||||
.max_cll = toNits(settings.maxCLL),
|
||||
.max_fall = toNits(settings.maxFALL),
|
||||
.max_cll = toNits(settings.maxCLL > 0 ? settings.maxCLL : monitor->maxCLL()),
|
||||
.max_fall = toNits(settings.maxFALL > 0 ? settings.maxFALL : monitor->maxFALL()),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue