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

Commit 27bf1913 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Optimize display lists"

parents 1aabd124 04c9d8c2
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -9992,8 +9992,6 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit
                // The dirty rect should always be null for a display list
                canvas.onPreDraw(null);
                final int restoreCount = canvas.save();
                computeScroll();
                canvas.translate(-mScrollX, -mScrollY);
                mPrivateFlags |= DRAWN | DRAWING_CACHE_VALID;
@@ -10005,8 +10003,6 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit
                } else {
                    draw(canvas);
                }
                canvas.restoreToCount(restoreCount);
            } finally {
                canvas.onPostDraw();
+10 −2
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde

void DisplayList::init() {
    mSize = 0;
    mIsRenderable = true;
}

size_t DisplayList::getSize() {
@@ -892,7 +893,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level)
// Base structure
///////////////////////////////////////////////////////////////////////////////

DisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE) {
DisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE), mHasDrawOps(false) {
}

DisplayListRenderer::~DisplayListRenderer() {
@@ -926,6 +927,8 @@ void DisplayListRenderer::reset() {
    mPathMap.clear();

    mMatrices.clear();

    mHasDrawOps = false;
}

///////////////////////////////////////////////////////////////////////////////
@@ -938,6 +941,7 @@ DisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
    } else {
        displayList->initFromDisplayListRenderer(*this, true);
    }
    displayList->setRenderable(mHasDrawOps);
    return displayList;
}

@@ -982,7 +986,11 @@ int DisplayListRenderer::save(int flags) {
}

void DisplayListRenderer::restore() {
    if (mRestoreSaveCount < 0) {
        addOp(DisplayList::Restore);
    } else {
        mRestoreSaveCount--;
    }
    OpenGLRenderer::restore();
}

+14 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ public:
    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
    //            when modifying this file
    enum Op {
        // Non-drawing operations
        Save = 0,
        Restore,
        RestoreToCount,
@@ -75,6 +76,7 @@ public:
        SetMatrix,
        ConcatMatrix,
        ClipRect,
        // Drawing operations
        DrawDisplayList,
        DrawLayer,
        DrawBitmap,
@@ -113,6 +115,14 @@ public:

    static void outputLogBuffer(int fd);

    void setRenderable(bool renderable) {
        mIsRenderable = renderable;
    }

    bool isRenderable() const {
        return mIsRenderable;
    }

private:
    void init();

@@ -207,6 +217,8 @@ private:
    mutable SkFlattenableReadBuffer mReader;

    size_t mSize;

    bool mIsRenderable;
};

///////////////////////////////////////////////////////////////////////////////
@@ -328,6 +340,7 @@ private:
    inline void addOp(DisplayList::Op drawOp) {
        insertRestoreToCount();
        mWriter.writeInt(drawOp);
        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
    }

    inline void addInt(int value) {
@@ -479,6 +492,7 @@ private:
    SkWriter32 mWriter;

    int mRestoreSaveCount;
    bool mHasDrawOps;

    friend class DisplayList;

+1 −1
Original line number Diff line number Diff line
@@ -1278,7 +1278,7 @@ bool OpenGLRenderer::drawDisplayList(DisplayList* displayList, uint32_t width, u

    // All the usual checks and setup operations (quickReject, setupDraw, etc.)
    // will be performed by the display list itself
    if (displayList) {
    if (displayList && displayList->isRenderable()) {
        return displayList->replay(*this, dirty, level);
    }