summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSreedhar Telukuntla <stelukun@codeaurora.org>2013-06-27 19:27:22 +0530
committerGerrit Code Review <gerrit@cyanogenmod.org>2013-07-23 18:12:30 +0000
commit3307cd4dbaf8dd28f543336b7094be690eade0a2 (patch)
treedd57591691a3a674fe52f2a067a3657b8a994fb6
parentaa18a86e9635b069c74c18c2b89a67e7dd403b5c (diff)
downloadframeworks_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
-rw-r--r--libs/hwui/DisplayListRenderer.cpp3
-rwxr-xr-xlibs/hwui/OpenGLRenderer.cpp11
-rw-r--r--libs/hwui/Snapshot.cpp13
-rw-r--r--libs/hwui/Snapshot.h15
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;