diff --git a/backends/kwayland/waylandconfig.cpp b/backends/kwayland/waylandconfig.cpp index fd8b700b2f47b0a75e5d00b2ed014b9528510683..62a73ae0377641e45aaf28b1030ff36e8101da2c 100644 --- a/backends/kwayland/waylandconfig.cpp +++ b/backends/kwayland/waylandconfig.cpp @@ -121,10 +121,10 @@ void WaylandConfig::setupRegistry() connect(m_registry, &KWayland::Client::Registry::interfaceAnnounced, this, [this](const QByteArray &interface, quint32 name, quint32 version) { if (interface == WaylandOutputDevice::interface()->name) { - addOutput(name, std::min(2u, version)); + addOutput(name, std::min(3u, version)); } if (interface == WaylandOutputManagement::interface()->name) { - m_outputManagement = new WaylandOutputManagement(m_registry->registry(), name, std::min(2u, version)); + m_outputManagement = new WaylandOutputManagement(m_registry->registry(), name, std::min(3u, version)); } if (interface == WaylandPrimaryOutput::interface()->name) { m_primaryOutput.reset(new WaylandPrimaryOutput(m_registry->registry(), name, std::min(1u, version))); diff --git a/backends/kwayland/waylandoutputdevice.cpp b/backends/kwayland/waylandoutputdevice.cpp index 40ca260058193f870223a72e9a22435fd7e5122b..25d4a8fb3ee288e6d4ed57df3900d6a5bc9c7b31 100644 --- a/backends/kwayland/waylandoutputdevice.cpp +++ b/backends/kwayland/waylandoutputdevice.cpp @@ -187,6 +187,10 @@ void WaylandOutputDevice::updateKScreenOutput(OutputPtr &output) output->setOverscan(m_overscan); output->setVrrPolicy(static_cast(m_vrr_policy)); output->setRgbRange(static_cast(m_rgbRange)); + output->setMinBpc(m_minBpc); + output->setMaxBpc(m_maxBpc); + qWarning() << "BPC of WOD is" << m_bpc; + output->setBpc(m_bpc); updateKScreenModes(output); } @@ -257,7 +261,12 @@ bool WaylandOutputDevice::setWlConfig(WaylandOutputConfiguration *wlConfig, cons changed = true; } - if (output->isPrimary()) { + if ((output->capabilities() & Output::Capability::Bpc) && bpc() != output->bpc() && wlConfig->interface()->version >= 3) { + wlConfig->set_bits_per_color(object(), output->bpc()); + changed = true; + } + + if (output->isPrimary() && wlConfig->interface()->version >= 2) { wlConfig->set_primary_output(object()); changed = true; } @@ -357,6 +366,18 @@ void WaylandOutputDevice::kde_output_device_v2_name(const QString &outputName) m_outputName = outputName; } +void WaylandOutputDevice::kde_output_device_v2_supported_bits_per_color(uint32_t min, uint32_t max) +{ + m_minBpc = min; + m_maxBpc = max; +} + +void WaylandOutputDevice::kde_output_device_v2_used_bits_per_color(uint32_t bpc) +{ + qWarning() << __func__ << "called with" << bpc; + m_bpc = bpc; +} + QByteArray WaylandOutputDevice::edid() const { return m_edid; @@ -421,3 +442,18 @@ uint32_t WaylandOutputDevice::rgbRange() const { return m_rgbRange; } + +uint32_t WaylandOutputDevice::minBpc() const +{ + return m_minBpc; +} + +uint32_t WaylandOutputDevice::maxBpc() const +{ + return m_maxBpc; +} + +uint32_t WaylandOutputDevice::bpc() const +{ + return m_bpc; +} diff --git a/backends/kwayland/waylandoutputdevice.h b/backends/kwayland/waylandoutputdevice.h index b9dee44c365618fd875b436e75645869d96ca35c..500698b54b57e736cf140ae261689c04bf736c37 100644 --- a/backends/kwayland/waylandoutputdevice.h +++ b/backends/kwayland/waylandoutputdevice.h @@ -43,6 +43,9 @@ public: uint32_t overscan() const; uint32_t capabilities() const; uint32_t rgbRange() const; + uint32_t minBpc() const; + uint32_t maxBpc() const; + uint32_t bpc() const; OutputPtr toKScreenOutput(); void updateKScreenOutput(OutputPtr &output); @@ -84,6 +87,8 @@ protected: void kde_output_device_v2_vrr_policy(uint32_t vrr_policy) override; void kde_output_device_v2_rgb_range(uint32_t rgb_range) override; void kde_output_device_v2_name(const QString &name) override; + void kde_output_device_v2_supported_bits_per_color(uint32_t min, uint32_t max) override; + void kde_output_device_v2_used_bits_per_color(uint32_t bpc) override; private: QString modeName(const WaylandOutputDeviceMode *m) const; @@ -111,6 +116,9 @@ private: uint32_t m_vrr_policy; uint32_t m_rgbRange; bool m_isPrimary = false; + uint32_t m_minBpc = 8; + uint32_t m_maxBpc = 8; + uint32_t m_bpc = 8; }; } diff --git a/src/output.cpp b/src/output.cpp index 775e168ff0a948a05d55ed21b06338d10337e162..395946c1f0cb83d71ff1aacb999d1ba07de30999 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -59,6 +59,9 @@ public: , overscan(other.overscan) , vrrPolicy(other.vrrPolicy) , rgbRange(other.rgbRange) + , minBpc(other.minBpc) + , maxBpc(other.maxBpc) + , bpc(other.bpc) { const auto otherModeList = other.modeList; for (const ModePtr &otherMode : otherModeList) { @@ -96,6 +99,9 @@ public: uint32_t overscan = 0; VrrPolicy vrrPolicy = VrrPolicy::Automatic; RgbRange rgbRange = RgbRange::Automatic; + uint32_t minBpc = 8; + uint32_t maxBpc = 8; + uint32_t bpc = 8; QScopedPointer edid; }; @@ -651,6 +657,45 @@ void Output::setRgbRange(Output::RgbRange rgbRange) } } +uint32_t Output::minBpc() const +{ + return d->minBpc; +} + +void Output::setMinBpc(uint32_t min) +{ + if (d->minBpc != min) { + d->minBpc = min; + Q_EMIT minBpcChanged(); + } +} + +uint32_t Output::maxBpc() const +{ + return d->maxBpc; +} + +void Output::setMaxBpc(uint32_t max) +{ + if (d->maxBpc != max) { + d->maxBpc = max; + Q_EMIT maxBpcChanged(); + } +} + +uint32_t Output::bpc() const +{ + return d->bpc; +} + +void Output::setBpc(uint32_t bpc) +{ + if (d->bpc != bpc) { + d->bpc = bpc; + Q_EMIT bpcChanged(); + } +} + void Output::apply(const OutputPtr &other) { typedef void (KScreen::Output::*ChangeSignal)(); @@ -737,6 +782,10 @@ void Output::apply(const OutputPtr &other) changes << &Output::rgbRangeChanged; setRgbRange(other->d->rgbRange); } + if (d->bpc != other->d->bpc) { + changes << &Output::bpcChanged; + setBpc(other->d->bpc); + } // Non-notifyable changes if (other->d->edid) { diff --git a/src/output.h b/src/output.h index 77ae0a097f03089ce67f128f168c609527034a5e..fe543243b8329affc764c4649c36b660505ad138 100644 --- a/src/output.h +++ b/src/output.h @@ -52,6 +52,9 @@ public: Q_PROPERTY(uint32_t overscan READ overscan WRITE setOverscan NOTIFY overscanChanged) Q_PROPERTY(VrrPolicy vrrPolicy READ vrrPolicy WRITE setVrrPolicy NOTIFY vrrPolicyChanged) Q_PROPERTY(RgbRange rgbRange READ rgbRange WRITE setRgbRange NOTIFY rgbRangeChanged) + Q_PROPERTY(uint32_t minBpc READ minBpc NOTIFY minBpcChanged) + Q_PROPERTY(uint32_t maxBpc READ maxBpc NOTIFY maxBpcChanged) + Q_PROPERTY(uint32_t bpc READ bpc NOTIFY bpcChanged) enum Type { Unknown, @@ -84,6 +87,7 @@ public: Overscan = 0x1, Vrr = 0x2, RgbRange = 0x4, + Bpc = 0x8, }; Q_ENUM(Capability) Q_DECLARE_FLAGS(Capabilities, Capability) @@ -407,6 +411,13 @@ public: */ void setRgbRange(RgbRange rgbRange); + uint32_t minBpc() const; + void setMinBpc(uint32_t min); + uint32_t maxBpc() const; + void setMaxBpc(uint32_t max); + uint32_t bpc() const; + void setBpc(uint32_t bpc); + void apply(const OutputPtr &other); Q_SIGNALS: void outputChanged(); @@ -426,6 +437,9 @@ Q_SIGNALS: void overscanChanged(); void vrrPolicyChanged(); void rgbRangeChanged(); + void bpcChanged(); + void minBpcChanged(); + void maxBpcChanged(); /** The mode list changed. *