From 3307cd4dbaf8dd28f543336b7094be690eade0a2 Mon Sep 17 00:00:00 2001 From: Sreedhar Telukuntla Date: Thu, 27 Jun 2013 19:27:22 +0530 Subject: 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 --- libs/hwui/DisplayListRenderer.cpp | 3 +++ libs/hwui/OpenGLRenderer.cpp | 11 ++++++++++- libs/hwui/Snapshot.cpp | 13 +++++++++++++ libs/hwui/Snapshot.h | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 7a38b40..8d2a84e 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -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; diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 7309e46..efae551 100755 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -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& 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; diff --git a/libs/hwui/Snapshot.cpp b/libs/hwui/Snapshot.cpp index fbc8455..e2675a8 100644 --- a/libs/hwui/Snapshot.cpp +++ b/libs/hwui/Snapshot.cpp @@ -74,6 +74,9 @@ Snapshot::Snapshot(const sp& 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); diff --git a/libs/hwui/Snapshot.h b/libs/hwui/Snapshot.h index 9c612ff..18d405b 100644 --- a/libs/hwui/Snapshot.h +++ b/libs/hwui/Snapshot.h @@ -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; -- cgit v1.1