diff options
| author | Vishnu Nair <vishnun@google.com> | 2022-02-24 23:18:22 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-02-24 23:18:22 +0000 |
| commit | 7da5f02dc987a30939a6e35cc12fa0e4a42bd93f (patch) | |
| tree | 30d773a6607927dfcf2a310b60f15988e7a63040 /core/java | |
| parent | c67e95c7f8e5835b716f12ba8fb92cf0f560513b (diff) | |
| parent | 6011059ed07abafa7fe0180848302191c72160de (diff) | |
Merge changes from topics "cherrypick-sv-changes-8cq54jfvx9", "sv-changes-tm-dev" into tm-dev
* changes:
SurfaceView: Synchronize all surface view changes with VRI draw
SurfaceView: Avoid destination frame updates on multiple threads 1/2
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/SurfaceControl.java | 22 | ||||
| -rw-r--r-- | core/java/android/view/SurfaceView.java | 211 | ||||
| -rw-r--r-- | core/java/android/widget/inline/InlineContentView.java | 5 |
3 files changed, 116 insertions, 122 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 6b81667e9074..64f5668d8c14 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -265,6 +265,8 @@ public final class SurfaceControl implements Parcelable { private static native void nativeAddTransactionCommittedListener(long nativeObject, TransactionCommittedListener listener); private static native void nativeSanitize(long transactionObject); + private static native void nativeSetDestinationFrame(long transactionObj, long nativeObject, + int l, int t, int r, int b); /** * Transforms that can be applied to buffers as they are displayed to a window. @@ -3850,6 +3852,26 @@ public final class SurfaceControl implements Parcelable { } /** + * @hide + */ + public Transaction setDesintationFrame(SurfaceControl sc, @NonNull Rect destinationFrame) { + checkPreconditions(sc); + nativeSetDestinationFrame(mNativeObject, sc.mNativeObject, + destinationFrame.left, destinationFrame.top, destinationFrame.right, + destinationFrame.bottom); + return this; + } + + /** + * @hide + */ + public Transaction setDesintationFrame(SurfaceControl sc, int width, int height) { + checkPreconditions(sc); + nativeSetDestinationFrame(mNativeObject, sc.mNativeObject, 0, 0, width, height); + return this; + } + + /** * Merge the other transaction into this transaction, clearing the * other transaction as if it had been applied. * diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 1a458ce5c8ba..55300b3fec36 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -133,9 +133,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private boolean mDisableBackgroundLayer = false; /** - * We use this lock to protect access to mSurfaceControl and - * SurfaceViewPositionUpdateListener#mPositionChangedTransaction. Both are accessed on the UI - * thread and the render thread. + * We use this lock to protect access to mSurfaceControl. Both are accessed on the UI + * thread and the render thread via RenderNode.PositionUpdateListener#positionLost. */ final Object mSurfaceControlLock = new Object(); final Rect mTmpRect = new Rect(); @@ -224,12 +223,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private final SurfaceControl.Transaction mFrameCallbackTransaction = new SurfaceControl.Transaction(); - /** - * A temporary transaction holder that should only be used when applying right away. There - * should be no assumption about thread safety for this transaction. - */ - private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction(); - private int mParentSurfaceSequenceId; private RemoteAccessibilityController mRemoteAccessibilityController = @@ -760,7 +753,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mBlastBufferQueue = null; } - Transaction transaction = new Transaction(); + final Transaction transaction = new Transaction(); if (mSurfaceControl != null) { transaction.remove(mSurfaceControl); mSurfaceControl = null; @@ -790,22 +783,18 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // synchronously otherwise we may see flickers. // When the listener is updated, we will get at least a single position update call so we can // guarantee any changes we post will be applied. - private void replacePositionUpdateListener(int surfaceWidth, int surfaceHeight, - Transaction geometryTransaction) { + private void replacePositionUpdateListener(int surfaceWidth, int surfaceHeight) { if (mPositionListener != null) { mRenderNode.removePositionUpdateListener(mPositionListener); - synchronized (mSurfaceControlLock) { - geometryTransaction = mPositionListener.getTransaction().merge(geometryTransaction); - } } mPositionListener = new SurfaceViewPositionUpdateListener(surfaceWidth, surfaceHeight, - geometryTransaction); + mSurfaceControl); mRenderNode.addPositionUpdateListener(mPositionListener); } private boolean performSurfaceTransaction(ViewRootImpl viewRoot, Translator translator, boolean creating, boolean sizeChanged, boolean hintChanged, - Transaction geometryTransaction) { + Transaction surfaceUpdateTransaction) { boolean realSizeChanged = false; mSurfaceLock.lock(); @@ -820,56 +809,60 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // SurfaceChangedCallback to update the relative z. This is needed so that // we do not change the relative z before the server is ready to swap the // parent surface. - if (creating || (mParentSurfaceSequenceId == viewRoot.getSurfaceSequenceId())) { - updateRelativeZ(mTmpTransaction); + if (creating) { + updateRelativeZ(surfaceUpdateTransaction); + if (mSurfacePackage != null) { + reparentSurfacePackage(surfaceUpdateTransaction, mSurfacePackage); + } } mParentSurfaceSequenceId = viewRoot.getSurfaceSequenceId(); if (mViewVisibility) { - geometryTransaction.show(mSurfaceControl); + surfaceUpdateTransaction.show(mSurfaceControl); } else { - geometryTransaction.hide(mSurfaceControl); + surfaceUpdateTransaction.hide(mSurfaceControl); } - if (mSurfacePackage != null) { - reparentSurfacePackage(mTmpTransaction, mSurfacePackage); - } - updateBackgroundVisibility(mTmpTransaction); - updateBackgroundColor(mTmpTransaction); + + updateBackgroundVisibility(surfaceUpdateTransaction); + updateBackgroundColor(surfaceUpdateTransaction); if (mUseAlpha) { float alpha = getFixedAlpha(); - mTmpTransaction.setAlpha(mSurfaceControl, alpha); + surfaceUpdateTransaction.setAlpha(mSurfaceControl, alpha); mSurfaceAlpha = alpha; } - geometryTransaction.setCornerRadius(mSurfaceControl, mCornerRadius); + surfaceUpdateTransaction.setCornerRadius(mSurfaceControl, mCornerRadius); if ((sizeChanged || hintChanged) && !creating) { - setBufferSize(geometryTransaction); + setBufferSize(surfaceUpdateTransaction); } if (sizeChanged || creating || !isHardwareAccelerated()) { - onSetSurfacePositionAndScaleRT(geometryTransaction, mSurfaceControl, - mScreenRect.left, /*positionLeft*/ - mScreenRect.top /*positionTop*/ , - mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/, - mScreenRect.height() / (float) mSurfaceHeight /*postScaleY*/); // Set a window crop when creating the surface or changing its size to // crop the buffer to the surface size since the buffer producer may // use SCALING_MODE_SCALE and submit a larger size than the surface // size. if (mClipSurfaceToBounds && mClipBounds != null) { - geometryTransaction.setWindowCrop(mSurfaceControl, mClipBounds); + surfaceUpdateTransaction.setWindowCrop(mSurfaceControl, mClipBounds); } else { - geometryTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth, + surfaceUpdateTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth, mSurfaceHeight); } + surfaceUpdateTransaction.setDesintationFrame(mBlastSurfaceControl, mSurfaceWidth, + mSurfaceHeight); + if (isHardwareAccelerated()) { // This will consume the passed in transaction and the transaction will be // applied on a render worker thread. - replacePositionUpdateListener(mSurfaceWidth, mSurfaceHeight, - geometryTransaction); + replacePositionUpdateListener(mSurfaceWidth, mSurfaceHeight); + } else { + onSetSurfacePositionAndScale(surfaceUpdateTransaction, mSurfaceControl, + mScreenRect.left /*positionLeft*/, + mScreenRect.top /*positionTop*/, + mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/, + mScreenRect.height() / (float) mSurfaceHeight /*postScaleY*/); } if (DEBUG_POSITION) { Log.d(TAG, String.format( @@ -881,8 +874,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mScreenRect.bottom, mSurfaceWidth, mSurfaceHeight)); } } - mTmpTransaction.merge(geometryTransaction); - mTmpTransaction.apply(); + applyTransactionOnVriDraw(surfaceUpdateTransaction); updateEmbeddedAccessibilityMatrix(); mSurfaceFrame.left = 0; @@ -990,17 +982,17 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mScreenRect.offset(surfaceInsets.left, surfaceInsets.top); // Collect all geometry changes and apply these changes on the RenderThread worker // via the RenderNode.PositionUpdateListener. - final Transaction geometryTransaction = new Transaction(); + final Transaction surfaceUpdateTransaction = new Transaction(); if (creating) { updateOpaqueFlag(); final String name = "SurfaceView[" + viewRoot.getTitle().toString() + "]"; - createBlastSurfaceControls(viewRoot, name, geometryTransaction); + createBlastSurfaceControls(viewRoot, name, surfaceUpdateTransaction); } else if (mSurfaceControl == null) { return; } final boolean realSizeChanged = performSurfaceTransaction(viewRoot, - translator, creating, sizeChanged, hintChanged, geometryTransaction); + translator, creating, sizeChanged, hintChanged, surfaceUpdateTransaction); final boolean redrawNeeded = sizeChanged || creating || hintChanged || (mVisible && !mDrawFinished); @@ -1107,7 +1099,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mBlastSurfaceControl.setTransformHint(mTransformHint); if (mBlastBufferQueue != null) { mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, - mFormat, transaction); + mFormat); } } @@ -1136,7 +1128,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * */ private void createBlastSurfaceControls(ViewRootImpl viewRoot, String name, - Transaction geometryTransaction) { + Transaction surfaceUpdateTransaction) { if (mSurfaceControl == null) { mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession) .setName(name) @@ -1159,11 +1151,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall .build(); } else { // update blast layer - mTmpTransaction + surfaceUpdateTransaction .setOpaque(mBlastSurfaceControl, (mSurfaceFlags & SurfaceControl.OPAQUE) != 0) .setSecure(mBlastSurfaceControl, (mSurfaceFlags & SurfaceControl.SECURE) != 0) - .show(mBlastSurfaceControl) - .apply(); + .show(mBlastSurfaceControl); } if (mBackgroundControl == null) { @@ -1184,9 +1175,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } mTransformHint = viewRoot.getBufferTransformHint(); mBlastSurfaceControl.setTransformHint(mTransformHint); - mBlastBufferQueue = new BLASTBufferQueue(name); - mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, mFormat, - geometryTransaction); + mBlastBufferQueue = new BLASTBufferQueue(name, false /* updateDestinationFrame */); + mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, mFormat); } private void onDrawFinished(Transaction t) { @@ -1211,7 +1201,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * * @hide */ - protected void onSetSurfacePositionAndScaleRT(@NonNull Transaction transaction, + protected void onSetSurfacePositionAndScale(@NonNull Transaction transaction, @NonNull SurfaceControl surface, int positionLeft, int positionTop, float postScaleX, float postScaleY) { transaction.setPosition(surface, positionLeft, positionTop); @@ -1224,12 +1214,14 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall if (mSurfaceControl == null) { return; } - onSetSurfacePositionAndScaleRT(mTmpTransaction, mSurfaceControl, + final Transaction transaction = new Transaction(); + onSetSurfacePositionAndScale(transaction, mSurfaceControl, mScreenRect.left, /*positionLeft*/ mScreenRect.top/*positionTop*/ , mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/, mScreenRect.height() / (float) mSurfaceHeight /*postScaleY*/); - mTmpTransaction.apply(); + applyTransactionOnVriDraw(transaction); + invalidate(); } /** @@ -1251,66 +1243,57 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } } - private Rect mRTLastReportedPosition = new Rect(); - private Point mRTLastReportedSurfaceSize = new Point(); + private final Rect mRTLastReportedPosition = new Rect(); + private final Point mRTLastReportedSurfaceSize = new Point(); private class SurfaceViewPositionUpdateListener implements RenderNode.PositionUpdateListener { - int mRtSurfaceWidth = -1; - int mRtSurfaceHeight = -1; + private final int mRtSurfaceWidth; + private final int mRtSurfaceHeight; private final SurfaceControl.Transaction mPositionChangedTransaction = new SurfaceControl.Transaction(); - boolean mPendingTransaction = false; + private final SurfaceControl mRtSurfaceControl = new SurfaceControl(); SurfaceViewPositionUpdateListener(int surfaceWidth, int surfaceHeight, - @Nullable Transaction t) { + SurfaceControl surfaceControl) { mRtSurfaceWidth = surfaceWidth; mRtSurfaceHeight = surfaceHeight; - if (t != null) { - mPositionChangedTransaction.merge(t); - mPendingTransaction = true; - } + mRtSurfaceControl.copyFrom(surfaceControl, "SurfaceViewPositionUpdateListener"); } @Override public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { - synchronized(mSurfaceControlLock) { - if (mSurfaceControl == null) { - return; - } - if (mRTLastReportedPosition.left == left - && mRTLastReportedPosition.top == top - && mRTLastReportedPosition.right == right - && mRTLastReportedPosition.bottom == bottom - && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth - && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight - && !mPendingTransaction) { - return; + if (mRTLastReportedPosition.left == left + && mRTLastReportedPosition.top == top + && mRTLastReportedPosition.right == right + && mRTLastReportedPosition.bottom == bottom + && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth + && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight) { + return; + } + try { + if (DEBUG_POSITION) { + Log.d(TAG, String.format( + "%d updateSurfacePosition RenderWorker, frameNr = %d, " + + "position = [%d, %d, %d, %d] surfaceSize = %dx%d", + System.identityHashCode(SurfaceView.this), frameNumber, + left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight)); } - try { - if (DEBUG_POSITION) { - Log.d(TAG, String.format( - "%d updateSurfacePosition RenderWorker, frameNr = %d, " - + "position = [%d, %d, %d, %d] surfaceSize = %dx%d", - System.identityHashCode(SurfaceView.this), frameNumber, - left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight)); - } - mRTLastReportedPosition.set(left, top, right, bottom); - mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight); - onSetSurfacePositionAndScaleRT(mPositionChangedTransaction, mSurfaceControl, - mRTLastReportedPosition.left /*positionLeft*/, - mRTLastReportedPosition.top /*positionTop*/, - mRTLastReportedPosition.width() - / (float) mRtSurfaceWidth /*postScaleX*/, - mRTLastReportedPosition.height() - / (float) mRtSurfaceHeight /*postScaleY*/); - if (mViewVisibility) { - mPositionChangedTransaction.show(mSurfaceControl); - } - applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); - mPendingTransaction = false; - } catch (Exception ex) { - Log.e(TAG, "Exception from repositionChild", ex); + mRTLastReportedPosition.set(left, top, right, bottom); + mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight); + onSetSurfacePositionAndScale(mPositionChangedTransaction, mRtSurfaceControl, + mRTLastReportedPosition.left /*positionLeft*/, + mRTLastReportedPosition.top /*positionTop*/, + mRTLastReportedPosition.width() + / (float) mRtSurfaceWidth /*postScaleX*/, + mRTLastReportedPosition.height() + / (float) mRtSurfaceHeight /*postScaleY*/); + if (mViewVisibility) { + // b/131239825 + mPositionChangedTransaction.show(mRtSurfaceControl); } + applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); + } catch (Exception ex) { + Log.e(TAG, "Exception from repositionChild", ex); } } @@ -1319,7 +1302,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall float vecX, float vecY, float maxStretchX, float maxStretchY, float childRelativeLeft, float childRelativeTop, float childRelativeRight, float childRelativeBottom) { - mRtTransaction.setStretchEffect(mSurfaceControl, width, height, vecX, vecY, + mRtTransaction.setStretchEffect(mRtSurfaceControl, width, height, vecX, vecY, maxStretchX, maxStretchY, childRelativeLeft, childRelativeTop, childRelativeRight, childRelativeBottom); applyOrMergeTransaction(mRtTransaction, frameNumber); @@ -1334,28 +1317,14 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mRTLastReportedPosition.setEmpty(); mRTLastReportedSurfaceSize.set(-1, -1); - /** - * positionLost can be called while UI thread is un-paused so we - * need to hold the lock here. - */ + // positionLost can be called while UI thread is un-paused. synchronized (mSurfaceControlLock) { - if (mPendingTransaction) { - Log.w(TAG, System.identityHashCode(SurfaceView.this) - + "Pending transaction cleared."); - mPositionChangedTransaction.clear(); - mPendingTransaction = false; - } - if (mSurfaceControl == null) { - return; - } + if (mSurfaceControl == null) return; + // b/131239825 mRtTransaction.hide(mSurfaceControl); applyOrMergeTransaction(mRtTransaction, frameNumber); } } - - public Transaction getTransaction() { - return mPositionChangedTransaction; - } } private SurfaceViewPositionUpdateListener mPositionListener = null; @@ -1402,8 +1371,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * @hide */ public void setResizeBackgroundColor(int bgColor) { - setResizeBackgroundColor(mTmpTransaction, bgColor); - mTmpTransaction.apply(); + final SurfaceControl.Transaction transaction = new SurfaceControl.Transaction(); + setResizeBackgroundColor(transaction, bgColor); + applyTransactionOnVriDraw(transaction); + invalidate(); } /** diff --git a/core/java/android/widget/inline/InlineContentView.java b/core/java/android/widget/inline/InlineContentView.java index 9712311aab7c..e4f483a29343 100644 --- a/core/java/android/widget/inline/InlineContentView.java +++ b/core/java/android/widget/inline/InlineContentView.java @@ -230,8 +230,9 @@ public class InlineContentView extends ViewGroup { int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mSurfaceView = new SurfaceView(context, attrs, defStyleAttr, defStyleRes) { + // b/219807628 @Override - protected void onSetSurfacePositionAndScaleRT( + protected void onSetSurfacePositionAndScale( @NonNull SurfaceControl.Transaction transaction, @NonNull SurfaceControl surface, int positionLeft, int positionTop, float postScaleX, float postScaleY) { @@ -248,7 +249,7 @@ public class InlineContentView extends ViewGroup { postScaleX = InlineContentView.this.getScaleX(); postScaleY = InlineContentView.this.getScaleY(); - super.onSetSurfacePositionAndScaleRT(transaction, surface, positionLeft, + super.onSetSurfacePositionAndScale(transaction, surface, positionLeft, positionTop, postScaleX, postScaleY); } }; |
