diff options
author | Robert Carr <racarr@google.com> | 2020-04-22 15:56:32 -0700 |
---|---|---|
committer | Robert Carr <racarr@google.com> | 2020-04-24 14:42:55 -0700 |
commit | b9cf275b9bf4a5cd2f941c422ee728a4bf155601 (patch) | |
tree | 25f89a319e6f44f327eab345394f659a3059f2c8 | |
parent | adf530fc264267260aae06231e4be59c74f30a36 (diff) |
BLAST: Two start-up optimizations
1. Avoid a seperate IPC querying in to system-server
to initialize the mUseBLAST flag.
2. Avoid calling property_get_bool with each BufferQueue
creation.
Instead we piggy-back both values inside addWindow return values.
Bug: 152501005
Test: Existing tests pass
Change-Id: If130560a8230f8d399cf7631264d551522939faa
6 files changed, 45 insertions, 22 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ed1edc3bd526..f5b898b72154 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -326,6 +326,8 @@ public final class ViewRootImpl implements ViewParent, private boolean mForceNextConfigUpdate; private boolean mUseBLASTAdapter; + private boolean mForceDisableBLAST; + private boolean mEnableTripleBuffering; /** * Signals that compatibility booleans have been initialized according to @@ -774,7 +776,6 @@ public final class ViewRootImpl implements ViewParent, loadSystemProperties(); mImeFocusController = new ImeFocusController(this); - mUseBLASTAdapter = WindowManagerGlobal.useBLAST(); } public static void addFirstDrawHandler(Runnable callback) { @@ -915,10 +916,9 @@ public final class ViewRootImpl implements ViewParent, if (mWindowAttributes.packageName == null) { mWindowAttributes.packageName = mBasePackageName; } - if (mUseBLASTAdapter) { - mWindowAttributes.privateFlags |= + mWindowAttributes.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST; - } + attrs = mWindowAttributes; setTag(); @@ -1092,6 +1092,13 @@ public final class ViewRootImpl implements ViewParent, "Unable to add window -- unknown error code " + res); } + if ((res & WindowManagerGlobal.ADD_FLAG_USE_BLAST) != 0) { + mUseBLASTAdapter = true; + } + if ((res & WindowManagerGlobal.ADD_FLAG_USE_TRIPLE_BUFFERING) != 0) { + mEnableTripleBuffering = true; + } + if (view instanceof RootViewSurfaceTaker) { mInputQueueCallback = ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue(); @@ -1404,10 +1411,8 @@ public final class ViewRootImpl implements ViewParent, } mWindowAttributes.privateFlags |= compatibleWindowFlag; - if (mUseBLASTAdapter) { - mWindowAttributes.privateFlags |= + mWindowAttributes.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST; - } if (mWindowAttributes.preservePreviousSurfaceInsets) { // Restore old surface insets. @@ -1774,7 +1779,7 @@ public final class ViewRootImpl implements ViewParent, Surface ret = null; if (mBlastBufferQueue == null) { mBlastBufferQueue = new BLASTBufferQueue( - mBlastSurfaceControl, width, height); + mBlastSurfaceControl, width, height, mEnableTripleBuffering); // We only return the Surface the first time, as otherwise // it hasn't changed and there is no need to update. ret = mBlastBufferQueue.getSurface(); @@ -7377,7 +7382,7 @@ public final class ViewRootImpl implements ViewParent, mPendingDisplayCutout, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTempControls, mSurfaceSize, mBlastSurfaceControl); if (mSurfaceControl.isValid()) { - if (!mUseBLASTAdapter) { + if (!useBLAST()) { mSurface.copyFrom(mSurfaceControl); } else { final Surface blastSurface = getOrCreateBLASTSurface(mSurfaceSize.x, @@ -9612,7 +9617,7 @@ public final class ViewRootImpl implements ViewParent, * @hide */ public SurfaceControl getRenderSurfaceControl() { - if (mUseBLASTAdapter) { + if (useBLAST()) { return mBlastSurfaceControl; } else { return mSurfaceControl; @@ -9629,11 +9634,11 @@ public final class ViewRootImpl implements ViewParent, * flag. Needs to be called before addView. */ void forceDisableBLAST() { - mUseBLASTAdapter = false; + mForceDisableBLAST = true; } boolean useBLAST() { - return mUseBLASTAdapter; + return mUseBLASTAdapter && !mForceDisableBLAST; } /** diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index fba6a55ef6db..08ab338fc534 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -124,8 +124,10 @@ public final class WindowManagerGlobal { */ public static final int RELAYOUT_DEFER_SURFACE_DESTROY = 0x2; + public static final int ADD_FLAG_IN_TOUCH_MODE = 0x1; public static final int ADD_FLAG_APP_VISIBLE = 0x2; - public static final int ADD_FLAG_IN_TOUCH_MODE = RELAYOUT_RES_IN_TOUCH_MODE; + public static final int ADD_FLAG_USE_TRIPLE_BUFFERING = 0x4; + public static final int ADD_FLAG_USE_BLAST = 0x8; /** * Like {@link #RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS}, but as a "hint" when adding the diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp index 185e58160adf..23f4325c0ff1 100644 --- a/core/jni/android_graphics_BLASTBufferQueue.cpp +++ b/core/jni/android_graphics_BLASTBufferQueue.cpp @@ -29,9 +29,10 @@ namespace android { -static jlong nativeCreate(JNIEnv* env, jclass clazz, jlong surfaceControl, jlong width, jlong height) { +static jlong nativeCreate(JNIEnv* env, jclass clazz, jlong surfaceControl, jlong width, jlong height, + jboolean enableTripleBuffering) { sp<BLASTBufferQueue> queue = new BLASTBufferQueue( - reinterpret_cast<SurfaceControl*>(surfaceControl), width, height); + reinterpret_cast<SurfaceControl*>(surfaceControl), width, height, enableTripleBuffering); queue->incStrong((void*)nativeCreate); return reinterpret_cast<jlong>(queue.get()); } @@ -59,7 +60,7 @@ static void nativeUpdate(JNIEnv*env, jclass clazz, jlong ptr, jlong surfaceContr static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ - { "nativeCreate", "(JJJ)J", + { "nativeCreate", "(JJJZ)J", (void*)nativeCreate }, { "nativeGetSurface", "(J)Landroid/view/Surface;", (void*)nativeGetSurface }, diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java index 8c6a9371d53b..4c7e960eb0a4 100644 --- a/graphics/java/android/graphics/BLASTBufferQueue.java +++ b/graphics/java/android/graphics/BLASTBufferQueue.java @@ -26,15 +26,17 @@ public final class BLASTBufferQueue { // Note: This field is accessed by native code. private long mNativeObject; // BLASTBufferQueue* - private static native long nativeCreate(long surfaceControl, long width, long height); + private static native long nativeCreate(long surfaceControl, long width, long height, + boolean tripleBufferingEnabled); private static native void nativeDestroy(long ptr); private static native Surface nativeGetSurface(long ptr); private static native void nativeSetNextTransaction(long ptr, long transactionPtr); private static native void nativeUpdate(long ptr, long surfaceControl, long width, long height); /** Create a new connection with the surface flinger. */ - public BLASTBufferQueue(SurfaceControl sc, int width, int height) { - mNativeObject = nativeCreate(sc.mNativeObject, width, height); + public BLASTBufferQueue(SurfaceControl sc, int width, int height, + boolean tripleBufferingEnabled) { + mNativeObject = nativeCreate(sc.mNativeObject, width, height, tripleBufferingEnabled); } public void destroy() { @@ -64,4 +66,3 @@ public final class BLASTBufferQueue { } } } - diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a488af7cdee0..299a948d1ed5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -396,12 +396,18 @@ public class WindowManagerService extends IWindowManager.Stub private static final String HIERARCHICAL_ANIMATIONS_PROPERTY = "persist.wm.hierarchical_animations"; + private static final String DISABLE_TRIPLE_BUFFERING_PROPERTY = + "ro.sf.disable_triple_buffer"; + /** * @see #HIERARCHICAL_ANIMATIONS_PROPERTY */ static boolean sHierarchicalAnimations = SystemProperties.getBoolean(HIERARCHICAL_ANIMATIONS_PROPERTY, true); + static boolean sEnableTripleBuffering = !SystemProperties.getBoolean( + DISABLE_TRIPLE_BUFFERING_PROPERTY, false); + // Enums for animation scale update types. @Retention(RetentionPolicy.SOURCE) @IntDef({WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE, ANIMATION_DURATION_SCALE}) @@ -1595,6 +1601,14 @@ public class WindowManagerService extends IWindowManager.Stub // From now on, no exceptions or errors allowed! res = WindowManagerGlobal.ADD_OKAY; + + if (mUseBLAST) { + res |= WindowManagerGlobal.ADD_FLAG_USE_BLAST; + } + if (sEnableTripleBuffering) { + res |= WindowManagerGlobal.ADD_FLAG_USE_TRIPLE_BUFFERING; + } + if (displayContent.mCurrentFocus == null) { displayContent.mWinAddedSinceNullFocus.add(win); } diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index 55e6ab76188d..0a7ca5a0cf35 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -115,8 +115,8 @@ class WindowSurfaceController { .setMetadata(METADATA_WINDOW_TYPE, windowType) .setMetadata(METADATA_OWNER_UID, ownerUid); - final boolean useBLAST = (win.getAttrs().privateFlags & - WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0; + final boolean useBLAST = mService.mUseBLAST && ((win.getAttrs().privateFlags & + WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST) != 0); if (useBLAST) { b.setContainerLayer(); } |