diff options
author | Sreedhar Telukuntla <stelukun@codeaurora.org> | 2013-06-27 19:27:22 +0530 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2013-07-23 18:12:30 +0000 |
commit | 3307cd4dbaf8dd28f543336b7094be690eade0a2 (patch) | |
tree | dd57591691a3a674fe52f2a067a3657b8a994fb6 /libs | |
parent | aa18a86e9635b069c74c18c2b89a67e7dd403b5c (diff) | |
download | frameworks_base-3307cd4dbaf8dd28f543336b7094be690eade0a2.zip frameworks_base-3307cd4dbaf8dd28f543336b7094be690eade0a2.tar.gz frameworks_base-3307cd4dbaf8dd28f543336b7094be690eade0a2.tar.bz2 |
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
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 3 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.cpp | 11 | ||||
-rw-r--r-- | libs/hwui/Snapshot.cpp | 13 | ||||
-rw-r--r-- | libs/hwui/Snapshot.h | 15 |
4 files changed, 41 insertions, 1 deletions
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<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; 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<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); 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; |