Loading services/surfaceflinger/CompositionEngine/src/Output.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -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, Loading services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -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() */ Loading services/surfaceflinger/SurfaceFlinger.cpp +29 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading
services/surfaceflinger/CompositionEngine/src/Output.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -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() */ Loading
services/surfaceflinger/SurfaceFlinger.cpp +29 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading