diff options
author | Sean Paul <seanpaul@chromium.org> | 2016-06-23 04:36:44 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-06-23 04:36:44 +0000 |
commit | 7ca774626162860edcb8232863bacb7a729d3673 (patch) | |
tree | f7f588249aedc426a205e70755e067aee9b511ce | |
parent | c04f1f9a2f6df48fcd3dd8cbc720b649068120e5 (diff) | |
parent | b4cf01b8eab70b554b3ddcad10cade7b6f0ffe0f (diff) | |
download | drm_hwcomposer-7ca774626162860edcb8232863bacb7a729d3673.tar.gz |
DO NOT MERGE: drm_hwcomposer: On error, free active composition
am: b4cf01b8ea
Change-Id: I3afa118c0e6d9ffbfc2c5f2e77d09b027882da4d
-rw-r--r-- | drmdisplaycompositor.cpp | 26 | ||||
-rw-r--r-- | drmdisplaycompositor.h | 1 |
2 files changed, 24 insertions, 3 deletions
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp index 0b2506f..279d5a6 100644 --- a/drmdisplaycompositor.cpp +++ b/drmdisplaycompositor.cpp @@ -864,6 +864,23 @@ std::tuple<int, uint32_t> DrmDisplayCompositor::CreateModeBlob( return std::make_tuple(ret, id); } +void DrmDisplayCompositor::ClearDisplay() { + AutoLock lock(&lock_, "compositor"); + int ret = lock.Lock(); + if (ret) + return; + + if (!active_composition_) + return; + + if (DisablePlanes(active_composition_.get())) + return; + + active_composition_->SignalCompositionDone(); + + active_composition_.reset(NULL); +} + void DrmDisplayCompositor::ApplyFrame( std::unique_ptr<DrmDisplayComposition> composition, int status) { int ret = status; @@ -873,11 +890,10 @@ void DrmDisplayCompositor::ApplyFrame( if (ret) { ALOGE("Composite failed for display %d", display_); - // Disable the hw used by the last active composition. This allows us to // signal the release fences from that composition to avoid hanging. - if (DisablePlanes(active_composition_.get())) - return; + ClearDisplay(); + return; } ++dump_frames_composited_; @@ -958,6 +974,10 @@ int DrmDisplayCompositor::Composite() { composition = std::move(squashed); } else { ALOGE("Failed to squash frame for display %d", display_); + // Disable the hw used by the last active composition. This allows us + // to signal the release fences from that composition to avoid + // hanging. + ClearDisplay(); return ret; } } diff --git a/drmdisplaycompositor.h b/drmdisplaycompositor.h index e4c3b53..9487cac 100644 --- a/drmdisplaycompositor.h +++ b/drmdisplaycompositor.h @@ -149,6 +149,7 @@ class DrmDisplayCompositor { int ApplyDpms(DrmDisplayComposition *display_comp); int DisablePlanes(DrmDisplayComposition *display_comp); + void ClearDisplay(); void ApplyFrame(std::unique_ptr<DrmDisplayComposition> composition, int status); |