aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2016-06-23 04:36:44 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-06-23 04:36:44 +0000
commit7ca774626162860edcb8232863bacb7a729d3673 (patch)
treef7f588249aedc426a205e70755e067aee9b511ce
parentc04f1f9a2f6df48fcd3dd8cbc720b649068120e5 (diff)
parentb4cf01b8eab70b554b3ddcad10cade7b6f0ffe0f (diff)
downloaddrm_hwcomposer-7ca774626162860edcb8232863bacb7a729d3673.tar.gz
DO NOT MERGE: drm_hwcomposer: On error, free active composition
am: b4cf01b8ea Change-Id: I3afa118c0e6d9ffbfc2c5f2e77d09b027882da4d
-rw-r--r--drmdisplaycompositor.cpp26
-rw-r--r--drmdisplaycompositor.h1
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);