@@ -4605,27 +4605,6 @@ void SurfaceFlinger::invalidateLayerStack(const ui::LayerFilter& layerFilter, co
46054605status_t SurfaceFlinger::addClientLayer (LayerCreationArgs& args, const sp<IBinder>& handle,
46064606 const sp<Layer>& layer, const wp<Layer>& parent,
46074607 uint32_t * outTransformHint) {
4608- if (mNumLayers >= MAX_LAYERS) {
4609- static std::atomic<nsecs_t > lasttime{0 };
4610- nsecs_t now = systemTime ();
4611- if (lasttime != 0 && ns2s (now - lasttime.load ()) < 10 ) {
4612- ALOGE (" AddClientLayer already dumped 10s before" );
4613- return NO_MEMORY;
4614- } else {
4615- lasttime = now;
4616- }
4617-
4618- ALOGE (" AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)" , mNumLayers .load (),
4619- MAX_LAYERS);
4620- static_cast <void >(mScheduler ->schedule ([&]() FTL_FAKE_GUARD (kMainThreadContext ) {
4621- ALOGE (" Dumping on-screen layers." );
4622- mLayerHierarchyBuilder .dumpLayerSample (mLayerHierarchyBuilder .getHierarchy ());
4623- ALOGE (" Dumping off-screen layers." );
4624- mLayerHierarchyBuilder .dumpLayerSample (mLayerHierarchyBuilder .getOffscreenHierarchy ());
4625- }));
4626- return NO_MEMORY;
4627- }
4628-
46294608 if (outTransformHint) {
46304609 *outTransformHint = mActiveDisplayTransformHint ;
46314610 }
@@ -5408,14 +5387,13 @@ status_t SurfaceFlinger::mirrorDisplay(DisplayId displayId, const LayerCreationA
54085387 mirrorArgs.addToRoot = true ;
54095388 mirrorArgs.layerStackToMirror = layerStack;
54105389 result = createEffectLayer (mirrorArgs, &outResult.handle , &rootMirrorLayer);
5390+ if (result != NO_ERROR) {
5391+ return result;
5392+ }
54115393 outResult.layerId = rootMirrorLayer->sequence ;
54125394 outResult.layerName = String16 (rootMirrorLayer->getDebugName ());
5413- result |= addClientLayer (mirrorArgs, outResult.handle , rootMirrorLayer /* layer */ ,
5414- nullptr /* parent */ , nullptr /* outTransformHint */ );
5415- }
5416-
5417- if (result != NO_ERROR) {
5418- return result;
5395+ addClientLayer (mirrorArgs, outResult.handle , rootMirrorLayer /* layer */ ,
5396+ nullptr /* parent */ , nullptr /* outTransformHint */ );
54195397 }
54205398
54215399 setTransactionFlags (eTransactionFlushNeeded);
@@ -5435,6 +5413,9 @@ status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, gui::CreateSurface
54355413 [[fallthrough]];
54365414 case ISurfaceComposerClient::eFXSurfaceEffect: {
54375415 result = createBufferStateLayer (args, &outResult.handle , &layer);
5416+ if (result != NO_ERROR) {
5417+ return result;
5418+ }
54385419 std::atomic<int32_t >* pendingBufferCounter = layer->getPendingBufferCounter ();
54395420 if (pendingBufferCounter) {
54405421 std::string counterName = layer->getPendingBufferCounterName ();
@@ -5475,18 +5456,48 @@ status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, gui::CreateSurface
54755456
54765457status_t SurfaceFlinger::createBufferStateLayer (LayerCreationArgs& args, sp<IBinder>* handle,
54775458 sp<Layer>* outLayer) {
5459+ if (checkLayerLeaks () != NO_ERROR) {
5460+ return NO_MEMORY;
5461+ }
54785462 *outLayer = getFactory ().createBufferStateLayer (args);
54795463 *handle = (*outLayer)->getHandle ();
54805464 return NO_ERROR;
54815465}
54825466
54835467status_t SurfaceFlinger::createEffectLayer (const LayerCreationArgs& args, sp<IBinder>* handle,
54845468 sp<Layer>* outLayer) {
5469+ if (checkLayerLeaks () != NO_ERROR) {
5470+ return NO_MEMORY;
5471+ }
54855472 *outLayer = getFactory ().createEffectLayer (args);
54865473 *handle = (*outLayer)->getHandle ();
54875474 return NO_ERROR;
54885475}
54895476
5477+ status_t SurfaceFlinger::checkLayerLeaks () {
5478+ if (mNumLayers >= MAX_LAYERS) {
5479+ static std::atomic<nsecs_t > lasttime{0 };
5480+ nsecs_t now = systemTime ();
5481+ if (lasttime != 0 && ns2s (now - lasttime.load ()) < 10 ) {
5482+ ALOGE (" CreateLayer already dumped 10s before" );
5483+ return NO_MEMORY;
5484+ } else {
5485+ lasttime = now;
5486+ }
5487+
5488+ ALOGE (" CreateLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)" , mNumLayers .load (),
5489+ MAX_LAYERS);
5490+ static_cast <void >(mScheduler ->schedule ([&]() FTL_FAKE_GUARD (kMainThreadContext ) {
5491+ ALOGE (" Dumping on-screen layers." );
5492+ mLayerHierarchyBuilder .dumpLayerSample (mLayerHierarchyBuilder .getHierarchy ());
5493+ ALOGE (" Dumping off-screen layers." );
5494+ mLayerHierarchyBuilder .dumpLayerSample (mLayerHierarchyBuilder .getOffscreenHierarchy ());
5495+ }));
5496+ return NO_MEMORY;
5497+ }
5498+ return NO_ERROR;
5499+ }
5500+
54905501void SurfaceFlinger::onHandleDestroyed (sp<Layer>& layer, uint32_t layerId) {
54915502 {
54925503 // Used to remove stalled transactions which uses an internal lock.
0 commit comments