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

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

Fix flicker from multiwindow resize

Move content bounds into DrawFrameTask. This ensures
that changes in bounds are synchronized with changes in
rendering commands, avoiding potential underdraw.

Bug: 64200212
Test: Repro steps in bug. Drag up/down on resize handle, verify
no flicker.

Change-Id: I3109acf262e23c2a7d8904f1dcbfc8273aaed65b
parent 95786f32
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -162,8 +162,8 @@ public:
    void addRenderNode(RenderNode* node, bool placeFront);
    void removeRenderNode(RenderNode* node);

    void setContentDrawBounds(int left, int top, int right, int bottom) {
        mContentDrawBounds.set(left, top, right, bottom);
    void setContentDrawBounds(const Rect& bounds) {
        mContentDrawBounds = bounds;
    }

    RenderState& getRenderState() {
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ namespace renderthread {
DrawFrameTask::DrawFrameTask()
        : mRenderThread(nullptr)
        , mContext(nullptr)
        , mContentDrawBounds(0, 0, 0, 0)
        , mSyncResult(SyncResult::OK) {
}

@@ -123,6 +124,7 @@ bool DrawFrameTask::syncFrameState(TreeInfo& info) {
        mLayers[i]->apply();
    }
    mLayers.clear();
    mContext->setContentDrawBounds(mContentDrawBounds);
    mContext->prepareTree(info, mFrameInfo, mSyncQueued, mTargetNode);

    // This is after the prepareTree so that any pending operations
+4 −0
Original line number Diff line number Diff line
@@ -61,6 +61,9 @@ public:
    virtual ~DrawFrameTask();

    void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode);
    void setContentDrawBounds(int left, int top, int right, int bottom) {
        mContentDrawBounds.set(left, top, right, bottom);
    }

    void pushLayerUpdate(DeferredLayerUpdater* layer);
    void removeLayerUpdate(DeferredLayerUpdater* layer);
@@ -82,6 +85,7 @@ private:
    RenderThread* mRenderThread;
    CanvasContext* mContext;
    RenderNode* mTargetNode = nullptr;
    Rect mContentDrawBounds;

    /*********************************************
     *  Single frame data
+1 −13
Original line number Diff line number Diff line
@@ -551,20 +551,8 @@ void RenderProxy::drawRenderNode(RenderNode* node) {
    staticPostAndWait(task);
}

CREATE_BRIDGE5(setContentDrawBounds, CanvasContext* context, int left, int top,
        int right, int bottom) {
    args->context->setContentDrawBounds(args->left, args->top, args->right, args->bottom);
    return nullptr;
}

void RenderProxy::setContentDrawBounds(int left, int top, int right, int bottom) {
    SETUP_TASK(setContentDrawBounds);
    args->context = mContext;
    args->left = left;
    args->top = top;
    args->right = right;
    args->bottom = bottom;
    staticPostAndWait(task);
    mDrawFrameTask.setContentDrawBounds(left, top, right, bottom);
}

CREATE_BRIDGE1(serializeDisplayListTree, CanvasContext* context) {