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

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

Fix null offscreen buffer crash

bug:26571145

Change-Id: I6e885fd6135c0987360275cbf5b46475c24401d4
parent d38308e4
Loading
Loading
Loading
Loading
+25 −14
Original line number Diff line number Diff line
@@ -734,9 +734,19 @@ void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const Textur
}

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;

    // Note that we don't use op->paint here - it's never set on a LayerOp
    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);
    } else {
        float layerAlpha = op.alpha * state.alpha;
        Glop glop;
        GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
@@ -753,6 +763,7 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op,
            renderer.renderState().layerPool().putOrDelete(buffer);
        }
    }
}

void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op, const BakedOpState& state) {
    LOG_ALWAYS_FATAL_IF(*(op.layerHandle) != nullptr, "layer already exists!");
+2 −1
Original line number Diff line number Diff line
@@ -114,7 +114,8 @@ public:
                layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
                GL_CHECKPOINT(MODERATE);
                renderer.endLayer();
            } else if (!layer.empty()) { // save layer - skip entire layer if empty
            } else if (!layer.empty()) {
                // save layer - skip entire layer if empty (in which case, LayerOp has null layer).
                layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height);
                GL_CHECKPOINT(MODERATE);
                layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);