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

Commit c7e3e0c1 authored by YCairn Overturf's avatar YCairn Overturf
Browse files

Don't force client composition when rounded corners are cached

Also tweak client composition summary characters so that all composition types correspond to a unique character.

Example with a few freeform windows open
Before: Layers: 19 [b:brrrr]r[R:rrrrrr]R[R:bbb]
After:  Layers: 19 [b:brrrr]r[r:rrrrrr]R[r:bbb]
There are 2 fewer client composited layers.

See go/shadow-caching for more examples.

Bug: 391428079
Test: Open a few freeform windows and take a perfetto trace. Ensure layers with rounded corners are being
Flag: EXEMPT bug fix
Change-Id: I88752bd6e03f531d3c7ed004cc085a255c4dc67c
parent 3595275f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ private:
    void detectDisallowedCompositionTypeChange(
            aidl::android::hardware::graphics::composer3::Composition from,
            aidl::android::hardware::graphics::composer3::Composition to) const;
    bool isClientCompositionForced(bool isPeekingThrough) const;
    bool isClientCompositionForced(bool isPeekingThrough, bool isCached) const;
    void updateLuts(const LayerFECompositionState&,
                    const std::optional<std::vector<std::optional<LutProperties>>>& properties);
};
+7 −3
Original line number Diff line number Diff line
@@ -865,7 +865,8 @@ void OutputLayer::writeCompositionTypeToHWC(HWC2::Layer* hwcLayer,
                                            bool isPeekingThrough, bool skipLayer) {
    auto& outputDependentState = editState();

    if (isClientCompositionForced(isPeekingThrough)) {
    bool isCached = !skipLayer && outputDependentState.overrideInfo.buffer;
    if (isClientCompositionForced(isPeekingThrough, isCached)) {
        // If we are forcing client composition, we need to tell the HWC
        requestedCompositionType = Composition::CLIENT;
    }
@@ -955,9 +956,12 @@ void OutputLayer::detectDisallowedCompositionTypeChange(Composition from, Compos
    }
}

bool OutputLayer::isClientCompositionForced(bool isPeekingThrough) const {
bool OutputLayer::isClientCompositionForced(bool isPeekingThrough, bool isCached) const {
    // If this layer was flattened into a CachedSet then it is not necessary for
    // the GPU to compose it.
    bool requiresClientDrawnRoundedCorners = !isCached && getLayerFE().hasRoundedCorners();
    return getState().forceClientComposition ||
            (!isPeekingThrough && getLayerFE().hasRoundedCorners());
            (!isPeekingThrough && requiresClientDrawnRoundedCorners);
}

void OutputLayer::applyDeviceCompositionTypeChange(Composition compositionType) {
+2 −2
Original line number Diff line number Diff line
@@ -544,7 +544,7 @@ char LayerSnapshot::classifyCompositionForDebug(
        case Composition::INVALID:
            return 'i';
        case Composition::SOLID_COLOR:
            return 'c';
            return 'e';
        case Composition::CURSOR:
            return 'u';
        case Composition::SIDEBAND:
@@ -552,7 +552,7 @@ char LayerSnapshot::classifyCompositionForDebug(
        case Composition::DISPLAY_DECORATION:
            return 'a';
        case Composition::REFRESH_RATE_INDICATOR:
            return 'r';
            return 'f';
        case Composition::CLIENT:
        case Composition::DEVICE:
            break;