Loading libs/hwui/DisplayList.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading @@ -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, Loading @@ -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); Loading libs/hwui/DisplayList.h +2 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,8 @@ public: kReplayFlag_ClipChildren = 0x1 }; void setViewProperties(OpenGLRenderer& renderer, uint32_t level); status_t setViewProperties(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level, DeferredDisplayList* deferredList); void outputViewProperties(uint32_t level); ANDROID_API size_t getSize(); Loading libs/hwui/DisplayListOp.h +15 −6 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ public: virtual status_t replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, int saveCount, uint32_t level, bool caching, int multipliedAlpha, DeferredDisplayList* deferredList) { status_t status = DrawGlInfo::kStatusDone; if (deferredList && requiresDrawOpFlush()) { if (deferredList && requiresDrawOpFlush(renderer)) { // will be setting renderer state that affects ops in deferredList, so flush list first status |= deferredList->flush(renderer, dirty, flags, level); } Loading @@ -114,7 +114,7 @@ public: * Returns true if it affects renderer drawing state in such a way to break deferral * see OpenGLRenderer::disallowDeferral() */ virtual bool requiresDrawOpFlush() { return false; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return false; } }; class DrawOp : public DisplayListOp { Loading Loading @@ -272,7 +272,7 @@ public: } virtual const char* name() { return "SaveLayer"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: Rect mArea; Loading @@ -294,7 +294,7 @@ public: } virtual const char* name() { return "SaveLayerAlpha"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: Rect mArea; Loading Loading @@ -434,7 +434,16 @@ public: virtual const char* name() { return "ClipRect"; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { // TODO: currently, we flush when we *might* cause a clip region to exist. Ideally, we // should only flush when a non-rectangular clip would result return !renderer.hasRectToRectTransform() || !hasRectToRectOp(); } private: inline bool hasRectToRectOp() { return mOp == SkRegion::kIntersect_Op || mOp == SkRegion::kReplace_Op; } Rect mArea; SkRegion::Op mOp; }; Loading @@ -455,7 +464,7 @@ public: } virtual const char* name() { return "ClipPath"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: SkPath* mPath; Loading @@ -478,7 +487,7 @@ public: } virtual const char* name() { return "ClipRegion"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: SkRegion* mRegion; Loading libs/hwui/OpenGLRenderer.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -1284,6 +1284,10 @@ void OpenGLRenderer::setMatrix(SkMatrix* matrix) { } } bool OpenGLRenderer::hasRectToRectTransform() { return CC_LIKELY(mSnapshot->transform->rectToRect()); } void OpenGLRenderer::getMatrix(SkMatrix* matrix) { mSnapshot->transform->copyTo(*matrix); } Loading Loading @@ -1505,8 +1509,10 @@ void OpenGLRenderer::setupDraw(bool clear) { if (clear) clearLayerRegions(); // Make sure setScissor & setStencil happen at the beginning of // this method if (mDirtyClip && mCaches.scissorEnabled) { if (mDirtyClip) { if (mCaches.scissorEnabled) { setScissorFromClip(); } setStencilFromClip(); } mDescription.reset(); Loading libs/hwui/OpenGLRenderer.h +1 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,7 @@ public: virtual void scale(float sx, float sy); virtual void skew(float sx, float sy); bool hasRectToRectTransform(); ANDROID_API void getMatrix(SkMatrix* matrix); virtual void setMatrix(SkMatrix* matrix); virtual void concatMatrix(SkMatrix* matrix); Loading Loading
libs/hwui/DisplayList.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading @@ -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, Loading @@ -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); Loading
libs/hwui/DisplayList.h +2 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,8 @@ public: kReplayFlag_ClipChildren = 0x1 }; void setViewProperties(OpenGLRenderer& renderer, uint32_t level); status_t setViewProperties(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level, DeferredDisplayList* deferredList); void outputViewProperties(uint32_t level); ANDROID_API size_t getSize(); Loading
libs/hwui/DisplayListOp.h +15 −6 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ public: virtual status_t replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, int saveCount, uint32_t level, bool caching, int multipliedAlpha, DeferredDisplayList* deferredList) { status_t status = DrawGlInfo::kStatusDone; if (deferredList && requiresDrawOpFlush()) { if (deferredList && requiresDrawOpFlush(renderer)) { // will be setting renderer state that affects ops in deferredList, so flush list first status |= deferredList->flush(renderer, dirty, flags, level); } Loading @@ -114,7 +114,7 @@ public: * Returns true if it affects renderer drawing state in such a way to break deferral * see OpenGLRenderer::disallowDeferral() */ virtual bool requiresDrawOpFlush() { return false; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return false; } }; class DrawOp : public DisplayListOp { Loading Loading @@ -272,7 +272,7 @@ public: } virtual const char* name() { return "SaveLayer"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: Rect mArea; Loading @@ -294,7 +294,7 @@ public: } virtual const char* name() { return "SaveLayerAlpha"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: Rect mArea; Loading Loading @@ -434,7 +434,16 @@ public: virtual const char* name() { return "ClipRect"; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { // TODO: currently, we flush when we *might* cause a clip region to exist. Ideally, we // should only flush when a non-rectangular clip would result return !renderer.hasRectToRectTransform() || !hasRectToRectOp(); } private: inline bool hasRectToRectOp() { return mOp == SkRegion::kIntersect_Op || mOp == SkRegion::kReplace_Op; } Rect mArea; SkRegion::Op mOp; }; Loading @@ -455,7 +464,7 @@ public: } virtual const char* name() { return "ClipPath"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: SkPath* mPath; Loading @@ -478,7 +487,7 @@ public: } virtual const char* name() { return "ClipRegion"; } virtual bool requiresDrawOpFlush() { return true; } virtual bool requiresDrawOpFlush(OpenGLRenderer& renderer) { return true; } private: SkRegion* mRegion; Loading
libs/hwui/OpenGLRenderer.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -1284,6 +1284,10 @@ void OpenGLRenderer::setMatrix(SkMatrix* matrix) { } } bool OpenGLRenderer::hasRectToRectTransform() { return CC_LIKELY(mSnapshot->transform->rectToRect()); } void OpenGLRenderer::getMatrix(SkMatrix* matrix) { mSnapshot->transform->copyTo(*matrix); } Loading Loading @@ -1505,8 +1509,10 @@ void OpenGLRenderer::setupDraw(bool clear) { if (clear) clearLayerRegions(); // Make sure setScissor & setStencil happen at the beginning of // this method if (mDirtyClip && mCaches.scissorEnabled) { if (mDirtyClip) { if (mCaches.scissorEnabled) { setScissorFromClip(); } setStencilFromClip(); } mDescription.reset(); Loading
libs/hwui/OpenGLRenderer.h +1 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,7 @@ public: virtual void scale(float sx, float sy); virtual void skew(float sx, float sy); bool hasRectToRectTransform(); ANDROID_API void getMatrix(SkMatrix* matrix); virtual void setMatrix(SkMatrix* matrix); virtual void concatMatrix(SkMatrix* matrix); Loading