From b13de07f0b26953115f4315bc7417ca87c70594b Mon Sep 17 00:00:00 2001 From: John Reck Date: Wed, 19 Nov 2014 16:33:47 -0800 Subject: [PATCH] If the surface is lost, release it Bug: 18403246 Surface#isValid() is used throughout ViewRootImpl to determine Surface validity. However, this will return true until Surface#release() is called, even if the underlying BufferQueue is abandoned. We have a very strong signal from EGL that the Surface is now dead, so use that signal to call Surface#release() so ViewRootImpl's isValid() usage will be valid. Change-Id: Ib355560ef4ca7625c3c784174863d2d55267d93d --- core/java/android/view/ThreadedRenderer.java | 1 + core/java/android/view/ViewRootImpl.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 5579c1382c1fb..ab7796f4726db 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -340,6 +340,7 @@ public class ThreadedRenderer extends HardwareRenderer { recordDuration, view.getResources().getDisplayMetrics().density); if ((syncResult & SYNC_LOST_SURFACE_REWARD_IF_FOUND) != 0) { setEnabled(false); + attachInfo.mViewRootImpl.mSurface.release(); // Invalidate since we failed to draw. This should fetch a Surface // if it is still needed or do nothing if we are no longer drawing attachInfo.mViewRootImpl.invalidate(); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index fe174175567bd..b12c747454c36 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -245,7 +245,7 @@ public final class ViewRootImpl implements ViewParent, // These can be accessed by any thread, must be protected with a lock. // Surface can never be reassigned or cleared (use Surface.clear()). - private final Surface mSurface = new Surface(); + final Surface mSurface = new Surface(); boolean mAdded; boolean mAddedTouchMode;