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
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user