diff options
author | John Reck <jreck@google.com> | 2014-07-16 22:01:36 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-16 02:20:34 +0000 |
commit | 514a8b88f7a57fd348dde193ee9ced0403deebd4 (patch) | |
tree | 6195fba62a46657d540162679ff671ce48b58473 /core | |
parent | 7c673820d7fc981b7e30ae51cbcb767fab757796 (diff) | |
parent | 0a97330b98dd633b58dcfff405d94476c89e867d (diff) | |
download | frameworks_base-514a8b88f7a57fd348dde193ee9ced0403deebd4.zip frameworks_base-514a8b88f7a57fd348dde193ee9ced0403deebd4.tar.gz frameworks_base-514a8b88f7a57fd348dde193ee9ced0403deebd4.tar.bz2 |
Merge "Fix root RenderNode damage calculation" into lmp-dev
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 6 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 40 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 11 | ||||
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 7 |
4 files changed, 41 insertions, 23 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index f2f363a..8c9b819 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -327,6 +327,12 @@ public abstract class HardwareRenderer { } /** + * Indicates that the content drawn by HardwareDrawCallbacks needs to + * be updated, which will be done by the next call to draw() + */ + abstract void invalidateRoot(); + + /** * Draws the specified view. * * @param view The view to draw. diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index e2ebf6e..b033780 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -96,6 +96,7 @@ public class ThreadedRenderer extends HardwareRenderer { private RenderNode mRootNode; private Choreographer mChoreographer; private boolean mProfilingEnabled; + private boolean mRootNodeNeedsUpdate; ThreadedRenderer(Context context, boolean translucent) { final TypedArray a = context.obtainStyledAttributes( @@ -255,28 +256,39 @@ public class ThreadedRenderer extends HardwareRenderer { return changed; } - private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { + private void updateViewTreeDisplayList(View view) { view.mPrivateFlags |= View.PFLAG_DRAWN; - view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED) == View.PFLAG_INVALIDATED; view.mPrivateFlags &= ~View.PFLAG_INVALIDATED; + view.getDisplayList(); + view.mRecreateDisplayList = false; + } + private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); - HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); - try { - canvas.save(); - canvas.translate(mInsetLeft, mInsetTop); - callbacks.onHardwarePreDraw(canvas); - canvas.drawRenderNode(view.getDisplayList()); - callbacks.onHardwarePostDraw(canvas); - canvas.restore(); - } finally { - mRootNode.end(canvas); - Trace.traceEnd(Trace.TRACE_TAG_VIEW); + updateViewTreeDisplayList(view); + + if (mRootNodeNeedsUpdate || !mRootNode.isValid()) { + HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); + try { + canvas.save(); + canvas.translate(mInsetLeft, mInsetTop); + callbacks.onHardwarePreDraw(canvas); + canvas.drawRenderNode(view.getDisplayList()); + callbacks.onHardwarePostDraw(canvas); + canvas.restore(); + mRootNodeNeedsUpdate = false; + } finally { + mRootNode.end(canvas); + } } + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } - view.mRecreateDisplayList = false; + @Override + void invalidateRoot() { + mRootNodeNeedsUpdate = true; } @Override diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b554548..341419c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2440,8 +2440,11 @@ public final class ViewRootImpl implements ViewParent, if (attachInfo.mHardwareRenderer != null && attachInfo.mHardwareRenderer.isEnabled()) { // Draw with hardware renderer. mIsAnimating = false; - mHardwareYOffset = yOffset; - mHardwareXOffset = xOffset; + if (mHardwareYOffset != yOffset || mHardwareXOffset != xOffset) { + mHardwareYOffset = yOffset; + mHardwareXOffset = xOffset; + mAttachInfo.mHardwareRenderer.invalidateRoot(); + } mResizeAlpha = resizeAlpha; dirty.setEmpty(); @@ -2827,6 +2830,10 @@ public final class ViewRootImpl implements ViewParent, // Set the new focus host and node. mAccessibilityFocusedHost = view; mAccessibilityFocusedVirtualView = node; + + if (mAttachInfo.mHardwareRenderer != null) { + mAttachInfo.mHardwareRenderer.invalidateRoot(); + } } @Override diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index aab48b3..988d461 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -138,13 +138,6 @@ public: } } -protected: - virtual void damageSelf(TreeInfo& info) { - // Intentionally a no-op. As RootRenderNode gets a new DisplayListData - // every frame this would result in every draw push being a full inval, - // which is wrong. Only RootRenderNode has this issue. - } - private: sp<Looper> mLooper; std::vector<OnFinishedEvent> mOnFinishedEvents; |