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

Commit cdd722bb 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
parent 0247fed2
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()
 */
+26 −17
Original line number Diff line number Diff line
@@ -5627,9 +5627,12 @@ 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) {
                            if (uint64_t inputDisplayId;
                                data.readUint64(&inputDisplayId) == NO_ERROR) {
                                inputId = DisplayId::fromValue<PhysicalDisplayId>(inputDisplayId);
                                if (!inputId || getPhysicalDisplayToken(*inputId)) {
                                    ALOGE("No display with id: %" PRIu64, inputDisplayId);
@@ -5645,6 +5648,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;