drm_hwcomposer: Rework display Mode Setting and DPMS handling
1. Remove DPMS logic. As stated in KMS kernel docs: CRTC "activate"
property was implemented as a simplified atomic replacement of DPMS.
And kernel internally will just update "activate" on DPMS setting.
2. Add SetDisplayActivate(bool state) method to compositor class,
which is now replacement for SetDpmsMode().
3. Move mode settings out of DrmComposition class to DrmCompositor class.
From now on DrmComposition describes only layer-to-plane composition
as it should be.
Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp
index 6ec8b31..071f3bf 100644
--- a/DrmHwcTwo.cpp
+++ b/DrmHwcTwo.cpp
@@ -716,7 +716,7 @@
// TODO(nobody): Don't always assume geometry changed
int ret = composition->SetLayers(composition_layers.data(),
- composition_layers.size(), true);
+ composition_layers.size());
if (ret) {
ALOGE("Failed to set layers in the composition ret=%d", ret);
return HWC2::Error::BadLayer;
@@ -793,15 +793,13 @@
return HWC2::Error::BadConfig;
}
- auto composition = std::make_unique<DrmDisplayComposition>(crtc_,
- planner_.get());
- int ret = composition->SetDisplayMode(*mode);
- if (ret) {
+ if (!compositor_.SetDisplayMode(*mode)) {
return HWC2::Error::BadConfig;
}
- ret = compositor_.ApplyComposition(std::move(composition));
- if (ret) {
- ALOGE("Failed to queue dpms composition on %d", ret);
+ int err = compositor_.ApplyComposition(
+ compositor_.CreateInitializedComposition());
+ if (err != 0) {
+ ALOGE("Failed to queue mode changing commit %d", err);
return HWC2::Error::BadConfig;
}
@@ -883,14 +881,13 @@
HWC2::Error DrmHwcTwo::HwcDisplay::SetPowerMode(int32_t mode_in) {
supported(__func__);
- uint64_t dpms_value = 0;
auto mode = static_cast<HWC2::PowerMode>(mode_in);
switch (mode) {
case HWC2::PowerMode::Off:
- dpms_value = DRM_MODE_DPMS_OFF;
+ compositor_.SetDisplayActive(false);
break;
case HWC2::PowerMode::On:
- dpms_value = DRM_MODE_DPMS_ON;
+ compositor_.SetDisplayActive(true);
break;
case HWC2::PowerMode::Doze:
case HWC2::PowerMode::DozeSuspend:
@@ -900,10 +897,8 @@
return HWC2::Error::BadParameter;
};
- auto composition = std::make_unique<DrmDisplayComposition>(crtc_,
- planner_.get());
- composition->SetDpmsMode(dpms_value);
- int ret = compositor_.ApplyComposition(std::move(composition));
+ int ret = compositor_.ApplyComposition(
+ compositor_.CreateInitializedComposition());
if (ret) {
ALOGE("Failed to apply the dpms composition ret=%d", ret);
return HWC2::Error::BadParameter;