summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Carr <racarr@google.com>2020-04-22 15:56:32 -0700
committerRobert Carr <racarr@google.com>2020-04-24 14:42:55 -0700
commitb9cf275b9bf4a5cd2f941c422ee728a4bf155601 (patch)
tree25f89a319e6f44f327eab345394f659a3059f2c8
parentadf530fc264267260aae06231e4be59c74f30a36 (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
-rw-r--r--core/java/android/view/ViewRootImpl.java29
-rw-r--r--core/java/android/view/WindowManagerGlobal.java4
-rw-r--r--core/jni/android_graphics_BLASTBufferQueue.cpp7
-rw-r--r--graphics/java/android/graphics/BLASTBufferQueue.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java14
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfaceController.java4
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();
}