diff --git a/include/aquamarine/output/Output.hpp b/include/aquamarine/output/Output.hpp index 8cbc685..c1a595a 100644 --- a/include/aquamarine/output/Output.hpp +++ b/include/aquamarine/output/Output.hpp @@ -76,10 +76,12 @@ namespace Aquamarine { uint32_t drmFormat = DRM_FORMAT_INVALID; Hyprutils::Memory::CSharedPointer buffer; int32_t explicitInFence = -1, explicitOutFence = -1; - std::optional ctm; + Hyprutils::Math::Mat3x3 ctm; + bool hasCtm = false; bool wideColorGamut = false; - std::optional hdrMetadata; - uint16_t contentType = DRM_MODE_CONTENT_TYPE_GRAPHICS; + hdr_output_metadata hdrMetadata; + bool hasHdrMetadata = false; + uint16_t contentType = DRM_MODE_CONTENT_TYPE_GRAPHICS; }; const SInternalState& state(); diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp index 61c3bf0..691b556 100644 --- a/src/backend/drm/DRM.cpp +++ b/src/backend/drm/DRM.cpp @@ -422,9 +422,7 @@ void Aquamarine::CDRMBackend::restoreAfterVT() { newState.committed |= COutputState::AQ_OUTPUT_STATE_BUFFER; if (c->crtc->props.values.ctm) { - if (STATE.ctm.has_value()) - newState.ctm = STATE.ctm; - else + if (!STATE.hasCtm) newState.ctm = Hyprutils::Math::Mat3x3::identity(); newState.committed |= COutputState::AQ_OUTPUT_STATE_CTM; @@ -440,7 +438,7 @@ void Aquamarine::CDRMBackend::restoreAfterVT() { newState.committed |= COutputState::AQ_OUTPUT_STATE_WCG; if (c->props.values.hdr_output_metadata) { - if (!STATE.hdrMetadata.has_value()) + if (!STATE.hasHdrMetadata) newState.hdrMetadata = {.hdmi_metadata_type1 = hdr_metadata_infoframe{.eotf = 0}}; newState.committed |= COutputState::AQ_OUTPUT_STATE_HDR; @@ -1824,10 +1822,10 @@ bool Aquamarine::CDRMOutput::commitState(bool onlyTest) { } } - if (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_CTM && STATE.ctm.has_value()) + if (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_CTM) data.ctm = STATE.ctm; - if (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_HDR && STATE.hdrMetadata.has_value()) + if (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_HDR) data.hdrMetadata = STATE.hdrMetadata; data.blocking = BLOCKING || formatMismatch; diff --git a/src/output/Output.cpp b/src/output/Output.cpp index 322466d..189f725 100644 --- a/src/output/Output.cpp +++ b/src/output/Output.cpp @@ -164,6 +164,8 @@ void Aquamarine::COutputState::resetExplicitFences() { } void Aquamarine::COutputState::setCTM(const Hyprutils::Math::Mat3x3& ctm) { + internalState.hasCtm = ctm != Hyprutils::Math::Mat3x3::identity(); + if (internalState.ctm == ctm) return; @@ -180,7 +182,8 @@ void Aquamarine::COutputState::setWideColorGamut(bool wcg) { } void Aquamarine::COutputState::setHDRMetadata(const hdr_output_metadata& metadata) { - internalState.hdrMetadata = metadata; + internalState.hasHdrMetadata = metadata.hdmi_metadata_type1.eotf != 0; + internalState.hdrMetadata = metadata; internalState.committed |= AQ_OUTPUT_STATE_HDR; }