From fad494c0cf1c7c600965e5c65df3cc7a1667784e Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Wed, 1 Feb 2023 19:52:54 +0000 Subject: SF: Fix TrustedPresentationListener npe Fixes: 267348876 Test: atest TrustedPresentationCallbackTest Change-Id: Ib4c63ab2fdfc6c2dc67821a5e0ae06fff4e3dc40 --- services/surfaceflinger/SurfaceFlinger.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 6020aba4fd..638302b7b3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2614,12 +2614,13 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { ATRACE_CALL(); ALOGV(__func__); - const auto* display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get(); + const auto* defaultDisplay = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get(); std::shared_ptr glCompositionDoneFenceTime; - if (display && display->getCompositionDisplay()->getState().usesClientComposition) { + if (defaultDisplay && + defaultDisplay->getCompositionDisplay()->getState().usesClientComposition) { glCompositionDoneFenceTime = - std::make_shared(display->getCompositionDisplay() + std::make_shared(defaultDisplay->getCompositionDisplay() ->getRenderSurface() ->getClientTargetAcquireFence()); } else { @@ -2628,8 +2629,9 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { mPreviousPresentFences[1] = mPreviousPresentFences[0]; - auto presentFence = - display ? getHwComposer().getPresentFence(display->getPhysicalId()) : Fence::NO_FENCE; + auto presentFence = defaultDisplay + ? getHwComposer().getPresentFence(defaultDisplay->getPhysicalId()) + : Fence::NO_FENCE; auto presentFenceTime = std::make_shared(presentFence); mPreviousPresentFences[0] = {presentFence, presentFenceTime}; @@ -2660,7 +2662,7 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { presentLatency.ns()); for (const auto& layer: mLayersWithQueuedFrames) { - layer->onPostComposition(display, glCompositionDoneFenceTime, presentFenceTime, + layer->onPostComposition(defaultDisplay, glCompositionDoneFenceTime, presentFenceTime, compositorTiming); layer->releasePendingBuffer(presentTime.ns()); } @@ -2733,7 +2735,7 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { for (const auto& [id, physicalDisplay] : mPhysicalDisplays) { if (auto displayDevice = getDisplayDeviceLocked(id); displayDevice && displayDevice->isPoweredOn() && physicalDisplay.isInternal()) { - auto presentFenceTimeI = display && display->getPhysicalId() == id + auto presentFenceTimeI = defaultDisplay && defaultDisplay->getPhysicalId() == id ? std::move(presentFenceTime) : std::make_shared(getHwComposer().getPresentFence(id)); if (presentFenceTimeI->isValid()) { @@ -2744,11 +2746,11 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { } const bool isDisplayConnected = - display && getHwComposer().isConnected(display->getPhysicalId()); + defaultDisplay && getHwComposer().isConnected(defaultDisplay->getPhysicalId()); if (!hasSyncFramework) { - if (isDisplayConnected && display->isPoweredOn()) { - mScheduler->enableHardwareVsync(display->getPhysicalId()); + if (isDisplayConnected && defaultDisplay->isPoweredOn()) { + mScheduler->enableHardwareVsync(defaultDisplay->getPhysicalId()); } } @@ -2756,7 +2758,7 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { const size_t appConnections = mScheduler->getEventThreadConnectionCount(mAppConnectionHandle); mTimeStats->recordDisplayEventConnectionCount(sfConnections + appConnections); - if (isDisplayConnected && !display->isPoweredOn()) { + if (isDisplayConnected && !defaultDisplay->isPoweredOn()) { getRenderEngine().cleanupPostRender(); return; } @@ -2795,9 +2797,10 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { if (!layer->hasTrustedPresentationListener()) { return; } - const auto display = + const std::optional displayOpt = layerStackToDisplay.get(layer->getLayerSnapshot()->outputFilter.layerStack); - layer->updateTrustedPresentationState(display->get(), layer->getLayerSnapshot(), + const DisplayDevice* display = displayOpt.value_or(nullptr); + layer->updateTrustedPresentationState(display, layer->getLayerSnapshot(), nanoseconds_to_milliseconds(callTime), false); }); } -- cgit v1.2.3-59-g8ed1b