Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 514a8b88 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Fix root RenderNode damage calculation" into lmp-dev

parents 7c673820 0a97330b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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.
     *
+26 −14
Original line number Diff line number Diff line
@@ -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,14 +256,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();
@@ -271,12 +278,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
+9 −2
Original line number Diff line number Diff line
@@ -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();
@@ -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
+0 −7
Original line number Diff line number Diff line
@@ -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;
+1 −3
Original line number Diff line number Diff line
@@ -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;

@@ -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