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

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

Better handle op size edge cases

bug:9464358

Previously, empty and unknown sized ops are assumed to fully cover
their clip. This is now corrected such that empty sized ops are
pre-rejected before defer. Additionally, unknown sized ops disable
overdraw avoidance.

Change-Id: Icf2ce24f98be5ea6299e24ffcf826790373564a1
parent 4aaf8b3d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -470,6 +470,7 @@ void DeferredDisplayList::addDrawOp(OpenGLRenderer& renderer, DrawOp* op) {
    deferInfo.mergeable &= !recordingComplexClip();

    if (CC_LIKELY(mAvoidOverdraw) && mBatches.size() &&
            op->state.mClipSideFlags != kClipSide_ConservativeFull &&
            deferInfo.opaqueOverBounds && op->state.mBounds.contains(mBounds)) {
        // avoid overdraw by resetting drawing state + discarding drawing ops
        discardDrawingBatches(mBatches.size() - 1);
+4 −1
Original line number Diff line number Diff line
@@ -129,7 +129,10 @@ public:
            return;
        }

        if (!getLocalBounds(state.mBounds)) {
        if (getLocalBounds(state.mBounds)) {
            // valid empty bounds, don't bother deferring
            if (state.mBounds.isEmpty()) return;
        } else {
            // empty bounds signify bounds can't be calculated
            state.mBounds.setEmpty();
        }
+3 −3
Original line number Diff line number Diff line
@@ -1395,9 +1395,9 @@ bool OpenGLRenderer::storeDisplayState(DeferredDisplayState& state, int stateDef
            }
            state.mBounds.set(clippedBounds);
        } else {
            // If we don't have bounds, let's assume we're clipped
            // to prevent merging
            state.mClipSideFlags = kClipSide_Full;
            // Empty bounds implies size unknown. Label op as conservatively clipped to disable
            // overdraw avoidance (since we don't know what it overlaps)
            state.mClipSideFlags = kClipSide_ConservativeFull;
            state.mBounds.set(currentClip);
        }
    }
+2 −1
Original line number Diff line number Diff line
@@ -86,7 +86,8 @@ enum ClipSideFlags {
    kClipSide_Top = 0x2,
    kClipSide_Right = 0x4,
    kClipSide_Bottom = 0x8,
    kClipSide_Full = 0xF
    kClipSide_Full = 0xF,
    kClipSide_ConservativeFull = 0x1F
};

struct DeferredDisplayState {