Merge "WindowStateAnimator: Abstract global transaction usage (1/n)."
This commit is contained in:
@@ -267,7 +267,7 @@ public final class SurfaceControl implements Parcelable {
|
||||
|
||||
private WeakReference<View> mLocalOwnerView;
|
||||
|
||||
static Transaction sGlobalTransaction;
|
||||
static GlobalTransactionWrapper sGlobalTransaction;
|
||||
static long sTransactionNestCount = 0;
|
||||
|
||||
/**
|
||||
@@ -1453,7 +1453,7 @@ public final class SurfaceControl implements Parcelable {
|
||||
public static void openTransaction() {
|
||||
synchronized (SurfaceControl.class) {
|
||||
if (sGlobalTransaction == null) {
|
||||
sGlobalTransaction = new Transaction();
|
||||
sGlobalTransaction = new GlobalTransactionWrapper();
|
||||
}
|
||||
synchronized(SurfaceControl.class) {
|
||||
sTransactionNestCount++;
|
||||
@@ -1487,7 +1487,7 @@ public final class SurfaceControl implements Parcelable {
|
||||
} else if (--sTransactionNestCount > 0) {
|
||||
return;
|
||||
}
|
||||
sGlobalTransaction.apply();
|
||||
sGlobalTransaction.applyGlobalTransaction(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2555,7 +2555,10 @@ public final class SurfaceControl implements Parcelable {
|
||||
nativeApplyTransaction(mNativeObject, sync);
|
||||
}
|
||||
|
||||
private void applyResizedSurfaces() {
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
protected void applyResizedSurfaces() {
|
||||
for (int i = mResizedSurfaces.size() - 1; i >= 0; i--) {
|
||||
final Point size = mResizedSurfaces.valueAt(i);
|
||||
final SurfaceControl surfaceControl = mResizedSurfaces.keyAt(i);
|
||||
@@ -2567,7 +2570,10 @@ public final class SurfaceControl implements Parcelable {
|
||||
mResizedSurfaces.clear();
|
||||
}
|
||||
|
||||
private void notifyReparentedSurfaces() {
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
protected void notifyReparentedSurfaces() {
|
||||
final int reparentCount = mReparentedSurfaces.size();
|
||||
for (int i = reparentCount - 1; i >= 0; i--) {
|
||||
final SurfaceControl child = mReparentedSurfaces.keyAt(i);
|
||||
@@ -3402,6 +3408,26 @@ public final class SurfaceControl implements Parcelable {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* As part of eliminating usage of the global Transaction we expose
|
||||
* a SurfaceControl.getGlobalTransaction function. However calling
|
||||
* apply on this global transaction (rather than using closeTransaction)
|
||||
* would be very dangerous. So for the global transaction we use this
|
||||
* subclass of Transaction where the normal apply throws an exception.
|
||||
*/
|
||||
private static class GlobalTransactionWrapper extends SurfaceControl.Transaction {
|
||||
void applyGlobalTransaction(boolean sync) {
|
||||
applyResizedSurfaces();
|
||||
notifyReparentedSurfaces();
|
||||
nativeApplyTransaction(mNativeObject, sync);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(boolean sync) {
|
||||
throw new RuntimeException("Global transaction must be applied from closeTransaction");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Acquire a frame rate flexibility token, which allows surface flinger to freely switch display
|
||||
* frame rates. This is used by CTS tests to put the device in a consistent state. See
|
||||
@@ -3422,4 +3448,17 @@ public final class SurfaceControl implements Parcelable {
|
||||
public static void releaseFrameRateFlexibilityToken(long token) {
|
||||
nativeReleaseFrameRateFlexibilityToken(token);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a refactoring utility function to enable lower levels of code to be refactored
|
||||
* from using the global transaction (and instead use a passed in Transaction) without
|
||||
* having to refactor the higher levels at the same time.
|
||||
* The returned global transaction can't be applied, it must be applied from closeTransaction
|
||||
* Unless you are working on removing Global Transaction usage in the WindowManager, this
|
||||
* probably isn't a good function to use.
|
||||
* @hide
|
||||
*/
|
||||
public static Transaction getGlobalTransaction() {
|
||||
return sGlobalTransaction;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5337,7 +5337,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
// Send information to SufaceFlinger about the priority of the current window.
|
||||
updateFrameRateSelectionPriorityIfNeeded();
|
||||
|
||||
mWinAnimator.prepareSurfaceLocked(true);
|
||||
mWinAnimator.prepareSurfaceLocked(SurfaceControl.getGlobalTransaction(), true);
|
||||
notifyBlastSyncTransaction();
|
||||
super.prepareSurfaces();
|
||||
}
|
||||
|
||||
@@ -652,7 +652,7 @@ class WindowStateAnimator {
|
||||
return true;
|
||||
}
|
||||
|
||||
void setSurfaceBoundariesLocked(final boolean recoveringMemory) {
|
||||
void setSurfaceBoundariesLocked(SurfaceControl.Transaction t, final boolean recoveringMemory) {
|
||||
if (mSurfaceController == null) {
|
||||
return;
|
||||
}
|
||||
@@ -662,11 +662,11 @@ class WindowStateAnimator {
|
||||
final Task task = w.getTask();
|
||||
|
||||
if (shouldConsumeMainWindowSizeTransaction()) {
|
||||
task.getMainWindowSizeChangeTask().getSurfaceControl().deferTransactionUntil(
|
||||
mWin.getClientViewRootSurface(), mWin.getFrameNumber());
|
||||
mSurfaceController.deferTransactionUntil(mWin.getClientViewRootSurface(),
|
||||
mWin.getFrameNumber());
|
||||
SurfaceControl.mergeToGlobalTransaction(task.getMainWindowSizeChangeTransaction());
|
||||
t.deferTransactionUntil(task.getMainWindowSizeChangeTask().getSurfaceControl(),
|
||||
mWin.getClientViewRootSurface(), mWin.getFrameNumber());
|
||||
t.deferTransactionUntil(mSurfaceController.mSurfaceControl,
|
||||
mWin.getClientViewRootSurface(), mWin.getFrameNumber());
|
||||
t.merge(task.getMainWindowSizeChangeTransaction());
|
||||
task.setMainWindowSizeChangeTransaction(null);
|
||||
}
|
||||
|
||||
@@ -691,8 +691,8 @@ class WindowStateAnimator {
|
||||
// the WS position is reset (so the stack position is shown) at the same
|
||||
// time that the buffer size changes.
|
||||
setOffsetPositionForStackResize(false);
|
||||
mSurfaceController.deferTransactionUntil(mWin.getClientViewRootSurface(),
|
||||
mWin.getFrameNumber());
|
||||
t.deferTransactionUntil(mSurfaceController.mSurfaceControl,
|
||||
mWin.getClientViewRootSurface(), mWin.getFrameNumber());
|
||||
} else {
|
||||
final Task stack = mWin.getRootTask();
|
||||
mTmpPos.x = 0;
|
||||
@@ -705,9 +705,9 @@ class WindowStateAnimator {
|
||||
}
|
||||
}
|
||||
if (!mIsWallpaper) {
|
||||
mSurfaceController.setPositionInTransaction(xOffset, yOffset, recoveringMemory);
|
||||
mSurfaceController.setPosition(t, xOffset, yOffset, recoveringMemory);
|
||||
} else {
|
||||
setWallpaperPositionAndScale(
|
||||
setWallpaperPositionAndScale(t,
|
||||
xOffset, yOffset, mWallpaperScale, recoveringMemory);
|
||||
}
|
||||
}
|
||||
@@ -716,7 +716,7 @@ class WindowStateAnimator {
|
||||
// Wallpaper is already updated above when calling setWallpaperPositionAndScale so
|
||||
// we only need to consider the non-wallpaper case here.
|
||||
if (!mIsWallpaper) {
|
||||
mSurfaceController.setMatrixInTransaction(
|
||||
mSurfaceController.setMatrix(t,
|
||||
mDsDx * w.mHScale,
|
||||
mDtDx * w.mVScale,
|
||||
mDtDy * w.mHScale,
|
||||
@@ -738,7 +738,7 @@ class WindowStateAnimator {
|
||||
}
|
||||
}
|
||||
|
||||
void prepareSurfaceLocked(final boolean recoveringMemory) {
|
||||
void prepareSurfaceLocked(SurfaceControl.Transaction t, final boolean recoveringMemory) {
|
||||
final WindowState w = mWin;
|
||||
if (!hasSurface()) {
|
||||
|
||||
@@ -755,7 +755,7 @@ class WindowStateAnimator {
|
||||
|
||||
computeShownFrameLocked();
|
||||
|
||||
setSurfaceBoundariesLocked(recoveringMemory);
|
||||
setSurfaceBoundariesLocked(t, recoveringMemory);
|
||||
|
||||
if (mIsWallpaper && !w.mWallpaperVisible) {
|
||||
// Wallpaper is no longer visible and there is no wp target => hide it.
|
||||
@@ -797,7 +797,7 @@ class WindowStateAnimator {
|
||||
boolean prepared = true;
|
||||
|
||||
if (mIsWallpaper) {
|
||||
setWallpaperPositionAndScale(
|
||||
setWallpaperPositionAndScale(t,
|
||||
mXOffset, mYOffset, mWallpaperScale, recoveringMemory);
|
||||
} else {
|
||||
prepared =
|
||||
@@ -884,7 +884,8 @@ class WindowStateAnimator {
|
||||
Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset");
|
||||
}
|
||||
mService.openSurfaceTransaction();
|
||||
setWallpaperPositionAndScale(dx, dy, scale, false);
|
||||
setWallpaperPositionAndScale(SurfaceControl.getGlobalTransaction(),
|
||||
dx, dy, scale, false);
|
||||
} catch (RuntimeException e) {
|
||||
Slog.w(TAG, "Error positioning surface of " + mWin
|
||||
+ " pos=(" + dx + "," + dy + ")", e);
|
||||
@@ -899,8 +900,8 @@ class WindowStateAnimator {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void setWallpaperPositionAndScale(int dx, int dy, float scale,
|
||||
boolean recoveringMemory) {
|
||||
private void setWallpaperPositionAndScale(SurfaceControl.Transaction t,
|
||||
int dx, int dy, float scale, boolean recoveringMemory) {
|
||||
DisplayInfo displayInfo = mWin.getDisplayInfo();
|
||||
Matrix matrix = mWin.mTmpMatrix;
|
||||
matrix.setTranslate(dx, dy);
|
||||
@@ -909,9 +910,9 @@ class WindowStateAnimator {
|
||||
matrix.getValues(mWin.mTmpMatrixArray);
|
||||
matrix.reset();
|
||||
|
||||
mSurfaceController.setPositionInTransaction(mWin.mTmpMatrixArray[MTRANS_X],
|
||||
mSurfaceController.setPosition(t,mWin.mTmpMatrixArray[MTRANS_X],
|
||||
mWin.mTmpMatrixArray[MTRANS_Y], recoveringMemory);
|
||||
mSurfaceController.setMatrixInTransaction(
|
||||
mSurfaceController.setMatrix(t,
|
||||
mDsDx * mWin.mTmpMatrixArray[MSCALE_X] * mWin.mHScale,
|
||||
mDtDx * mWin.mTmpMatrixArray[MSKEW_Y] * mWin.mVScale,
|
||||
mDtDy * mWin.mTmpMatrixArray[MSKEW_X] * mWin.mHScale,
|
||||
|
||||
@@ -236,10 +236,6 @@ class WindowSurfaceController {
|
||||
}
|
||||
}
|
||||
|
||||
void setPositionInTransaction(float left, float top, boolean recoveringMemory) {
|
||||
setPosition(null, left, top, recoveringMemory);
|
||||
}
|
||||
|
||||
void setPosition(SurfaceControl.Transaction t, float left, float top,
|
||||
boolean recoveringMemory) {
|
||||
final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top;
|
||||
@@ -251,11 +247,7 @@ class WindowSurfaceController {
|
||||
ProtoLog.i(WM_SHOW_TRANSACTIONS,
|
||||
"SURFACE POS (setPositionInTransaction) @ (%f,%f): %s", left, top, title);
|
||||
|
||||
if (t == null) {
|
||||
mSurfaceControl.setPosition(left, top);
|
||||
} else {
|
||||
t.setPosition(mSurfaceControl, left, top);
|
||||
}
|
||||
t.setPosition(mSurfaceControl, left, top);
|
||||
} catch (RuntimeException e) {
|
||||
Slog.w(TAG, "Error positioning surface of " + this
|
||||
+ " pos=(" + left + "," + top + ")", e);
|
||||
@@ -266,11 +258,6 @@ class WindowSurfaceController {
|
||||
}
|
||||
}
|
||||
|
||||
void setMatrixInTransaction(float dsdx, float dtdx, float dtdy, float dsdy,
|
||||
boolean recoveringMemory) {
|
||||
setMatrix(null, dsdx, dtdx, dtdy, dsdy, false);
|
||||
}
|
||||
|
||||
void setMatrix(SurfaceControl.Transaction t, float dsdx, float dtdx,
|
||||
float dtdy, float dsdy, boolean recoveringMemory) {
|
||||
final boolean matrixChanged = mLastDsdx != dsdx || mLastDtdx != dtdx ||
|
||||
@@ -287,11 +274,7 @@ class WindowSurfaceController {
|
||||
try {
|
||||
ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE MATRIX [%f,%f,%f,%f]: %s",
|
||||
dsdx, dtdx, dtdy, dsdy, title);
|
||||
if (t == null) {
|
||||
mSurfaceControl.setMatrix(dsdx, dtdx, dtdy, dsdy);
|
||||
} else {
|
||||
t.setMatrix(mSurfaceControl, dsdx, dtdx, dtdy, dsdy);
|
||||
}
|
||||
t.setMatrix(mSurfaceControl, dsdx, dtdx, dtdy, dsdy);
|
||||
} catch (RuntimeException e) {
|
||||
// If something goes wrong with the surface (such
|
||||
// as running out of memory), don't take down the
|
||||
|
||||
Reference in New Issue
Block a user