diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp index 8142e6c4477252822d3f64aa432343f7f2f060f6..291bbddc30f68ec2a11ea174bd54cf451957274f 100644 --- a/DrmHwcTwo.cpp +++ b/DrmHwcTwo.cpp @@ -757,6 +757,9 @@ HWC2::Error DrmHwcTwo::HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) { } a_args.composition = composition; + if (staged_mode) { + a_args.display_mode = *staged_mode; + } ret = compositor_.ExecuteAtomicCommit(a_args); if (ret) { @@ -764,6 +767,11 @@ HWC2::Error DrmHwcTwo::HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) { ALOGE("Failed to apply the frame composition ret=%d", ret); return HWC2::Error::BadParameter; } + + if (!a_args.test_only) { + staged_mode.reset(); + } + return HWC2::Error::None; } @@ -805,16 +813,7 @@ HWC2::Error DrmHwcTwo::HwcDisplay::SetActiveConfig(hwc2_config_t config) { auto &mode = hwc_configs_[conf].mode; - AtomicCommitArgs a_args = { - .display_mode = mode, - .clear_active_composition = true, - }; - - int err = compositor_.ExecuteAtomicCommit(a_args); - if (err != 0) { - ALOGE("Failed to queue mode changing commit %d", err); - return HWC2::Error::BadConfig; - } + staged_mode = mode; active_config_id_ = conf; @@ -895,7 +894,13 @@ HWC2::Error DrmHwcTwo::HwcDisplay::SetPowerMode(int32_t mode_in) { a_args.active = false; break; case HWC2::PowerMode::On: - a_args.active = true; + /* + * Setting the display to active before we have a composition + * can break some drivers, so skip setting a_args.active to + * true, as the next composition frame will implicitly activate + * the display + */ + return HWC2::Error::None; break; case HWC2::PowerMode::Doze: case HWC2::PowerMode::DozeSuspend: diff --git a/DrmHwcTwo.h b/DrmHwcTwo.h index 7fd4fbd072daa994af033e7f6e2501c33c740a40..eb74f3217c4ddc5ba109177e8247ecd4d585bd5d 100644 --- a/DrmHwcTwo.h +++ b/DrmHwcTwo.h @@ -22,6 +22,7 @@ #include #include +#include #include "compositor/DrmDisplayCompositor.h" #include "compositor/Planner.h" @@ -347,6 +348,8 @@ class DrmHwcTwo : public hwc2_device_t { DrmHwcTwo *hwc2_; + std::optional staged_mode; + ResourceManager *resource_manager_; DrmDevice *drm_; DrmDisplayCompositor compositor_; diff --git a/compositor/DrmDisplayCompositor.h b/compositor/DrmDisplayCompositor.h index 6d2c421094d6e9434ba7c6252bfc56be214a11fa..f6333ebcc95f808004b7bbef86ca37643432db52 100644 --- a/compositor/DrmDisplayCompositor.h +++ b/compositor/DrmDisplayCompositor.h @@ -23,6 +23,7 @@ #include #include +#include #include #include