summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/surfaceflinger/Layer.cpp30
-rw-r--r--services/surfaceflinger/Layer.h1
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp2
-rw-r--r--services/surfaceflinger/SurfaceFlingerConsumer.cpp12
-rw-r--r--services/surfaceflinger/SurfaceFlingerConsumer.h5
-rw-r--r--services/surfaceflinger/SurfaceFlinger_hwc1.cpp2
6 files changed, 38 insertions, 14 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 46a7338b10..4ea029f5b1 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -82,7 +82,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
mCurrentOpacity(true),
mBufferLatched(false),
mCurrentFrameNumber(0),
- mPreviousFrameNumber(-1U),
+ mPreviousFrameNumber(0),
mRefreshPending(false),
mFrameLatencyNeeded(false),
mFiltering(false),
@@ -1904,8 +1904,10 @@ bool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
Mutex::Autolock lock(mFrameEventHistoryMutex);
mFrameEventHistory.addPostComposition(mCurrentFrameNumber,
glDoneFence, presentFence, compositorTiming);
- mFrameEventHistory.addRetire(mPreviousFrameNumber,
- retireFence);
+ if (mPreviousFrameNumber != 0) {
+ mFrameEventHistory.addRetire(mPreviousFrameNumber,
+ retireFence);
+ }
}
// Update mFrameTracker.
@@ -1943,14 +1945,19 @@ bool Layer::onPostComposition(const std::shared_ptr<FenceTime>& glDoneFence,
#ifdef USE_HWC2
void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
- mSurfaceFlingerConsumer->releasePendingBuffer();
+ if (!mSurfaceFlingerConsumer->releasePendingBuffer()) {
+ return;
+ }
+
auto releaseFenceTime = std::make_shared<FenceTime>(
mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
mReleaseTimeline.push(releaseFenceTime);
Mutex::Autolock lock(mFrameEventHistoryMutex);
- mFrameEventHistory.addRelease(
- mPreviousFrameNumber, dequeueReadyTime, std::move(releaseFenceTime));
+ if (mPreviousFrameNumber != 0) {
+ mFrameEventHistory.addRelease(mPreviousFrameNumber,
+ dequeueReadyTime, std::move(releaseFenceTime));
+ }
}
#endif
@@ -2136,8 +2143,10 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime)
auto releaseFenceTime = std::make_shared<FenceTime>(
mSurfaceFlingerConsumer->getPrevFinalReleaseFence());
mReleaseTimeline.push(releaseFenceTime);
- mFrameEventHistory.addRelease(
- mPreviousFrameNumber, latchTime, std::move(releaseFenceTime));
+ if (mPreviousFrameNumber != 0) {
+ mFrameEventHistory.addRelease(mPreviousFrameNumber,
+ latchTime, std::move(releaseFenceTime));
+ }
#endif
}
@@ -2372,6 +2381,11 @@ void Layer::dumpFrameEvents(String8& result) {
mFrameEventHistory.dump(result);
}
+void Layer::onDisconnect() {
+ Mutex::Autolock lock(mFrameEventHistoryMutex);
+ mFrameEventHistory.onDisconnect();
+}
+
void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
FrameEventHistoryDelta *outDelta) {
Mutex::Autolock lock(mFrameEventHistoryMutex);
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index c578e077fe..ae2c962588 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -444,6 +444,7 @@ public:
std::vector<OccupancyTracker::Segment> getOccupancyHistory(bool forceFlush);
+ void onDisconnect();
void addAndGetFrameTimestamps(const NewFrameEventsEntry* newEntry,
FrameEventHistoryDelta* outDelta);
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 462e5a6758..215628de0f 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -639,7 +639,7 @@ status_t SurfaceFlinger::getSupportedFrameTimestamps(
FrameEvent::LATCH,
FrameEvent::FIRST_REFRESH_START,
FrameEvent::LAST_REFRESH_START,
- FrameEvent::GL_COMPOSITION_DONE,
+ FrameEvent::GPU_COMPOSITION_DONE,
getHwComposer().presentFenceRepresentsStartOfScanout() ?
FrameEvent::DISPLAY_PRESENT : FrameEvent::DISPLAY_RETIRE,
FrameEvent::DEQUEUE_READY,
diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.cpp b/services/surfaceflinger/SurfaceFlingerConsumer.cpp
index 942af139ec..bb1ff06065 100644
--- a/services/surfaceflinger/SurfaceFlingerConsumer.cpp
+++ b/services/surfaceflinger/SurfaceFlingerConsumer.cpp
@@ -211,11 +211,11 @@ void SurfaceFlingerConsumer::setReleaseFence(const sp<Fence>& fence)
}
}
-void SurfaceFlingerConsumer::releasePendingBuffer()
+bool SurfaceFlingerConsumer::releasePendingBuffer()
{
if (!mPendingRelease.isPending) {
ALOGV("Pending buffer already released");
- return;
+ return false;
}
ALOGV("Releasing pending buffer");
Mutex::Autolock lock(mMutex);
@@ -225,6 +225,7 @@ void SurfaceFlingerConsumer::releasePendingBuffer()
ALOGE_IF(result != NO_ERROR, "releasePendingBuffer failed: %s (%d)",
strerror(-result), result);
mPendingRelease = PendingRelease();
+ return true;
}
#endif
@@ -261,6 +262,13 @@ void SurfaceFlingerConsumer::onSidebandStreamChanged() {
}
}
+void SurfaceFlingerConsumer::onDisconnect() {
+ sp<Layer> l = mLayer.promote();
+ if (l.get()) {
+ l->onDisconnect();
+ }
+}
+
void SurfaceFlingerConsumer::addAndGetFrameTimestamps(
const NewFrameEventsEntry* newTimestamps,
FrameEventHistoryDelta *outDelta) {
diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.h b/services/surfaceflinger/SurfaceFlingerConsumer.h
index 7713ed2408..1531e2c5ca 100644
--- a/services/surfaceflinger/SurfaceFlingerConsumer.h
+++ b/services/surfaceflinger/SurfaceFlingerConsumer.h
@@ -82,10 +82,11 @@ public:
sp<Fence> getPrevFinalReleaseFence() const;
#ifdef USE_HWC2
virtual void setReleaseFence(const sp<Fence>& fence) override;
- void releasePendingBuffer();
+ bool releasePendingBuffer();
#endif
- virtual void addAndGetFrameTimestamps(
+ void onDisconnect() override;
+ void addAndGetFrameTimestamps(
const NewFrameEventsEntry* newTimestamps,
FrameEventHistoryDelta* outDelta) override;
diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp
index 477eb27063..e6ab29a4fb 100644
--- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp
+++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp
@@ -640,7 +640,7 @@ status_t SurfaceFlinger::getSupportedFrameTimestamps(
FrameEvent::LATCH,
FrameEvent::FIRST_REFRESH_START,
FrameEvent::LAST_REFRESH_START,
- FrameEvent::GL_COMPOSITION_DONE,
+ FrameEvent::GPU_COMPOSITION_DONE,
FrameEvent::DISPLAY_RETIRE,
FrameEvent::DEQUEUE_READY,
FrameEvent::RELEASE,