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

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

Merge "Apply clip at reorder barriers to shadows" into nyc-dev

parents d043bbb2 d6456401
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -137,6 +137,9 @@ public:

        // whether children with non-zero Z in the chunk should be reordered
        bool reorderChildren;
#if HWUI_NEW_OPS
        const ClipBase* reorderClip;
#endif
    };

    DisplayList();
+12 −6
Original line number Diff line number Diff line
@@ -269,7 +269,8 @@ static size_t findNonNegativeIndex(const V& zTranslatedNodes) {
}

template <typename V>
void FrameBuilder::defer3dChildren(ChildrenSelectMode mode, const V& zTranslatedNodes) {
void FrameBuilder::defer3dChildren(const ClipBase* reorderClip, ChildrenSelectMode mode,
        const V& zTranslatedNodes) {
    const int size = zTranslatedNodes.size();
    if (size == 0
            || (mode == ChildrenSelectMode::Negative&& zTranslatedNodes[0].key > 0.0f)
@@ -305,7 +306,7 @@ void FrameBuilder::defer3dChildren(ChildrenSelectMode mode, const V& zTranslated
            // attempt to render the shadow if the caster about to be drawn is its caster,
            // OR if its caster's Z value is similar to the previous potential caster
            if (shadowIndex == drawIndex || casterZ - lastCasterZ < 0.1f) {
                deferShadow(*casterNodeOp);
                deferShadow(reorderClip, *casterNodeOp);

                lastCasterZ = casterZ; // must do this even if current caster not casting a shadow
                shadowIndex++;
@@ -319,7 +320,7 @@ void FrameBuilder::defer3dChildren(ChildrenSelectMode mode, const V& zTranslated
    }
}

void FrameBuilder::deferShadow(const RenderNodeOp& casterNodeOp) {
void FrameBuilder::deferShadow(const ClipBase* reorderClip, const RenderNodeOp& casterNodeOp) {
    auto& node = *casterNodeOp.renderNode;
    auto& properties = node.properties();

@@ -365,6 +366,10 @@ void FrameBuilder::deferShadow(const RenderNodeOp& casterNodeOp) {
        casterPath = frameAllocatedPath;
    }

    // apply reorder clip to shadow, so it respects clip at beginning of reorderable chunk
    int restoreTo = mCanvasState.save(SaveFlags::MatrixClip);
    mCanvasState.writableSnapshot()->applyClip(reorderClip,
            *mCanvasState.currentSnapshot()->transform);
    if (CC_LIKELY(!mCanvasState.getRenderTargetClipBounds().isEmpty())) {
        Matrix4 shadowMatrixXY(casterNodeOp.localMatrix);
        Matrix4 shadowMatrixZ(casterNodeOp.localMatrix);
@@ -386,6 +391,7 @@ void FrameBuilder::deferShadow(const RenderNodeOp& casterNodeOp) {
            currentLayer().deferUnmergeableOp(mAllocator, bakedOpState, OpBatchType::Shadow);
        }
    }
    mCanvasState.restoreToCount(restoreTo);
}

void FrameBuilder::deferProjectedChildren(const RenderNode& renderNode) {
@@ -438,11 +444,11 @@ void FrameBuilder::deferNodeOps(const RenderNode& renderNode) {

    // can't be null, since DL=null node rejection happens before deferNodePropsAndOps
    const DisplayList& displayList = *(renderNode.getDisplayList());
    for (const DisplayList::Chunk& chunk : displayList.getChunks()) {
    for (auto& chunk : displayList.getChunks()) {
        FatVector<ZRenderNodeOpPair, 16> zTranslatedNodes;
        buildZSortedChildList(&zTranslatedNodes, displayList, chunk);

        defer3dChildren(ChildrenSelectMode::Negative, zTranslatedNodes);
        defer3dChildren(chunk.reorderClip, ChildrenSelectMode::Negative, zTranslatedNodes);
        for (size_t opIndex = chunk.beginOpIndex; opIndex < chunk.endOpIndex; opIndex++) {
            const RecordedOp* op = displayList.getOps()[opIndex];
            receivers[op->opId](*this, *op);
@@ -453,7 +459,7 @@ void FrameBuilder::deferNodeOps(const RenderNode& renderNode) {
                deferProjectedChildren(renderNode);
            }
        }
        defer3dChildren(ChildrenSelectMode::Positive, zTranslatedNodes);
        defer3dChildren(chunk.reorderClip, ChildrenSelectMode::Positive, zTranslatedNodes);
    }
}

+3 −2
Original line number Diff line number Diff line
@@ -193,9 +193,10 @@ private:
    void deferNodePropsAndOps(RenderNode& node);

    template <typename V>
    void defer3dChildren(ChildrenSelectMode mode, const V& zTranslatedNodes);
    void defer3dChildren(const ClipBase* reorderClip, ChildrenSelectMode mode,
            const V& zTranslatedNodes);

    void deferShadow(const RenderNodeOp& casterOp);
    void deferShadow(const ClipBase* reorderClip, const RenderNodeOp& casterOp);

    void deferProjectedChildren(const RenderNode& renderNode);

+11 −0
Original line number Diff line number Diff line
@@ -57,6 +57,16 @@ DisplayList* RecordingCanvas::finishRecording() {
    return displayList;
}

void RecordingCanvas::insertReorderBarrier(bool enableReorder) {
    if (enableReorder) {
        mDeferredBarrierType = DeferredBarrierType::OutOfOrder;
        mDeferredBarrierClip = getRecordedClip();
    } else {
        mDeferredBarrierType = DeferredBarrierType::InOrder;
        mDeferredBarrierClip = nullptr;
    }
}

SkCanvas* RecordingCanvas::asSkCanvas() {
    LOG_ALWAYS_FATAL_IF(!mDisplayList,
            "attempting to get an SkCanvas when we are not recording!");
@@ -610,6 +620,7 @@ size_t RecordingCanvas::addOp(RecordedOp* op) {
        newChunk.beginOpIndex = insertIndex;
        newChunk.endOpIndex = insertIndex + 1;
        newChunk.reorderChildren = (mDeferredBarrierType == DeferredBarrierType::OutOfOrder);
        newChunk.reorderClip = mDeferredBarrierClip;

        int nextChildIndex = mDisplayList->children.size();
        newChunk.beginChildIndex = newChunk.endChildIndex = nextChildIndex;
+2 −4
Original line number Diff line number Diff line
@@ -55,10 +55,7 @@ public:
// ----------------------------------------------------------------------------
// MISC HWUI OPERATIONS - TODO: CATEGORIZE
// ----------------------------------------------------------------------------
    virtual void insertReorderBarrier(bool enableReorder) override {
        mDeferredBarrierType = enableReorder
                ? DeferredBarrierType::OutOfOrder : DeferredBarrierType::InOrder;
    }
    virtual void insertReorderBarrier(bool enableReorder) override;

    virtual void drawLayer(DeferredLayerUpdater* layerHandle) override;
    virtual void drawRenderNode(RenderNode* renderNode) override;
@@ -312,6 +309,7 @@ private:
    std::unique_ptr<SkiaCanvasProxy> mSkiaCanvasProxy;
    ResourceCache& mResourceCache;
    DeferredBarrierType mDeferredBarrierType = DeferredBarrierType::None;
    const ClipBase* mDeferredBarrierClip = nullptr;
    DisplayList* mDisplayList = nullptr;
    bool mHighContrastText = false;
    SkAutoTUnref<SkDrawFilter> mDrawFilter;
Loading