Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e9d9b2a authored by Chris Craik's avatar Chris Craik
Browse files

Revert to save-layer based alpha if layer would be too large

bug:21011574
Change-Id: I323f2398188ffc2bbed6a98578d25d7e5f6c337d
parent cc87cfa2
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -392,11 +392,27 @@ void RenderNode::setViewProperties(OpenGLRenderer& renderer, T& handler) {
        if (isLayer) {
            clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer
        }
        LOG_ALWAYS_FATAL_IF(!isLayer && properties().getHasOverlappingRendering());
        if (CC_LIKELY(isLayer || !properties().getHasOverlappingRendering())) {
            // simply scale rendering content's alpha
            renderer.scaleAlpha(properties().getAlpha());
        } else {
            // savelayer needed to create an offscreen buffer
            Rect layerBounds(0, 0, getWidth(), getHeight());
            if (clipFlags) {
                properties().getClippingRectForFlags(clipFlags, &layerBounds);
                clipFlags = 0; // all clipping done by savelayer
            }
            SaveLayerOp* op = new (handler.allocator()) SaveLayerOp(
                    layerBounds.left, layerBounds.top,
                    layerBounds.right, layerBounds.bottom,
                    (int) (properties().getAlpha() * 255),
                    SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kClipToLayer_SaveFlag);
            handler(op, PROPERTY_SAVECOUNT, properties().getClipToBounds());
        }

        if (CC_UNLIKELY(ATRACE_ENABLED() && properties().promotedToLayer())) {
            // pretend to cause savelayer to warn about performance problem affecting old versions
            // pretend alpha always causes savelayer to warn about
            // performance problem affecting old versions
            ATRACE_FORMAT("%s alpha caused saveLayer %dx%d", getName(),
                    static_cast<int>(getWidth()),
                    static_cast<int>(getHeight()));
+18 −1
Original line number Diff line number Diff line
@@ -152,7 +152,24 @@ void RenderProperties::debugOutputProperties(const int level) const {
            clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer
        }

        if (CC_LIKELY(isLayer || !getHasOverlappingRendering())) {
            // simply scale rendering content's alpha
            ALOGD("%*sScaleAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha);
        } else {
            // savelayeralpha to create an offscreen buffer to apply alpha
            Rect layerBounds(0, 0, getWidth(), getHeight());
            if (clipFlags) {
                getClippingRectForFlags(clipFlags, &layerBounds);
                clipFlags = 0; // all clipping done by savelayer
            }
            ALOGD("%*sSaveLayerAlpha %d, %d, %d, %d, %d, 0x%x", level * 2, "",
                    (int)layerBounds.left, (int)layerBounds.top,
                    (int)layerBounds.right, (int)layerBounds.bottom,
                    (int)(mPrimitiveFields.mAlpha * 255),
                    SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kClipToLayer_SaveFlag);
        }


    }
    if (clipFlags) {
        Rect clipRect;
+5 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <SkRegion.h>
#include <SkXfermode.h>

#include "Caches.h"
#include "Rect.h"
#include "RevealClip.h"
#include "Outline.h"
@@ -577,10 +578,13 @@ 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.mHasOverlappingRendering
                && mPrimitiveFields.mWidth <= maxTextureSize
                && mPrimitiveFields.mHeight <= maxTextureSize;
    }

    LayerType effectiveLayerType() const {