From 61375a8bb5e112d4e79ee4240699ffe7e3f4c8e5 Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 18 Sep 2014 19:27:48 +0000 Subject: [PATCH] Revert "Make starting window hw-accelerated" Bug: 17516789 This change corresponds to a sudden influx of bad surface crashes. Reverting to see if stability returns as this was an optimization CL This reverts commit 29ff1bc57ac2c995c56f15ed6e56e5fb247b2a44. Change-Id: I7835e89017161d94ad05fe46d81bd437c3dae3a7 --- core/java/android/view/HardwareRenderer.java | 3 +-- core/java/android/view/ThreadedRenderer.java | 15 +++----------- core/java/android/view/ViewRootImpl.java | 12 ++++++++--- core/java/android/view/WindowManager.java | 20 +++++++++++++++++++ .../policy/impl/PhoneWindowManager.java | 2 ++ 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index d23e1154b7236..edb3798844411 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -339,8 +339,7 @@ public abstract class HardwareRenderer { * @param attachInfo AttachInfo tied to the specified view. * @param callbacks Callbacks invoked when drawing happens. */ - abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks, - boolean isStartingWindow); + abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks); /** * Creates a new hardware layer. A hardware layer built by calling this diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 3d1332c54018b..5d2822d895aec 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -16,7 +16,6 @@ package android.view; -import android.graphics.Color; import com.android.internal.R; import android.content.Context; @@ -268,8 +267,7 @@ public class ThreadedRenderer extends HardwareRenderer { view.mRecreateDisplayList = false; } - private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks, - boolean isStartingWindow) { + private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); updateViewTreeDisplayList(view); @@ -281,12 +279,6 @@ public class ThreadedRenderer extends HardwareRenderer { callbacks.onHardwarePreDraw(canvas); canvas.insertReorderBarrier(); - if (isStartingWindow) { - // Compensate for some situations in which a hw-accelerated surface - // will not be filled with anything by default; this is equivalent - // to the old behavior when the system process was not hw-accelerated - canvas.drawColor(Color.BLACK); - } canvas.drawRenderNode(view.getDisplayList()); canvas.insertInorderBarrier(); @@ -306,8 +298,7 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override - void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks, - boolean isStartingWindow) { + void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks) { attachInfo.mIgnoreDirtyState = true; long frameTimeNanos = mChoreographer.getFrameTimeNanos(); attachInfo.mDrawingTime = frameTimeNanos / TimeUtils.NANOS_PER_MS; @@ -317,7 +308,7 @@ public class ThreadedRenderer extends HardwareRenderer { recordDuration = System.nanoTime(); } - updateRootDisplayList(view, callbacks, isStartingWindow); + updateRootDisplayList(view, callbacks); if (mProfilingEnabled) { recordDuration = System.nanoTime() - recordDuration; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ae6e4e78ed43a..43ab4ef33b85d 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -711,10 +711,17 @@ public final class ViewRootImpl implements ViewParent, // can be used by code on the system process to escape that and enable // HW accelerated drawing. (This is basically for the lock screen.) + final boolean fakeHwAccelerated = (attrs.privateFlags & + WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0; final boolean forceHwAccelerated = (attrs.privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0; - if (!HardwareRenderer.sRendererDisabled + if (fakeHwAccelerated) { + // This is exclusively for the preview windows the window manager + // shows for launching applications, so they will look more like + // the app being launched. + mAttachInfo.mHardwareAccelerationRequested = true; + } else if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled && forceHwAccelerated)) { if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.destroy(); @@ -2479,8 +2486,7 @@ public final class ViewRootImpl implements ViewParent, dirty.setEmpty(); mBlockResizeBuffer = false; - mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this, - params.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING); + mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this); } else { // If we get here with a disabled & requested hardware renderer, something went // wrong (an invalidate posted right before we destroyed the hardware surface diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 273ec9d08007c..47ee52e251169 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1023,6 +1023,26 @@ public interface WindowManager extends ViewManager { }, formatToHexString = true) public int flags; + /** + * If the window has requested hardware acceleration, but this is not + * allowed in the process it is in, then still render it as if it is + * hardware accelerated. This is used for the starting preview windows + * in the system process, which don't need to have the overhead of + * hardware acceleration (they are just a static rendering), but should + * be rendered as such to match the actual window of the app even if it + * is hardware accelerated. + * Even if the window isn't hardware accelerated, still do its rendering + * as if it was. + * Like {@link #FLAG_HARDWARE_ACCELERATED} except for trusted system windows + * that need hardware acceleration (e.g. LockScreen), where hardware acceleration + * is generally disabled. This flag must be specified in addition to + * {@link #FLAG_HARDWARE_ACCELERATED} to enable hardware acceleration for system + * windows. + * + * @hide + */ + public static final int PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED = 0x00000001; + /** * In the system process, we globally do not use hardware acceleration * because there are many threads doing UI there and they conflict. diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 9daa190ba6431..16bb00bbf7d32 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1826,6 +1826,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { params.packageName = packageName; params.windowAnimations = win.getWindowStyle().getResourceId( com.android.internal.R.styleable.Window_windowAnimationStyle, 0); + params.privateFlags |= + WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED; params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; if (!compatInfo.supportsScreen()) {