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

Commit 4c331c85 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Avoid unnecessary computation for shadows and clipping for rounded layers

Shadow layers did not need to generate the shader as it was not used
so avoid that overhead.

Setting a roundrect clip and then drawing a single rect of the same size
is always less efficient than just drawing the roundrect directly.

Test: librenderengine_test
Bug: 181028875
Change-Id: I4e333f34b886f630773e4d660973bf8aa4585635
parent 7c42bef7
Loading
Loading
Loading
Loading
+15 −13
Original line number Original line Diff line number Diff line
@@ -785,6 +785,18 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
            }
            }
        }
        }


        // Shadows are assumed to live only on their own layer - it's not valid
        // to draw the boundary rectangles when there is already a caster shadow
        // TODO(b/175915334): consider relaxing this restriction to enable more flexible
        // composition - using a well-defined invalid color is long-term less error-prone.
        if (layer->shadow.length > 0) {
            const auto rect = layer->geometry.roundedCornersRadius > 0
                    ? getSkRect(layer->geometry.roundedCornersCrop)
                    : bounds;
            drawShadow(canvas, rect, layer->geometry.roundedCornersRadius, layer->shadow);
            continue;
        }

        const ui::Dataspace targetDataspace = mUseColorManagement
        const ui::Dataspace targetDataspace = mUseColorManagement
                ? (needsLinearEffect(layer->colorTransform, layer->sourceDataspace,
                ? (needsLinearEffect(layer->colorTransform, layer->sourceDataspace,
                                     display.outputDataspace)
                                     display.outputDataspace)
@@ -892,20 +904,10 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,


        paint.setColorFilter(filter);
        paint.setColorFilter(filter);


        if (layer->shadow.length > 0) {
            const auto rect = layer->geometry.roundedCornersRadius > 0
                    ? getSkRect(layer->geometry.roundedCornersCrop)
                    : bounds;
            drawShadow(canvas, rect, layer->geometry.roundedCornersRadius, layer->shadow);
        } else {
            // Shadows are assumed to live only on their own layer - it's not valid
            // to draw the boundary retangles when there is already a caster shadow
            // TODO(b/175915334): consider relaxing this restriction to enable more flexible
            // composition - using a well-defined invalid color is long-term less error-prone.
            // Push the clipRRect onto the clip stack. Draw the image. Pop the clip.
        if (layer->geometry.roundedCornersRadius > 0) {
        if (layer->geometry.roundedCornersRadius > 0) {
                canvas->clipRRect(getRoundedRect(layer), true);
            paint.setAntiAlias(true);
            }
            canvas->drawRRect(getRoundedRect(layer), paint);
        } else {
            canvas->drawRect(bounds, paint);
            canvas->drawRect(bounds, paint);
        }
        }
    }
    }