diff options
author | Chris Craik <ccraik@google.com> | 2013-02-21 11:30:22 -0800 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2013-02-21 16:12:00 -0800 |
commit | b98a016c6769b9e80d392df22fe77a2fca048d9f (patch) | |
tree | 6a4adcd9e871baab9aae6f2f0ad80670ad4f66bd /libs/hwui/DisplayList.cpp | |
parent | 2b3a47b9ce0f422323395286937944a2afa51ed6 (diff) | |
download | frameworks_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.cpp | 19 |
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); |