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

Commit 3307cd4d authored by Sreedhar Telukuntla's avatar Sreedhar Telukuntla Committed by Gerrit Code Review
Browse files

Add tile dimensions into snapshot and use it for setting tile rect

Current tile rendering implementation in hwui sets the current
clip rect as tile rect during restore. This will limit the rendering
to the restored clip rect. Later in case if the app tries to render
outside the tile rect by setting a new clip rect, then all the pixels,
which are falling outside the tile rect are clipped off, this may result
into UI artifacats. This change adds the support for preserving the tile
clip as part of the snapshot and the same tile clip is used while
setting the tile rect. This way it is taken care that the correct tile
dimensions are preserved during save and retrieved during restore.

CRs-Fixed: 499767
Change-Id: Ia66b6dc8e7be5857949751a81e9f702c2d1c5a57
parent aa18a86e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1442,6 +1442,9 @@ status_t DisplayListRenderer::prepareDirty(float left, float top,
    mSaveCount = 1;

    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
#ifdef QCOM_HARDWARE
    mSnapshot->setTileClip(0.0f, 0.0f, mWidth, mHeight);
#endif
    mDirtyClip = opaque;

    mRestoreSaveCount = -1;
+10 −1
Original line number Diff line number Diff line
@@ -179,6 +179,9 @@ status_t OpenGLRenderer::prepareDirty(float left, float top, float right, float
    mSaveCount = 1;

    mSnapshot->setClip(left, top, right, bottom);
#ifdef QCOM_HARDWARE
    mSnapshot->setTileClip(left, top, right, bottom);
#endif
    mDirtyClip = true;

    updateLayers();
@@ -246,11 +249,14 @@ void OpenGLRenderer::syncState() {

void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) {
    if (!mSuppressTiling) {
#ifdef QCOM_HARDWARE
        const Rect* clip = &mSnapshot->getTileClip();
#else
        Rect* clip = mTilingSnapshot->clipRect;
        if (s->flags & Snapshot::kFlagIsFboLayer) {
            clip = s->clipRect;
        }

#endif
        mCaches.startTiling(clip->left, s->height - clip->bottom,
                clip->right - clip->left, clip->bottom - clip->top, opaque);
    }
@@ -800,6 +806,9 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui
    mSnapshot->fbo = layer->getFbo();
    mSnapshot->resetTransform(-bounds.left, -bounds.top, 0.0f);
    mSnapshot->resetClip(clip.left, clip.top, clip.right, clip.bottom);
#ifdef QCOM_HARDWARE
    mSnapshot->setTileClip(clip.left, clip.top, clip.right, clip.bottom);
#endif
    mSnapshot->viewport.set(0.0f, 0.0f, bounds.getWidth(), bounds.getHeight());
    mSnapshot->height = bounds.getHeight();
    mSnapshot->flags |= Snapshot::kFlagDirtyOrtho;
+13 −0
Original line number Diff line number Diff line
@@ -74,6 +74,9 @@ Snapshot::Snapshot(const sp<Snapshot>& s, int saveFlags):
    } else {
        region = NULL;
    }
#ifdef QCOM_HARDWARE
    mTileClip.set(s->getTileClip());
#endif
}

///////////////////////////////////////////////////////////////////////////////
@@ -192,6 +195,16 @@ const Rect& Snapshot::getLocalClip() {
    return mLocalClip;
}

#ifdef QCOM_HARDWARE
void Snapshot::setTileClip(float left, float top, float right, float bottom) {
    mTileClip.set(left, top, right, bottom);
}

const Rect& Snapshot::getTileClip() {
    return mTileClip;
}
#endif

void Snapshot::resetClip(float left, float top, float right, float bottom) {
    clipRect = &mClipRectRoot;
    setClip(left, top, right, bottom);
+15 −0
Original line number Diff line number Diff line
@@ -104,6 +104,18 @@ public:
     */
    const Rect& getLocalClip();

#ifdef QCOM_HARDWARE
    /**
     * Sets the current tile clip.
     */
    void setTileClip(float left, float top, float right, float bottom);

    /**
     * Returns the current tile clip in local coordinates.
     */
    const Rect& getTileClip();
#endif

    /**
     * Resets the clip to the specified rect.
     */
@@ -233,6 +245,9 @@ private:
    mat4 mTransformRoot;
    Rect mClipRectRoot;
    Rect mLocalClip;
#ifdef QCOM_HARDWARE
    Rect mTileClip;
#endif

#if STENCIL_BUFFER_SIZE
    SkRegion mClipRegionRoot;