diff options
author | Chris Craik <ccraik@google.com> | 2015-06-08 16:49:43 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2015-06-12 13:34:58 -0700 |
commit | a766cb2bce5db9108c0266fbebea6aa18d5713ff (patch) | |
tree | 2718003d7dc16d0a5f94aeda1acf40c5eaae8fad /libs/hwui/RenderProperties.h | |
parent | 4e9d9b2a590105035c29f12ecf0689333e6b55e7 (diff) |
Put WebViews with on a HW layer if stencil/shader clipping is needed
bug:17322378
Change-Id: I0de574bf116b30e2ad4194366e19d47d49708902
Diffstat (limited to 'libs/hwui/RenderProperties.h')
-rw-r--r-- | libs/hwui/RenderProperties.h | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h index 65c1c4a17412..81cf2dfac9b6 100644 --- a/libs/hwui/RenderProperties.h +++ b/libs/hwui/RenderProperties.h @@ -158,6 +158,32 @@ public: } } + /** + * Set internal layer state based on whether this layer + * + * Additionally, returns true if child RenderNodes with functors will need to use a layer + * to support clipping. + */ + bool prepareForFunctorPresence(bool willHaveFunctor, bool ancestorDictatesFunctorsNeedLayer) { + // parent may have already dictated that a descendant layer is needed + bool functorsNeedLayer = ancestorDictatesFunctorsNeedLayer + + // Round rect clipping forces layer for functors + || CC_UNLIKELY(getOutline().willClip()) + || CC_UNLIKELY(getRevealClip().willClip()) + + // Complex matrices forces layer, due to stencil clipping + || CC_UNLIKELY(getTransformMatrix() && !getTransformMatrix()->isScaleTranslate()) + || CC_UNLIKELY(getAnimationMatrix() && !getAnimationMatrix()->isScaleTranslate()) + || CC_UNLIKELY(getStaticMatrix() && !getStaticMatrix()->isScaleTranslate()); + + mComputedFields.mNeedLayerForFunctors = (willHaveFunctor && functorsNeedLayer); + + // If on a layer, will have consumed the need for isolating functors from stencil. + // Thus, it's safe to reset the flag until some descendent sets it. + return CC_LIKELY(effectiveLayerType() == LayerType::None) && functorsNeedLayer; + } + RenderProperties& operator=(const RenderProperties& other); bool setClipToBounds(bool clipToBounds) { @@ -580,15 +606,16 @@ public: bool promotedToLayer() const { const int maxTextureSize = Caches::getInstance().maxTextureSize; return mLayerProperties.mType == LayerType::None - && !MathUtils::isZero(mPrimitiveFields.mAlpha) - && mPrimitiveFields.mAlpha < 1 - && mPrimitiveFields.mHasOverlappingRendering && mPrimitiveFields.mWidth <= maxTextureSize - && mPrimitiveFields.mHeight <= maxTextureSize; + && mPrimitiveFields.mHeight <= maxTextureSize + && (mComputedFields.mNeedLayerForFunctors + || (!MathUtils::isZero(mPrimitiveFields.mAlpha) + && mPrimitiveFields.mAlpha < 1 + && mPrimitiveFields.mHasOverlappingRendering)); } LayerType effectiveLayerType() const { - return promotedToLayer() ? LayerType::RenderLayer : mLayerProperties.mType; + return CC_UNLIKELY(promotedToLayer()) ? LayerType::RenderLayer : mLayerProperties.mType; } private: @@ -636,6 +663,9 @@ private: SkMatrix* mTransformMatrix; Sk3DView mTransformCamera; + + // Force layer on for functors to enable render features they don't yet support (clipping) + bool mNeedLayerForFunctors = false; } mComputedFields; }; |