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

Commit b5eeb18f authored by John Reck's avatar John Reck
Browse files

Add initial benchmarks for CanvasOp

Also some minor other tweaks

Test: this
Change-Id: Idb8a5955839893ff000de87d4899fd130ede061c
parent a3b82500
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -672,6 +672,7 @@ cc_benchmark {

    srcs: [
        "tests/microbench/main.cpp",
        "tests/microbench/CanvasOpBench.cpp",
        "tests/microbench/DisplayListCanvasBench.cpp",
        "tests/microbench/LinearAllocatorBench.cpp",
        "tests/microbench/PathParserBench.cpp",
+3 −2
Original line number Diff line number Diff line
@@ -16,14 +16,15 @@

#pragma once

#include "pipeline/skia/SkiaDisplayList.h"

namespace android {
namespace uirenderer {

namespace VectorDrawable {
class Tree;
};
namespace skiapipeline {
class SkiaDisplayList;
}
typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot;

/**
+1 −1
Original line number Diff line number Diff line
@@ -380,7 +380,7 @@ void RenderNode::deleteDisplayList(TreeObserver& observer, TreeInfo* info) {
    if (mDisplayList) {
        mDisplayList->updateChildren(
                [&observer, info](RenderNode* child) { child->decParentRefCount(observer, info); });
        if (!mDisplayList->reuseDisplayList(this, info ? &info->canvasContext : nullptr)) {
        if (!mDisplayList->reuseDisplayList(this)) {
            delete mDisplayList;
        }
    }
+7 −0
Original line number Diff line number Diff line
@@ -21,7 +21,14 @@
namespace android::uirenderer {

CanvasStateHelper::CanvasStateHelper(int width, int height) {
    resetState(width, height);
}

void CanvasStateHelper::resetState(int width, int height) {
    mInitialBounds = SkIRect::MakeWH(width, height);
    mSaveStack.clear();
    mClipStack.clear();
    mTransformStack.clear();
    mSaveStack.emplace_back();
    mClipStack.emplace_back().setRect(mInitialBounds);
    mTransformStack.emplace_back();
+18 −6
Original line number Diff line number Diff line
@@ -57,9 +57,7 @@ protected:
    }

    bool internalSave(SaveEntry saveEntry);
    bool internalSave(SaveFlags::Flags flags) {
        return internalSave(flagsToSaveEntry(flags));
    }

    void internalSaveLayer(const SkCanvas::SaveLayerRec& layerRec) {
        internalSave({
            .clip = true,
@@ -90,6 +88,8 @@ protected:
        return mClipStack[mCurrentClipIndex];
    }

    void resetState(int width, int height);

public:
    int saveCount() const { return mSaveStack.size(); }

@@ -186,14 +186,26 @@ public:
        submit(std::move(op));
    }

    const CanvasOpReceiver& receiver() const { return mReceiver; }
    const CanvasOpReceiver& receiver() const { return *mReceiver; }

    CanvasOpReceiver finish() {
        auto ret = std::move(mReceiver.value());
        mReceiver.reset();
        return std::move(ret);
    }

    template<class... Args>
    void reset(int newWidth, int newHeight, Args&&... args) {
        resetState(newWidth, newHeight);
        mReceiver.emplace(std::forward<Args>(args)...);
    }

private:
    CanvasOpReceiver mReceiver;
    std::optional<CanvasOpReceiver> mReceiver;

    template <CanvasOpType T>
    void submit(CanvasOp<T>&& op) {
        mReceiver.push_container(CanvasOpContainer(std::move(op), transform()));
        mReceiver->push_container(CanvasOpContainer(std::move(op), transform()));
    }
};

Loading