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

Commit c773472b authored by Alec Mouri's avatar Alec Mouri
Browse files

Fix caching runtime toggle

1. When caching is disabled, the override info must be cleared before
repainting the screen. Otherwise, ignored layers may persist in HWC.
2. Dispatch the caching toggle on the main thread, to de-risk threading
issues.

Bug: 188611599
Test: adb shell service call SurfaceFlinger i32 1040 0, then check
dumpsys

Change-Id: I6926e69fb9762209c958beceb2679cd7a5806306
Merged-In: I6926e69fb9762209c958beceb2679cd7a5806306
parent 4d7a0661
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -136,6 +136,14 @@ void Output::setLayerCachingEnabled(bool enabled) {
    } else {
        mPlanner.reset();
    }

    for (auto* outputLayer : getOutputLayersOrderedByZ()) {
        if (!outputLayer) {
            continue;
        }

        outputLayer->editState().overrideInfo = {};
    }
}

void Output::setProjection(ui::Rotation orientation, const Rect& layerStackSpaceRect,
+21 −0
Original line number Diff line number Diff line
@@ -259,6 +259,27 @@ TEST_F(OutputTest, setLayerCachingEnabled_disablesCaching) {
    EXPECT_FALSE(mOutput->plannerEnabled());
}

TEST_F(OutputTest, setLayerCachingEnabled_disablesCachingAndResetsOverrideInfo) {
    renderengine::mock::RenderEngine renderEngine;
    const auto kSize = ui::Size(1, 1);
    EXPECT_CALL(*mRenderSurface, getSize()).WillRepeatedly(ReturnRef(kSize));
    mOutput->setLayerCachingEnabled(true);

    // Inject some layers
    InjectedLayer layer;
    layer.outputLayerState.overrideInfo.buffer = std::make_shared<
            renderengine::ExternalTexture>(new GraphicBuffer(), renderEngine,
                                           renderengine::ExternalTexture::Usage::READABLE |
                                                   renderengine::ExternalTexture::Usage::WRITEABLE);
    injectOutputLayer(layer);
    // inject a null layer to check for null exceptions
    injectNullOutputLayer();

    EXPECT_NE(nullptr, layer.outputLayerState.overrideInfo.buffer);
    mOutput->setLayerCachingEnabled(false);
    EXPECT_EQ(nullptr, layer.outputLayerState.overrideInfo.buffer);
}

/*
 * Output::setProjection()
 */
+29 −20
Original line number Diff line number Diff line
@@ -5595,11 +5595,14 @@ status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* r
            // Second argument is an optional uint64 - if present, then limits enabling/disabling
            // caching to a particular physical display
            case 1040: {
                status_t error =
                        schedule([&] {
                            n = data.readInt32();
                            std::optional<PhysicalDisplayId> inputId = std::nullopt;
                if (uint64_t inputDisplayId; data.readUint64(&inputDisplayId) == NO_ERROR) {
                    const auto token =
                            getPhysicalDisplayToken(static_cast<PhysicalDisplayId>(inputDisplayId));
                            if (uint64_t inputDisplayId;
                                data.readUint64(&inputDisplayId) == NO_ERROR) {
                                const auto token = getPhysicalDisplayToken(
                                        static_cast<PhysicalDisplayId>(inputDisplayId));
                                if (!token) {
                                    ALOGE("No display with id: %" PRIu64, inputDisplayId);
                                    return NAME_NOT_FOUND;
@@ -5616,6 +5619,12 @@ status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* r
                                    }
                                }
                            }
                            return OK;
                        }).get();

                if (error != OK) {
                    return error;
                }
                invalidateHwcGeometry();
                repaintEverything();
                return NO_ERROR;