Loading core/java/android/view/HardwareRenderer.java +6 −0 Original line number Diff line number Diff line Loading @@ -326,6 +326,12 @@ public abstract class HardwareRenderer { void onHardwarePostDraw(HardwareCanvas canvas); } /** * 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. * Loading core/java/android/view/ThreadedRenderer.java +26 −14 Original line number Diff line number Diff line Loading @@ -93,6 +93,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( Loading Loading @@ -247,14 +248,20 @@ 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"); updateViewTreeDisplayList(view); if (mRootNodeNeedsUpdate || !mRootNode.isValid()) { HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); try { canvas.save(); Loading @@ -263,12 +270,17 @@ public class ThreadedRenderer extends HardwareRenderer { 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 Loading core/java/android/view/ViewRootImpl.java +9 −2 Original line number Diff line number Diff line Loading @@ -2440,8 +2440,11 @@ public final class ViewRootImpl implements ViewParent, if (attachInfo.mHardwareRenderer != null && attachInfo.mHardwareRenderer.isEnabled()) { // Draw with hardware renderer. mIsAnimating = false; if (mHardwareYOffset != yOffset || mHardwareXOffset != xOffset) { mHardwareYOffset = yOffset; mHardwareXOffset = xOffset; mAttachInfo.mHardwareRenderer.invalidateRoot(); } mResizeAlpha = resizeAlpha; dirty.setEmpty(); Loading Loading @@ -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 Loading core/jni/android_view_ThreadedRenderer.cpp +0 −7 Original line number Diff line number Diff line Loading @@ -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; Loading libs/hwui/RenderNode.h +1 −3 Original line number Diff line number Diff line Loading @@ -173,9 +173,6 @@ public: // UI thread only! ANDROID_API void addAnimator(const sp<BaseRenderNodeAnimator>& animator); protected: virtual void damageSelf(TreeInfo& info); private: typedef key_value_pair_t<float, DrawRenderNodeOp*> ZDrawRenderNodeOpPair; Loading Loading @@ -250,6 +247,7 @@ private: void prepareLayer(TreeInfo& info); void pushLayerUpdate(TreeInfo& info); void deleteDisplayListData(); void damageSelf(TreeInfo& info); void incParentRefCount() { mParentCount++; } void decParentRefCount(); Loading Loading
core/java/android/view/HardwareRenderer.java +6 −0 Original line number Diff line number Diff line Loading @@ -326,6 +326,12 @@ public abstract class HardwareRenderer { void onHardwarePostDraw(HardwareCanvas canvas); } /** * 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. * Loading
core/java/android/view/ThreadedRenderer.java +26 −14 Original line number Diff line number Diff line Loading @@ -93,6 +93,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( Loading Loading @@ -247,14 +248,20 @@ 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"); updateViewTreeDisplayList(view); if (mRootNodeNeedsUpdate || !mRootNode.isValid()) { HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); try { canvas.save(); Loading @@ -263,12 +270,17 @@ public class ThreadedRenderer extends HardwareRenderer { 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 Loading
core/java/android/view/ViewRootImpl.java +9 −2 Original line number Diff line number Diff line Loading @@ -2440,8 +2440,11 @@ public final class ViewRootImpl implements ViewParent, if (attachInfo.mHardwareRenderer != null && attachInfo.mHardwareRenderer.isEnabled()) { // Draw with hardware renderer. mIsAnimating = false; if (mHardwareYOffset != yOffset || mHardwareXOffset != xOffset) { mHardwareYOffset = yOffset; mHardwareXOffset = xOffset; mAttachInfo.mHardwareRenderer.invalidateRoot(); } mResizeAlpha = resizeAlpha; dirty.setEmpty(); Loading Loading @@ -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 Loading
core/jni/android_view_ThreadedRenderer.cpp +0 −7 Original line number Diff line number Diff line Loading @@ -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; Loading
libs/hwui/RenderNode.h +1 −3 Original line number Diff line number Diff line Loading @@ -173,9 +173,6 @@ public: // UI thread only! ANDROID_API void addAnimator(const sp<BaseRenderNodeAnimator>& animator); protected: virtual void damageSelf(TreeInfo& info); private: typedef key_value_pair_t<float, DrawRenderNodeOp*> ZDrawRenderNodeOpPair; Loading Loading @@ -250,6 +247,7 @@ private: void prepareLayer(TreeInfo& info); void pushLayerUpdate(TreeInfo& info); void deleteDisplayListData(); void damageSelf(TreeInfo& info); void incParentRefCount() { mParentCount++; } void decParentRefCount(); Loading