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

Commit e29ce6f5 authored by Chris Craik's avatar Chris Craik
Browse files

Add functor support to new reorderer/renderer

bug:22480459

Change-Id: I95df7e0504f62d254e8ffbd8d65ed5d763080b9c
parent f928d4aa
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -518,6 +518,10 @@ void BakedOpDispatcher::onBitmapRectOp(BakedOpRenderer& renderer, const BitmapRe
    renderer.renderGlop(state, glop);
}

void BakedOpDispatcher::onFunctorOp(BakedOpRenderer& renderer, const FunctorOp& op, const BakedOpState& state) {
    renderer.renderFunctor(op, state);
}

void BakedOpDispatcher::onLinesOp(BakedOpRenderer& renderer, const LinesOp& op, const BakedOpState& state) {
    VertexBuffer buffer;
    PathTessellator::tessellateLines(op.points, op.floatCount, op.paint,
+22 −1
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ Texture* BakedOpRenderer::getTexture(const SkBitmap* bitmap) {
    return texture;
}

void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop) {
void BakedOpRenderer::prepareRender(const Rect* dirtyBounds, const Rect* clip) {
    mRenderState.scissor().setEnabled(clip != nullptr);
    if (clip) {
        mRenderState.scissor().set(clip->left, mRenderTarget.viewportHeight - clip->bottom,
@@ -140,10 +140,31 @@ void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, cons
                dirtyBounds->right, dirtyBounds->bottom);
        mRenderTarget.offscreenBuffer->region.orSelf(dirty);
    }
}

void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop) {
    prepareRender(dirtyBounds, clip);
    mRenderState.render(glop, mRenderTarget.orthoMatrix);
    if (!mRenderTarget.frameBufferId) mHasDrawn = true;
}

void BakedOpRenderer::renderFunctor(const FunctorOp& op, const BakedOpState& state) {
    prepareRender(&state.computedState.clippedBounds, &state.computedState.clipRect);

    DrawGlInfo info;
    auto&& clip = state.computedState.clipRect;
    info.clipLeft = clip.left;
    info.clipTop = clip.top;
    info.clipRight = clip.right;
    info.clipBottom = clip.bottom;
    info.isLayer = offscreenRenderTarget();
    info.width = mRenderTarget.viewportWidth;
    info.height = mRenderTarget.viewportHeight;
    state.computedState.transform.copyTo(&info.transform[0]);

    mRenderState.invokeFunctor(op.functor, DrawGlInfo::kModeDraw, &info);
}

void BakedOpRenderer::dirtyRenderTarget(const Rect& uiDirty) {
    if (mRenderTarget.offscreenBuffer) {
        android::Rect dirty(uiDirty.left, uiDirty.top, uiDirty.right, uiDirty.bottom);
+4 −2
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ public:
    void endLayer();

    Texture* getTexture(const SkBitmap* bitmap);
    const LightInfo& getLightInfo() { return mLightInfo; }
    const LightInfo& getLightInfo() const { return mLightInfo; }

    void renderGlop(const BakedOpState& state, const Glop& glop) {
        bool useScissor = state.computedState.clipSideFlags != OpClipSideFlags::None;
@@ -73,14 +73,16 @@ public:
                useScissor ? &state.computedState.clipRect : nullptr,
                glop);
    }
    void renderFunctor(const FunctorOp& op, const BakedOpState& state);

    void renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop);
    bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; }
    void dirtyRenderTarget(const Rect& dirtyRect);
    bool didDraw() { return mHasDrawn; }
    bool didDraw() const { return mHasDrawn; }
private:
    void setViewport(uint32_t width, uint32_t height);
    void clearColorBuffer(const Rect& clearRect);
    void prepareRender(const Rect* dirtyBounds, const Rect* clip);

    RenderState& mRenderState;
    Caches& mCaches;
+6 −0
Original line number Diff line number Diff line
@@ -784,6 +784,12 @@ void OpReorderer::deferCirclePropsOp(const CirclePropsOp& op) {
    deferOvalOp(*resolvedOp);
}

void OpReorderer::deferFunctorOp(const FunctorOp& op) {
    BakedOpState* bakedState = tryBakeOpState(op);
    if (!bakedState) return; // quick rejected
    currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::None);
}

void OpReorderer::deferLinesOp(const LinesOp& op) {
    batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices;
    deferStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced);
+8 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ struct Vertex;
        U_OP_FN(BitmapMeshOp) \
        U_OP_FN(BitmapRectOp) \
        U_OP_FN(CirclePropsOp) \
        U_OP_FN(FunctorOp) \
        U_OP_FN(LinesOp) \
        U_OP_FN(OvalOp) \
        M_OP_FN(PatchOp) \
@@ -195,6 +196,13 @@ struct CirclePropsOp : RecordedOp {
    const float* radius;
};

struct FunctorOp : RecordedOp {
    FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor)
            : SUPER_PAINTLESS(FunctorOp)
            , functor(functor) {}
    Functor* functor;
};

struct LinesOp : RecordedOp {
    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
            : SUPER(LinesOp)
Loading