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

Commit 189e3e5e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix hw layer overdraw/update visualization" into nyc-dev

parents 23bf5462 37413289
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -259,6 +259,7 @@ LOCAL_SRC_FILES += \
    tests/unit/SkiaBehaviorTests.cpp \
    tests/unit/SnapshotTests.cpp \
    tests/unit/StringUtilsTests.cpp \
    tests/unit/TestUtilsTests.cpp \
    tests/unit/TextDropShadowCacheTests.cpp \
    tests/unit/VectorDrawableTests.cpp

+26 −6
Original line number Diff line number Diff line
@@ -791,6 +791,16 @@ void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const Textur
    renderer.renderGlop(state, glop);
}

void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state,
        int color, SkXfermode::Mode mode, SkColorFilter* colorFilter) {
    SkPaint paint;
    paint.setColor(color);
    paint.setXfermodeMode(mode);
    paint.setColorFilter(colorFilter);
    RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint);
    BakedOpDispatcher::onRectOp(renderer, rectOp, state);
}

void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) {
    // Note that we don't use op->paint in this function - it's never set on a LayerOp
    OffscreenBuffer* buffer = *op.layerHandle;
@@ -798,12 +808,9 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op,
    if (CC_UNLIKELY(!buffer)) {
        // Layer was not allocated, which can occur if there were no draw ops inside. We draw the
        // equivalent by drawing a rect with the same layer properties (alpha/xfer/filter).
        SkPaint paint;
        paint.setAlpha(op.alpha * 255);
        paint.setXfermodeMode(op.mode);
        paint.setColorFilter(op.colorFilter);
        RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint);
        BakedOpDispatcher::onRectOp(renderer, rectOp, state);
        int color = SkColorSetA(SK_ColorTRANSPARENT, op.alpha * 255);
        renderRectForLayer(renderer, op, state,
                color, op.mode, op.colorFilter);
    } else {
        float layerAlpha = op.alpha * state.alpha;
        Glop glop;
@@ -817,6 +824,19 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op,
                .build();
        renderer.renderGlop(state, glop);
    }

    if (buffer && !buffer->hasRenderedSinceRepaint) {
        buffer->hasRenderedSinceRepaint = true;
        if (CC_UNLIKELY(Properties::debugLayersUpdates)) {
            // render debug layer highlight
            renderRectForLayer(renderer, op, state,
                    0x7f00ff00, SkXfermode::Mode::kSrcOver_Mode, nullptr);
        } else if (CC_UNLIKELY(Properties::debugOverdraw)) {
            // render transparent to increment overdraw for repaint area
            renderRectForLayer(renderer, op, state,
                    SK_ColorTRANSPARENT, SkXfermode::Mode::kSrcOver_Mode, nullptr);
        }
    }
}

void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op, const BakedOpState& state) {
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const
    }

    mRenderTarget.offscreenBuffer = offscreenBuffer;
    mRenderTarget.offscreenBuffer->hasRenderedSinceRepaint = false;

    // create and bind framebuffer
    mRenderTarget.frameBufferId = mRenderState.createFramebuffer();
+3 −2
Original line number Diff line number Diff line
@@ -81,7 +81,8 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) {
        // only schedule repaint if node still on layer - possible it may have been
        // removed during a dropped frame, but layers may still remain scheduled so
        // as not to lose info on what portion is damaged
        if (CC_LIKELY(layerNode->getLayer() != nullptr)) {
        OffscreenBuffer* layer = layerNode->getLayer();
        if (CC_LIKELY(layer)) {
            ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u",
                    layerNode->getName(), layerNode->getWidth(), layerNode->getHeight());

@@ -90,7 +91,7 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) {

            // map current light center into RenderNode's coordinate space
            Vector3 lightCenter = mCanvasState.currentSnapshot()->getRelativeLightCenter();
            layerNode->getLayer()->inverseTransformInWindow.mapPoint3d(lightCenter);
            layer->inverseTransformInWindow.mapPoint3d(lightCenter);

            saveForLayer(layerNode->getWidth(), layerNode->getHeight(), 0, 0,
                    layerDamage, lightCenter, nullptr, layerNode);
+2 −0
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ public:
    // vbo / size of mesh
    GLsizei elementCount = 0;
    GLuint vbo = 0;

    bool hasRenderedSinceRepaint;
};

/**
Loading