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

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

Merge "Fix a couple crashes in the new reorderer"

parents 292494a5 84ad6149
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ void BakedOpRenderer::setViewport(uint32_t width, uint32_t height) {
}

void BakedOpRenderer::clearColorBuffer(const Rect& rect) {
    if (Rect(mRenderTarget.viewportWidth, mRenderTarget.viewportHeight).contains(rect)) {
    if (rect.contains(Rect(mRenderTarget.viewportWidth, mRenderTarget.viewportHeight))) {
        // Full viewport is being cleared - disable scissor
        mRenderState.scissor().setEnabled(false);
    } else {
+7 −4
Original line number Diff line number Diff line
@@ -40,7 +40,8 @@ FrameReorderer::FrameReorderer(const LayerUpdateQueue& layers, const SkRect& cli
    mLayerStack.reserve(layers.entries().size());

    // Prepare to defer Fbo0
    mLayerReorderers.emplace_back(viewportWidth, viewportHeight, Rect(clip));
    auto fbo0 = mAllocator.create<LayerReorderer>(viewportWidth, viewportHeight, Rect(clip));
    mLayerReorderers.push_back(fbo0);
    mLayerStack.push_back(0);
    mCanvasState.initializeSaveStack(viewportWidth, viewportHeight,
            clip.fLeft, clip.fTop, clip.fRight, clip.fBottom,
@@ -602,7 +603,9 @@ void FrameReorderer::saveForLayer(uint32_t layerWidth, uint32_t layerHeight,

    // create a new layer repaint, and push its index on the stack
    mLayerStack.push_back(mLayerReorderers.size());
    mLayerReorderers.emplace_back(layerWidth, layerHeight, repaintRect, beginLayerOp, renderNode);
    auto newFbo = mAllocator.create<LayerReorderer>(layerWidth, layerHeight,
            repaintRect, beginLayerOp, renderNode);
    mLayerReorderers.push_back(newFbo);
}

void FrameReorderer::restoreForLayer() {
@@ -671,7 +674,7 @@ void FrameReorderer::deferEndLayerOp(const EndLayerOp& /* ignored */) {
            beginLayerOp.localMatrix,
            beginLayerOp.localClip,
            beginLayerOp.paint,
            &mLayerReorderers[finishedLayerIndex].offscreenBuffer);
            &(mLayerReorderers[finishedLayerIndex]->offscreenBuffer));
    BakedOpState* bakedOpState = tryBakeOpState(*drawLayerOp);

    if (bakedOpState) {
@@ -681,7 +684,7 @@ void FrameReorderer::deferEndLayerOp(const EndLayerOp& /* ignored */) {
        // Layer won't be drawn - delete its drawing batches to prevent it from doing any work
        // TODO: need to prevent any render work from being done
        // - create layerop earlier for reject purposes?
        mLayerReorderers[finishedLayerIndex].clear();
        mLayerReorderers[finishedLayerIndex]->clear();
        return;
    }
}
+5 −5
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ public:
        // Relay through layers in reverse order, since layers
        // later in the list will be drawn by earlier ones
        for (int i = mLayerReorderers.size() - 1; i >= 1; i--) {
            LayerReorderer& layer = mLayerReorderers[i];
            LayerReorderer& layer = *(mLayerReorderers[i]);
            if (layer.renderNode) {
                // cached HW layer - can't skip layer if empty
                renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect);
@@ -112,7 +112,7 @@ public:
            }
        }

        const LayerReorderer& fbo0 = mLayerReorderers[0];
        const LayerReorderer& fbo0 = *(mLayerReorderers[0]);
        renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect);
        fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
        renderer.endFrame(fbo0.repaintRect);
@@ -120,7 +120,7 @@ public:

    void dump() const {
        for (auto&& layer : mLayerReorderers) {
            layer.dump();
            layer->dump();
        }
    }

@@ -143,7 +143,7 @@ private:
            const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
    void restoreForLayer();

    LayerReorderer& currentLayer() { return mLayerReorderers[mLayerStack.back()]; }
    LayerReorderer& currentLayer() { return *(mLayerReorderers[mLayerStack.back()]); }

    BakedOpState* tryBakeOpState(const RecordedOp& recordedOp) {
        return BakedOpState::tryConstruct(mAllocator, *mCanvasState.writableSnapshot(), recordedOp);
@@ -183,7 +183,7 @@ private:
#undef X

    // List of every deferred layer's render state. Replayed in reverse order to render a frame.
    std::vector<LayerReorderer> mLayerReorderers;
    std::vector<LayerReorderer*> mLayerReorderers;

    /*
     * Stack of indices within mLayerReorderers representing currently active layers. If drawing
+0 −2
Original line number Diff line number Diff line
@@ -269,8 +269,6 @@ void LayerReorderer::flushLayerClears(LinearAllocator& allocator) {
                verts, vertCount);
        BakedOpState* bakedState = BakedOpState::directConstruct(allocator,
                &viewportClip, bounds, *op);


        deferUnmergeableOp(allocator, bakedState, OpBatchType::Vertices);
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include "ClipArea.h"
#include "Rect.h"
#include "utils/Macros.h"

#include <vector>
#include <unordered_map>
@@ -67,6 +68,8 @@ typedef void (*MergedOpReceiver)(void*, const MergedBakedOpList& opList);
 * for a single FBO/layer.
 */
class LayerReorderer {
// Prevent copy/assign because users may stash pointer to offscreenBuffer and viewportClip
PREVENT_COPY_AND_ASSIGN(LayerReorderer);
public:
    // Create LayerReorderer for Fbo0
    LayerReorderer(uint32_t width, uint32_t height, const Rect& repaintRect)