summaryrefslogtreecommitdiffstats
path: root/libs/hwui/DisplayList.cpp
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2013-02-21 11:30:22 -0800
committerChris Craik <ccraik@google.com>2013-02-21 16:12:00 -0800
commitb98a016c6769b9e80d392df22fe77a2fca048d9f (patch)
tree6a4adcd9e871baab9aae6f2f0ad80670ad4f66bd /libs/hwui/DisplayList.cpp
parent2b3a47b9ce0f422323395286937944a2afa51ed6 (diff)
downloadframeworks_base-b98a016c6769b9e80d392df22fe77a2fca048d9f.zip
frameworks_base-b98a016c6769b9e80d392df22fe77a2fca048d9f.tar.gz
frameworks_base-b98a016c6769b9e80d392df22fe77a2fca048d9f.tar.bz2
Fix clipping and stencil layer issues
bug:8235699 Ensure rectangle clipping operations disable deferring when necessary (i.e., when the op might create a non-rect region), including in DisplayList::setViewProperties Additionally, makes clipping with a kUnion always use a region, for consistency with software rendering Change-Id: I6730f1a80250bcf3f91cd4afde646d470a12dbc2
Diffstat (limited to 'libs/hwui/DisplayList.cpp')
-rw-r--r--libs/hwui/DisplayList.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index 398f719..8bfbf22 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -356,7 +356,9 @@ void DisplayList::outputViewProperties(uint32_t level) {
}
}
-void DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
+status_t DisplayList::setViewProperties(OpenGLRenderer& renderer, Rect& dirty,
+ int32_t flags, uint32_t level, DeferredDisplayList* deferredList) {
+ status_t status = DrawGlInfo::kStatusDone;
#if DEBUG_DISPLAYLIST
outputViewProperties(level);
#endif
@@ -377,6 +379,9 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
}
}
if (mAlpha < 1 && !mCaching) {
+ // flush since we'll either enter a Layer, or set alpha, both not supported in deferral
+ status |= deferredList->flush(renderer, dirty, flags, level);
+
if (!mHasOverlappingRendering) {
renderer.setAlpha(mAlpha);
} else {
@@ -392,9 +397,14 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
}
}
if (mClipChildren && !mCaching) {
+ if (CC_UNLIKELY(!renderer.hasRectToRectTransform())) {
+ // flush, since clip will likely be a region
+ status |= deferredList->flush(renderer, dirty, flags, level);
+ }
renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
SkRegion::kIntersect_Op);
}
+ return status;
}
status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level,
@@ -414,12 +424,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
DISPLAY_LIST_LOGD("%*sSave %d %d", level * 2, "",
SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
- if (mAlpha < 1 && !mCaching && CC_LIKELY(deferredList)) {
- // flush before a saveLayerAlpha/setAlpha
- // TODO: make this cleaner
- drawGlStatus |= deferredList->flush(renderer, dirty, flags, level);
- }
- setViewProperties(renderer, level);
+ drawGlStatus |= setViewProperties(renderer, dirty, flags, level, deferredList);
if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
DISPLAY_LIST_LOGD("%*sRestoreToCount %d", level * 2, "", restoreTo);