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

Commit 894f9776 authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Use LinearStdAllocator in DisplayList"

parents 63afb863 b36af87f
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -34,6 +34,17 @@ namespace uirenderer {

DisplayList::DisplayList()
        : projectionReceiveIndex(-1)
        , stdAllocator(allocator)
        , chunks(stdAllocator)
        , ops(stdAllocator)
        , children(stdAllocator)
        , bitmapResources(stdAllocator)
        , pathResources(stdAllocator)
        , patchResources(stdAllocator)
        , paints(stdAllocator)
        , regions(stdAllocator)
        , referenceHolders(stdAllocator)
        , functors(stdAllocator)
        , hasDrawOps(false) {
}

@@ -68,9 +79,9 @@ void DisplayList::cleanupResources() {
}

size_t DisplayList::addChild(NodeOpType* op) {
    mReferenceHolders.push_back(op->renderNode);
    size_t index = mChildren.size();
    mChildren.push_back(op);
    referenceHolders.push_back(op->renderNode);
    size_t index = children.size();
    children.push_back(op);
    return index;
}

+24 −24
Original line number Diff line number Diff line
@@ -132,32 +132,22 @@ public:
    DisplayList();
    ~DisplayList();

    // pointers to all ops within display list, pointing into allocator data
    std::vector<DisplayListOp*> displayListOps;

    // index of DisplayListOp restore, after which projected descendents should be drawn
    int projectionReceiveIndex;

    std::vector<const SkBitmap*> bitmapResources;
    std::vector<const SkPath*> pathResources;
    std::vector<const Res_png_9patch*> patchResources;
    const LsaVector<Chunk>& getChunks() const { return chunks; }
    const LsaVector<BaseOpType*>& getOps() const { return ops; }

    std::vector<std::unique_ptr<const SkPaint>> paints;
    std::vector<std::unique_ptr<const SkRegion>> regions;
    Vector<Functor*> functors;
    const LsaVector<NodeOpType*>& getChildren() const { return children; }

    const std::vector<Chunk>& getChunks() const {
            return chunks;
    }
    const std::vector<BaseOpType*>& getOps() const {
        return ops;
    }
    const LsaVector<const SkBitmap*>& getBitmapResources() const { return bitmapResources; }
    const LsaVector<Functor*>& getFunctors() const { return functors; }

    size_t addChild(NodeOpType* childOp);
    const std::vector<NodeOpType*>& children() { return mChildren; }


    void ref(VirtualLightRefBase* prop) {
        mReferenceHolders.push_back(prop);
        referenceHolders.push_back(prop);
    }

    size_t getUsedSize() {
@@ -168,17 +158,27 @@ public:
    }

private:
    std::vector<BaseOpType*> ops;
    // allocator into which all ops and LsaVector arrays allocated
    LinearAllocator allocator;
    LinearStdAllocator<void*> stdAllocator;

    std::vector< sp<VirtualLightRefBase> > mReferenceHolders;
    LsaVector<Chunk> chunks;
    LsaVector<BaseOpType*> ops;

    // list of children display lists for quick, non-drawing traversal
    std::vector<NodeOpType*> mChildren;
    // list of Ops referring to RenderNode children for quick, non-drawing traversal
    LsaVector<NodeOpType*> children;

    std::vector<Chunk> chunks;
    // Resources - Skia objects + 9 patches referred to by this DisplayList
    LsaVector<const SkBitmap*> bitmapResources;
    LsaVector<const SkPath*> pathResources;
    LsaVector<const Res_png_9patch*> patchResources;
    LsaVector<std::unique_ptr<const SkPaint>> paints;
    LsaVector<std::unique_ptr<const SkRegion>> regions;
    LsaVector< sp<VirtualLightRefBase> > referenceHolders;

    // List of functors
    LsaVector<Functor*> functors;

    // allocator into which all ops were allocated
    LinearAllocator allocator;
    bool hasDrawOps;

    void cleanupResources();
+2 −2
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ DisplayList* DisplayListCanvas::finishRecording() {

void DisplayListCanvas::callDrawGLFunction(Functor *functor) {
    addDrawOp(new (alloc()) DrawFunctorOp(functor));
    mDisplayList->functors.add(functor);
    mDisplayList->functors.push_back(functor);
}

SkCanvas* DisplayListCanvas::asSkCanvas() {
@@ -528,7 +528,7 @@ size_t DisplayListCanvas::addOpAndUpdateChunk(DisplayListOp* op) {
        newChunk.endOpIndex = insertIndex + 1;
        newChunk.reorderChildren = (mDeferredBarrierType == kBarrier_OutOfOrder);

        int nextChildIndex = mDisplayList->children().size();
        int nextChildIndex = mDisplayList->children.size();
        newChunk.beginChildIndex = newChunk.endChildIndex = nextChildIndex;
        mDeferredBarrierType = kBarrier_None;
    } else {
+7 −10
Original line number Diff line number Diff line
@@ -225,18 +225,17 @@ void OpReorderer::defer(const SkRect& clip, int viewportWidth, int viewportHeigh
        if (node->applyViewProperties(mCanvasState)) {
            // not rejected do ops...
            const DisplayList& displayList = node->getDisplayList();
            deferImpl(displayList.getChunks(), displayList.getOps());
            deferImpl(displayList);
        }
        mCanvasState.restore();
    }
}

void OpReorderer::defer(int viewportWidth, int viewportHeight,
        const std::vector<DisplayList::Chunk>& chunks, const std::vector<RecordedOp*>& ops) {
void OpReorderer::defer(int viewportWidth, int viewportHeight, const DisplayList& displayList) {
    ATRACE_NAME("prepare drawing commands");
    mCanvasState.initializeSaveStack(viewportWidth, viewportHeight,
            0, 0, viewportWidth, viewportHeight, Vector3());
    deferImpl(chunks, ops);
    deferImpl(displayList);
}

/**
@@ -247,14 +246,13 @@ void OpReorderer::defer(int viewportWidth, int viewportHeight,
 */
#define OP_RECIEVER(Type) \
        [](OpReorderer& reorderer, const RecordedOp& op) { reorderer.on##Type(static_cast<const Type&>(op)); },
void OpReorderer::deferImpl(const std::vector<DisplayList::Chunk>& chunks,
        const std::vector<RecordedOp*>& ops) {
void OpReorderer::deferImpl(const DisplayList& displayList) {
    static std::function<void(OpReorderer& reorderer, const RecordedOp&)> receivers[] = {
        MAP_OPS(OP_RECIEVER)
    };
    for (const DisplayList::Chunk& chunk : chunks) {
    for (const DisplayList::Chunk& chunk : displayList.getChunks()) {
        for (size_t opIndex = chunk.beginOpIndex; opIndex < chunk.endOpIndex; opIndex++) {
            const RecordedOp* op = ops[opIndex];
            const RecordedOp* op = displayList.getOps()[opIndex];
            receivers[op->opId](*this, *op);
        }
    }
@@ -288,8 +286,7 @@ void OpReorderer::onRenderNodeOp(const RenderNodeOp& op) {
    // apply RenderProperties state
    if (op.renderNode->applyViewProperties(mCanvasState)) {
        // not rejected do ops...
        const DisplayList& displayList = op.renderNode->getDisplayList();
        deferImpl(displayList.getChunks(), displayList.getOps());
        deferImpl(op.renderNode->getDisplayList());
    }
    mCanvasState.restore();
}
+2 −4
Original line number Diff line number Diff line
@@ -62,8 +62,7 @@ public:
    void defer(const SkRect& clip, int viewportWidth, int viewportHeight,
            const std::vector< sp<RenderNode> >& nodes);

    void defer(int viewportWidth, int viewportHeight,
            const std::vector<DisplayList::Chunk>& chunks, const std::vector<RecordedOp*>& ops);
    void defer(int viewportWidth, int viewportHeight, const DisplayList& displayList);
    typedef std::function<void(void*, const RecordedOp&, const BakedOpState&)> BakedOpReceiver;

    /**
@@ -92,8 +91,7 @@ public:
private:
    BakedOpState* bakeOpState(const RecordedOp& recordedOp);

    void deferImpl(const std::vector<DisplayList::Chunk>& chunks,
            const std::vector<RecordedOp*>& ops);
    void deferImpl(const DisplayList& displayList);

    void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers);

Loading