summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Stoza <stoza@google.com>2015-05-14 18:19:03 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-05-14 18:19:03 +0000
commit7472fa996a4dbd4ce89e3875533ef28686df7343 (patch)
treed924f14d55e903f7ebb2b9613958e97133fbfa77
parent0f6e43f8745af6f36fa97a1221e0f3ad15d1c0d3 (diff)
parent81103f128d651d705c90b3ab9fe55bff674320ef (diff)
downloadframeworks_native-7472fa996a4dbd4ce89e3875533ef28686df7343.zip
frameworks_native-7472fa996a4dbd4ce89e3875533ef28686df7343.tar.gz
frameworks_native-7472fa996a4dbd4ce89e3875533ef28686df7343.tar.bz2
am 81103f12: am 553cbb25: Merge "SurfaceFlinger: Handle EGL errors more cleanly"
* commit '81103f128d651d705c90b3ab9fe55bff674320ef': SurfaceFlinger: Handle EGL errors more cleanly
-rw-r--r--services/surfaceflinger/Layer.cpp21
-rw-r--r--services/surfaceflinger/Layer.h1
2 files changed, 21 insertions, 1 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 2b733e9..8d8af52 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -84,7 +84,8 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
mQueueItemLock(),
mQueueItemCondition(),
mQueueItems(),
- mLastFrameNumberReceived(0)
+ mLastFrameNumberReceived(0),
+ mUpdateTexImageFailed(false)
{
mCurrentCrop.makeInvalid();
mFlinger->getRenderEngine().genTextures(1, &mTextureName);
@@ -1314,6 +1315,24 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions)
mQueueItems.removeAt(0);
android_atomic_dec(&mQueuedFrames);
return outDirtyRegion;
+ } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
+ // This can occur if something goes wrong when trying to create the
+ // EGLImage for this buffer. If this happens, the buffer has already
+ // been released, so we need to clean up the queue and bug out
+ // early.
+ {
+ Mutex::Autolock lock(mQueueItemLock);
+ mQueueItems.clear();
+ android_atomic_and(0, &mQueuedFrames);
+ }
+
+ // Once we have hit this state, the shadow queue may no longer
+ // correctly reflect the incoming BufferQueue's contents, so even if
+ // updateTexImage starts working, the only safe course of action is
+ // to continue to ignore updates.
+ mUpdateTexImageFailed = true;
+
+ return outDirtyRegion;
}
{ // Autolock scope
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 947da85..4e222b7 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -419,6 +419,7 @@ private:
Condition mQueueItemCondition;
Vector<BufferItem> mQueueItems;
uint64_t mLastFrameNumberReceived;
+ bool mUpdateTexImageFailed; // This is only modified from the main thread
};
// ---------------------------------------------------------------------------