drm_hwcomposer: make sure all fences are released for DrmDisplayComposition
This change will release the layers passed back to SurfaceFlinger even on an
error in the compositor thread.
Change-Id: I22f622855c8c953a058b4a08d0af1ae427e4cbbd
diff --git a/drmdisplaycomposition.cpp b/drmdisplaycomposition.cpp
index d8dc886..cce1d56 100644
--- a/drmdisplaycomposition.cpp
+++ b/drmdisplaycomposition.cpp
@@ -45,6 +45,7 @@
type_(DRM_COMPOSITION_TYPE_EMPTY),
timeline_fd_(-1),
timeline_(0),
+ timeline_current_(0),
dpms_mode_(DRM_MODE_DPMS_ON) {
}
@@ -58,8 +59,11 @@
close(iter->layer.acquireFenceFd);
}
- if (timeline_fd_ >= 0)
+ if (timeline_fd_ >= 0) {
+ FinishComposition();
close(timeline_fd_);
+ timeline_fd_ = -1;
+ }
}
int DrmDisplayComposition::Init(DrmResources *drm, Importer *importer) {
@@ -125,9 +129,15 @@
}
int DrmDisplayComposition::FinishComposition() {
- int ret = sw_sync_timeline_inc(timeline_fd_, timeline_);
+ int timeline_increase = timeline_ - timeline_current_;
+ if (timeline_increase <= 0)
+ return 0;
+
+ int ret = sw_sync_timeline_inc(timeline_fd_, timeline_increase);
if (ret)
ALOGE("Failed to increment sync timeline %d", ret);
+ else
+ timeline_current_ = timeline_;
return ret;
}
diff --git a/drmdisplaycomposition.h b/drmdisplaycomposition.h
index 09ad3ff..1df8dee 100644
--- a/drmdisplaycomposition.h
+++ b/drmdisplaycomposition.h
@@ -76,6 +76,7 @@
int timeline_fd_;
int timeline_;
+ int timeline_current_;
DrmCompositionLayerVector_t layers_;
uint32_t dpms_mode_;