backends/drm: unset GAMMA_LUT and CTM when enabling color management

BUG: 477430
wilder/Plasma/6.2
Xaver Hugl 2 years ago
parent 673cb16f15
commit 301e95b07c
  1. 30
      src/backends/drm/drm_output.cpp
  2. 6
      src/backends/drm/drm_pipeline.cpp
  3. 1
      src/core/outputconfiguration.h
  4. 2
      src/outputconfigurationstore.cpp
  5. 12
      src/wayland/outputmanagement_v2.cpp

@ -320,18 +320,31 @@ bool DrmOutput::queueChanges(const std::shared_ptr<OutputChangeSet> &props)
if (!mode) {
return false;
}
const bool bt2020 = props->wideColorGamut.value_or(m_state.wideColorGamut);
const bool hdr = props->highDynamicRange.value_or(m_state.highDynamicRange);
m_pipeline->setMode(std::static_pointer_cast<DrmConnectorMode>(mode));
m_pipeline->setOverscan(props->overscan.value_or(m_pipeline->overscan()));
m_pipeline->setRgbRange(props->rgbRange.value_or(m_pipeline->rgbRange()));
m_pipeline->setRenderOrientation(outputToPlaneTransform(props->transform.value_or(transform())));
m_pipeline->setEnable(props->enabled.value_or(m_pipeline->enabled()));
m_pipeline->setBT2020(props->wideColorGamut.value_or(m_state.wideColorGamut));
m_pipeline->setNamedTransferFunction(props->highDynamicRange.value_or(m_state.highDynamicRange) ? NamedTransferFunction::PerceptualQuantizer : NamedTransferFunction::sRGB);
m_pipeline->setBT2020(bt2020);
m_pipeline->setNamedTransferFunction(hdr ? NamedTransferFunction::PerceptualQuantizer : NamedTransferFunction::sRGB);
m_pipeline->setSdrBrightness(props->sdrBrightness.value_or(m_state.sdrBrightness));
m_pipeline->setSdrGamutWideness(props->sdrGamutWideness.value_or(m_state.sdrGamutWideness));
m_pipeline->setBrightnessOverrides(props->maxPeakBrightnessOverride.value_or(m_state.maxPeakBrightnessOverride),
props->maxAverageBrightnessOverride.value_or(m_state.maxAverageBrightnessOverride),
props->minBrightnessOverride.value_or(m_state.minBrightnessOverride));
if (bt2020 || hdr) {
// ICC profiles don't support HDR (yet)
m_pipeline->setIccProfile(nullptr);
} else {
m_pipeline->setIccProfile(props->iccProfile.value_or(m_state.iccProfile));
}
if (bt2020 || hdr || m_pipeline->iccProfile()) {
// remove unused gamma ramp and ctm, if present
m_pipeline->setGammaRamp(nullptr);
m_pipeline->setCTM(QMatrix3x3{});
}
return true;
}
@ -360,18 +373,9 @@ void DrmOutput::applyQueuedChanges(const std::shared_ptr<OutputChangeSet> &props
next.maxAverageBrightnessOverride = props->maxAverageBrightnessOverride.value_or(m_state.maxAverageBrightnessOverride);
next.minBrightnessOverride = props->minBrightnessOverride.value_or(m_state.minBrightnessOverride);
next.sdrGamutWideness = props->sdrGamutWideness.value_or(m_state.sdrGamutWideness);
if (props->iccProfilePath) {
next.iccProfilePath = *props->iccProfilePath;
next.iccProfile = IccProfile::load(*props->iccProfilePath);
}
if (!next.highDynamicRange && !next.wideColorGamut) {
m_pipeline->setIccProfile(next.iccProfile);
} else {
// ICC profiles don't support HDR (yet)
m_pipeline->setIccProfile(nullptr);
}
next.iccProfilePath = props->iccProfilePath.value_or(m_state.iccProfilePath);
next.iccProfile = props->iccProfile.value_or(m_state.iccProfile);
next.colorDescription = m_pipeline->colorDescription();
setState(next);
setVrrPolicy(props->vrrPolicy.value_or(vrrPolicy()));

@ -661,7 +661,11 @@ void DrmPipeline::setRgbRange(Output::RgbRange range)
void DrmPipeline::setGammaRamp(const std::shared_ptr<ColorTransformation> &transformation)
{
m_pending.colorTransformation = transformation;
m_pending.gamma = std::make_shared<DrmGammaRamp>(m_pending.crtc, transformation);
if (transformation) {
m_pending.gamma = std::make_shared<DrmGammaRamp>(m_pending.crtc, transformation);
} else {
m_pending.gamma.reset();
}
}
static uint64_t doubleToFixed(double value)

@ -37,6 +37,7 @@ public:
std::optional<bool> wideColorGamut;
std::optional<Output::AutoRotationPolicy> autoRotationPolicy;
std::optional<QString> iccProfilePath;
std::optional<std::shared_ptr<IccProfile>> iccProfile;
std::optional<std::optional<double>> maxPeakBrightnessOverride;
std::optional<std::optional<double>> maxAverageBrightnessOverride;
std::optional<std::optional<double>> minBrightnessOverride;

@ -7,6 +7,7 @@
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "outputconfigurationstore.h"
#include "core/iccprofile.h"
#include "core/inputdevice.h"
#include "core/output.h"
#include "core/outputbackend.h"
@ -287,6 +288,7 @@ std::pair<OutputConfiguration, QList<Output *>> OutputConfigurationStore::setupT
.wideColorGamut = state.wideColorGamut,
.autoRotationPolicy = state.autoRotation,
.iccProfilePath = state.iccProfilePath,
.iccProfile = state.iccProfilePath ? IccProfile::load(*state.iccProfilePath) : nullptr,
.maxPeakBrightnessOverride = state.maxPeakBrightnessOverride,
.maxAverageBrightnessOverride = state.maxAverageBrightnessOverride,
.minBrightnessOverride = state.minBrightnessOverride,

@ -5,14 +5,14 @@
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "outputmanagement_v2.h"
#include "core/iccprofile.h"
#include "core/outputbackend.h"
#include "core/outputconfiguration.h"
#include "display.h"
#include "main.h"
#include "outputdevice_v2.h"
#include "outputmanagement_v2.h"
#include "utils/common.h"
#include "core/outputbackend.h"
#include "core/outputconfiguration.h"
#include "main.h"
#include "workspace.h"
#include "qwayland-server-kde-output-management-v2.h"
@ -293,7 +293,9 @@ void OutputConfigurationV2Interface::kde_output_configuration_v2_set_icc_profile
return;
}
if (OutputDeviceV2Interface *output = OutputDeviceV2Interface::get(outputdevice)) {
config.changeSet(output->handle())->iccProfilePath = profile_path;
const auto set = config.changeSet(output->handle());
set->iccProfilePath = profile_path;
set->iccProfile = IccProfile::load(profile_path);
}
}

Loading…
Cancel
Save