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

Commit daab6a49 authored by Cairn Overturf's avatar Cairn Overturf
Browse files

Add back FPK optimization to box shadow drawing

This was previously added but I removed it thinking it was unnecessary.
In cases with many freeform windows (lots of overdraw) it still reduces GPU work period significantly.
On tangorpro it reduces from 16ms to 10ms.

Bug: 440206828
Test: Take trace of multi freeform scenario and observe decrease in render time compared to without.
Flag: com.android.window.flags.enable_freeform_box_shadows
Change-Id: I1a780f7c867019ee083a4ca04569d0e7a94d1301
parent f8812dfd
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -147,7 +147,8 @@ void BoxShadowUtils::cleanup() {
}

void BoxShadowUtils::drawBoxShadows(SkCanvas* canvas, const SkRect& rect, float cornerRadius,
                                    const android::gui::BoxShadowSettings& settings) {
                                    const android::gui::BoxShadowSettings& settings,
                                    bool shouldDrawFpkRect) {
    for (const gui::BoxShadowSettings::BoxShadowParams& box : settings.boxShadows) {
        SkRect boxRect = rect;
        boxRect.outset(box.spreadRadius, box.spreadRadius);
@@ -177,6 +178,23 @@ void BoxShadowUtils::drawBoxShadows(SkCanvas* canvas, const SkRect& rect, float
        sk_sp<SkShader> shader = mBlurImages[blurRadiusIndex];
        drawNineSlice(canvas, shader, boxRect, box.color, cornerScale);
    }

    if (shouldDrawFpkRect) {
        SFTRACE_NAME("FPKOptimization");
        // This optimization is just for Ganesh and can be removed once graphite is
        // enabled.
        // On a device with ARM Mali-G710 MP7 with 4 chrome windows open this
        // reduces GPU work period from 16ms to 10ms.
        SkRect killRect = rect;
        float inset = (1.0f - kSin45Deg) * cornerRadius;
        killRect.inset(inset, inset);

        SkPaint paint;
        paint.setAntiAlias(false);
        paint.setColor(0);
        paint.setBlendMode(SkBlendMode::kSrc);
        canvas->drawRect(killRect, paint);
    }
}

} // namespace android::renderengine::skia
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ public:
    void init(SkiaGpuContext* context);
    void cleanup();
    void drawBoxShadows(SkCanvas* canvas, const SkRect& rect, float cornerRadius,
                        const android::gui::BoxShadowSettings& settings);
                        const android::gui::BoxShadowSettings& settings, bool shouldDrawFpkRect);

private:
    static constexpr std::array<int, 8> kSupportedBlurRadius = {8, 12, 14, 16, 24, 28, 48, 64};
+2 −1
Original line number Diff line number Diff line
@@ -1092,8 +1092,9 @@ void SkiaRenderEngine::drawLayersInternal(

                float cornerRadius =
                        roundf(preferredOriginalBounds.radii(SkRRect::kUpperLeft_Corner).fX);

                mBoxShadowUtils.drawBoxShadows(canvas, preferredOriginalBounds.rect(), cornerRadius,
                                               layer.boxShadowSettings);
                                               layer.boxShadowSettings, supportsForwardPixelKill());
            }
        }