diff options
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b5e8dd8212e3..3534bb0f763f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1748,13 +1748,17 @@ public final class ViewRootImpl implements ViewParent, return null; } + Surface ret = null; if (mBlastBufferQueue == null) { mBlastBufferQueue = new BLASTBufferQueue( mBlastSurfaceControl, width, height); + // We only return the Surface the first time, as otherwise + // it hasn't changed and there is no need to update. + ret = mBlastBufferQueue.getSurface(); } mBlastBufferQueue.update(mBlastSurfaceControl, width, height); - return mBlastBufferQueue.getSurface(); + return ret; } private void setBoundsLayerCrop() { @@ -7349,8 +7353,14 @@ public final class ViewRootImpl implements ViewParent, if (!mUseBLASTAdapter) { mSurface.copyFrom(mSurfaceControl); } else { - mSurface.transferFrom(getOrCreateBLASTSurface(mSurfaceSize.x, - mSurfaceSize.y)); + final Surface blastSurface = getOrCreateBLASTSurface(mSurfaceSize.x, + mSurfaceSize.y); + // If blastSurface == null that means it hasn't changed since the last time we + // called. In this situation, avoid calling transferFrom as we would then + // inc the generation ID and cause EGL resources to be recreated. + if (blastSurface != null) { + mSurface.transferFrom(blastSurface); + } } } else { destroySurface(); |