diff options
| author | 2017-12-06 11:52:02 -0800 | |
|---|---|---|
| committer | 2017-12-06 14:24:50 -0800 | |
| commit | d1a6d1eb81b14966a30a68b67996916ee27afb6f (patch) | |
| tree | f5100ca72ea06d172b17fd11f8403549315740d8 /services/surfaceflinger/SurfaceFlinger.cpp | |
| parent | 68686bd15198f64db633a757718b918895a1ca71 (diff) | |
| parent | 60175af9c8938d2362ec8a8b06543ce8c41b2338 (diff) | |
DO NOT MERGE: Merge Oreo MR1 into master
Exempt-From-Owner-Approval: Changes already landed internally
Change-Id: I37c19d77fbf144fb30cc2a2877247a855684d4ad
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 407 | 
1 files changed, 247 insertions, 160 deletions
| diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index a60c25d890..0b5262de30 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -46,6 +46,7 @@  #include <gui/BufferQueue.h>  #include <gui/GuiConfig.h>  #include <gui/IDisplayEventConnection.h> +#include <gui/LayerDebugInfo.h>  #include <gui/Surface.h>  #include <ui/GraphicBufferAllocator.h> @@ -76,6 +77,7 @@  #include "MonitoredProducer.h"  #include "SurfaceFlinger.h" +#include "DisplayHardware/ComposerHal.h"  #include "DisplayHardware/FramebufferSurface.h"  #include "DisplayHardware/HWComposer.h"  #include "DisplayHardware/VirtualDisplaySurface.h" @@ -100,10 +102,24 @@ extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy  namespace android { -  using namespace android::hardware::configstore;  using namespace android::hardware::configstore::V1_0; +namespace { +class ConditionalLock { +public: +    ConditionalLock(Mutex& mutex, bool lock) : mMutex(mutex), mLocked(lock) { +        if (lock) { +            mMutex.lock(); +        } +    } +    ~ConditionalLock() { if (mLocked) mMutex.unlock(); } +private: +    Mutex& mMutex; +    bool mLocked; +}; +}  // namespace anonymous +  // ---------------------------------------------------------------------------  const String16 sHardwareTest("android.permission.HARDWARE_TEST"); @@ -123,6 +139,21 @@ bool SurfaceFlinger::useVrFlinger;  int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;  bool SurfaceFlinger::hasWideColorDisplay; + +std::string getHwcServiceName() { +    char value[PROPERTY_VALUE_MAX] = {}; +    property_get("debug.sf.hwc_service_name", value, "default"); +    ALOGI("Using HWComposer service: '%s'", value); +    return std::string(value); +} + +bool useTrebleTestingOverride() { +    char value[PROPERTY_VALUE_MAX] = {}; +    property_get("debug.sf.treble_testing_override", value, "false"); +    ALOGI("Treble testing override: '%s'", value); +    return std::string(value) == "true"; +} +  SurfaceFlinger::SurfaceFlinger()      :   BnSurfaceComposer(),          mTransactionFlags(0), @@ -131,9 +162,7 @@ SurfaceFlinger::SurfaceFlinger()          mLayersRemoved(false),          mLayersAdded(false),          mRepaintEverything(0), -        mHwc(nullptr), -        mRealHwc(nullptr), -        mVrHwc(nullptr), +        mHwcServiceName(getHwcServiceName()),          mRenderEngine(nullptr),          mBootTime(systemTime()),          mBuiltinDisplays(), @@ -160,7 +189,9 @@ SurfaceFlinger::SurfaceFlinger()          mTotalTime(0),          mLastSwapTime(0),          mNumLayers(0), -        mVrFlingerRequestsDisplay(false) +        mVrFlingerRequestsDisplay(false), +        mMainThreadId(std::this_thread::get_id()), +        mComposerSequenceId(0)  {      ALOGI("SurfaceFlinger is starting"); @@ -233,6 +264,15 @@ SurfaceFlinger::SurfaceFlinger()      // but since /data may be encrypted, we need to wait until after vold      // comes online to attempt to read the property. The property is      // instead read after the boot animation + +    if (useTrebleTestingOverride()) { +        // Without the override SurfaceFlinger cannot connect to HIDL +        // services that are not listed in the manifests.  Considered +        // deriving the setting from the set service name, but it +        // would be brittle if the name that's not 'default' is used +        // for production purposes later on. +        setenv("TREBLE_TESTING_OVERRIDE", "true", true); +    }  }  void SurfaceFlinger::onFirstRef() @@ -547,54 +587,61 @@ void SurfaceFlinger::init() {      ALOGI("Phase offest NS: %" PRId64 "", vsyncPhaseOffsetNs); -    { // Autolock scope -        Mutex::Autolock _l(mStateLock); +    Mutex::Autolock _l(mStateLock); -        // initialize EGL for the default display -        mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); -        eglInitialize(mEGLDisplay, NULL, NULL); - -        // start the EventThread -        sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync, -                vsyncPhaseOffsetNs, true, "app"); -        mEventThread = new EventThread(vsyncSrc, *this, false); -        sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, -                sfVsyncPhaseOffsetNs, true, "sf"); -        mSFEventThread = new EventThread(sfVsyncSrc, *this, true); -        mEventQueue.setEventThread(mSFEventThread); +    // initialize EGL for the default display +    mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); +    eglInitialize(mEGLDisplay, NULL, NULL); -        // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter -        struct sched_param param = {0}; -        param.sched_priority = 2; -        if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { -            ALOGE("Couldn't set SCHED_FIFO for SFEventThread"); -        } -        if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { -            ALOGE("Couldn't set SCHED_FIFO for EventThread"); -        } +    // start the EventThread +    sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync, +            vsyncPhaseOffsetNs, true, "app"); +    mEventThread = new EventThread(vsyncSrc, *this, false); +    sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, +            sfVsyncPhaseOffsetNs, true, "sf"); +    mSFEventThread = new EventThread(sfVsyncSrc, *this, true); +    mEventQueue.setEventThread(mSFEventThread); -        // Get a RenderEngine for the given display / config (can't fail) -        mRenderEngine = RenderEngine::create(mEGLDisplay, -                HAL_PIXEL_FORMAT_RGBA_8888, -                hasWideColorDisplay ? RenderEngine::WIDE_COLOR_SUPPORT : 0); +    // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter +    struct sched_param param = {0}; +    param.sched_priority = 2; +    if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { +        ALOGE("Couldn't set SCHED_FIFO for SFEventThread"); +    } +    if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { +        ALOGE("Couldn't set SCHED_FIFO for EventThread");      } -    // Drop the state lock while we initialize the hardware composer. We drop -    // the lock because on creation, it will call back into SurfaceFlinger to -    // initialize the primary display. -    LOG_ALWAYS_FATAL_IF(mVrFlingerRequestsDisplay, -        "Starting with vr flinger active is not currently supported."); -    mRealHwc = new HWComposer(false); -    mHwc = mRealHwc; -    mHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this)); +    // Get a RenderEngine for the given display / config (can't fail) +    mRenderEngine = RenderEngine::create(mEGLDisplay, +            HAL_PIXEL_FORMAT_RGBA_8888, +            hasWideColorDisplay ? RenderEngine::WIDE_COLOR_SUPPORT : 0); -    Mutex::Autolock _l(mStateLock); +    // retrieve the EGL context that was selected/created +    mEGLContext = mRenderEngine->getEGLContext(); + +    LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT, +            "couldn't create EGLContext"); + +    LOG_ALWAYS_FATAL_IF(mVrFlingerRequestsDisplay, +            "Starting with vr flinger active is not currently supported."); +    mHwc.reset(new HWComposer(mHwcServiceName)); +    mHwc->registerCallback(this, mComposerSequenceId);      if (useVrFlinger) {          auto vrFlingerRequestDisplayCallback = [this] (bool requestDisplay) { -            ALOGI("VR request display mode: requestDisplay=%d", requestDisplay); -            mVrFlingerRequestsDisplay = requestDisplay; -            signalTransaction(); +            // This callback is called from the vr flinger dispatch thread. We +            // need to call signalTransaction(), which requires holding +            // mStateLock when we're not on the main thread. Acquiring +            // mStateLock from the vr flinger dispatch thread might trigger a +            // deadlock in surface flinger (see b/66916578), so post a message +            // to be handled on the main thread instead. +            sp<LambdaMessage> message = new LambdaMessage([=]() { +                ALOGI("VR request display mode: requestDisplay=%d", requestDisplay); +                mVrFlingerRequestsDisplay = requestDisplay; +                signalTransaction(); +            }); +            postMessageAsync(message);          };          mVrFlinger = dvr::VrFlinger::Create(mHwc->getComposer(),                                              vrFlingerRequestDisplayCallback); @@ -603,16 +650,6 @@ void SurfaceFlinger::init() {          }      } -    // retrieve the EGL context that was selected/created -    mEGLContext = mRenderEngine->getEGLContext(); - -    LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT, -            "couldn't create EGLContext"); - -    // make the GLContext current so that we can create textures when creating -    // Layers (which may happens before we render something) -    getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext); -      mEventControlThread = new EventControlThread(this);      mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY); @@ -691,6 +728,8 @@ status_t SurfaceFlinger::getSupportedFrameTimestamps(          FrameEvent::DEQUEUE_READY,          FrameEvent::RELEASE,      }; +    ConditionalLock _l(mStateLock, +            std::this_thread::get_id() != mMainThreadId);      if (!getHwComposer().hasCapability(              HWC2::Capability::PresentFenceIsNotReliable)) {          outSupported->push_back(FrameEvent::DISPLAY_PRESENT); @@ -738,6 +777,8 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,      configs->clear(); +    ConditionalLock _l(mStateLock, +            std::this_thread::get_id() != mMainThreadId);      for (const auto& hwConfig : getHwComposer().getConfigs(type)) {          DisplayInfo info = DisplayInfo(); @@ -761,7 +802,7 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,              info.density = density;              // TODO: this needs to go away (currently needed only by webkit) -            sp<const DisplayDevice> hw(getDefaultDisplayDevice()); +            sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());              info.orientation = hw->getOrientation();          } else {              // TODO: where should this value come from? @@ -904,7 +945,12 @@ status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,          return type;      } -    std::vector<android_color_mode_t> modes = getHwComposer().getColorModes(type); +    std::vector<android_color_mode_t> modes; +    { +        ConditionalLock _l(mStateLock, +                std::this_thread::get_id() != mMainThreadId); +        modes = getHwComposer().getColorModes(type); +    }      outColorModes->clear();      std::copy(modes.cbegin(), modes.cend(), std::back_inserter(*outColorModes)); @@ -1045,6 +1091,33 @@ status_t SurfaceFlinger::injectVSync(nsecs_t when) {      return NO_ERROR;  } +status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const { +    IPCThreadState* ipc = IPCThreadState::self(); +    const int pid = ipc->getCallingPid(); +    const int uid = ipc->getCallingUid(); +    if ((uid != AID_SHELL) && +            !PermissionCache::checkPermission(sDump, pid, uid)) { +        ALOGE("Layer debug info permission denied for pid=%d, uid=%d", pid, uid); +        return PERMISSION_DENIED; +    } + +    // Try to acquire a lock for 1s, fail gracefully +    const status_t err = mStateLock.timedLock(s2ns(1)); +    const bool locked = (err == NO_ERROR); +    if (!locked) { +        ALOGE("LayerDebugInfo: SurfaceFlinger unresponsive (%s [%d]) - exit", strerror(-err), err); +        return TIMED_OUT; +    } + +    outLayers->clear(); +    mCurrentState.traverseInZOrder([&](Layer* layer) { +        outLayers->push_back(layer->getLayerDebugInfo()); +    }); + +    mStateLock.unlock(); +    return NO_ERROR; +} +  // ----------------------------------------------------------------------------  sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection( @@ -1155,11 +1228,16 @@ void SurfaceFlinger::resyncWithRateLimit() {      sLastResyncAttempted = now;  } -void SurfaceFlinger::onVSyncReceived(HWComposer* composer, int32_t type, -                                     nsecs_t timestamp) { +void SurfaceFlinger::onVsyncReceived(int32_t sequenceId, +        hwc2_display_t displayId, int64_t timestamp) {      Mutex::Autolock lock(mStateLock); -    // Ignore any vsyncs from the non-active hardware composer. -    if (composer != mHwc) { +    // Ignore any vsyncs from a previous hardware composer. +    if (sequenceId != mComposerSequenceId) { +        return; +    } + +    int32_t type; +    if (!mHwc->onVsync(displayId, timestamp, &type)) {          return;      } @@ -1167,7 +1245,7 @@ void SurfaceFlinger::onVSyncReceived(HWComposer* composer, int32_t type,      { // Scope for the lock          Mutex::Autolock _l(mHWVsyncLock); -        if (type == 0 && mPrimaryHWVsyncEnabled) { +        if (type == DisplayDevice::DISPLAY_PRIMARY && mPrimaryHWVsyncEnabled) {              needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);          }      } @@ -1185,7 +1263,7 @@ void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {  }  void SurfaceFlinger::createDefaultDisplayDevice() { -    const int32_t type = DisplayDevice::DISPLAY_PRIMARY; +    const DisplayDevice::DisplayType type = DisplayDevice::DISPLAY_PRIMARY;      wp<IBinder> token = mBuiltinDisplays[type];      // All non-virtual displays are currently considered secure. @@ -1220,28 +1298,49 @@ void SurfaceFlinger::createDefaultDisplayDevice() {      }      setActiveColorModeInternal(hw, defaultColorMode);      hw->setCompositionDataSpace(HAL_DATASPACE_UNKNOWN); -} -void SurfaceFlinger::onHotplugReceived(HWComposer* composer, int32_t disp, bool connected) { -    ALOGV("onHotplugReceived(%d, %s)", disp, connected ? "true" : "false"); +    // Add the primary display token to mDrawingState so we don't try to +    // recreate the DisplayDevice for the primary display. +    mDrawingState.displays.add(token, DisplayDeviceState(type, true)); -    if (composer->isUsingVrComposer()) { -        // We handle initializing the primary display device for the VR -        // window manager hwc explicitly at the time of transition. -        if (disp != DisplayDevice::DISPLAY_PRIMARY) { -            ALOGE("External displays are not supported by the vr hardware composer."); -        } -        return; -    } +    // make the GLContext current so that we can create textures when creating +    // Layers (which may happens before we render something) +    hw->makeCurrent(mEGLDisplay, mEGLContext); +} -    if (disp == DisplayDevice::DISPLAY_PRIMARY) { -        Mutex::Autolock lock(mStateLock); -        createBuiltinDisplayLocked(DisplayDevice::DISPLAY_PRIMARY); +void SurfaceFlinger::onHotplugReceived(int32_t sequenceId, +        hwc2_display_t display, HWC2::Connection connection, +        bool primaryDisplay) { +    ALOGV("onHotplugReceived(%d, %" PRIu64 ", %s, %s)", +          sequenceId, display, +          connection == HWC2::Connection::Connected ? +                  "connected" : "disconnected", +          primaryDisplay ? "primary" : "external"); + +    // Only lock if we're not on the main thread. This function is normally +    // called on a hwbinder thread, but for the primary display it's called on +    // the main thread with the state lock already held, so don't attempt to +    // acquire it here. +    ConditionalLock lock(mStateLock, +            std::this_thread::get_id() != mMainThreadId); + +    if (primaryDisplay) { +        mHwc->onHotplug(display, connection); +        if (!mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY].get()) { +            createBuiltinDisplayLocked(DisplayDevice::DISPLAY_PRIMARY); +        }          createDefaultDisplayDevice();      } else { +        if (sequenceId != mComposerSequenceId) { +            return; +        } +        if (mHwc->isUsingVrComposer()) { +            ALOGE("External displays are not supported by the vr hardware composer."); +            return; +        } +        mHwc->onHotplug(display, connection);          auto type = DisplayDevice::DISPLAY_EXTERNAL; -        Mutex::Autolock _l(mStateLock); -        if (connected) { +        if (connection == HWC2::Connection::Connected) {              createBuiltinDisplayLocked(type);          } else {              mCurrentState.displays.removeItem(mBuiltinDisplays[type]); @@ -1253,46 +1352,31 @@ void SurfaceFlinger::onHotplugReceived(HWComposer* composer, int32_t disp, bool      }  } -void SurfaceFlinger::onInvalidateReceived(HWComposer* composer) { +void SurfaceFlinger::onRefreshReceived(int sequenceId, +                                       hwc2_display_t /*display*/) {      Mutex::Autolock lock(mStateLock); -    if (composer == mHwc) { -        repaintEverything(); -    } else { -        // This isn't from our current hardware composer. If it's a callback -        // from the real composer, forward the refresh request to vr -        // flinger. Otherwise ignore it. -        if (!composer->isUsingVrComposer()) { -            mVrFlinger->OnHardwareComposerRefresh(); -        } +    if (sequenceId != mComposerSequenceId) { +        return;      } +    repaintEverythingLocked();  }  void SurfaceFlinger::setVsyncEnabled(int disp, int enabled) {      ATRACE_CALL(); +    Mutex::Autolock lock(mStateLock);      getHwComposer().setVsyncEnabled(disp,              enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable);  }  // Note: it is assumed the caller holds |mStateLock| when this is called -void SurfaceFlinger::resetHwcLocked() { +void SurfaceFlinger::resetDisplayState() {      disableHardwareVsync(true); -    clearHwcLayers(mDrawingState.layersSortedByZ); -    clearHwcLayers(mCurrentState.layersSortedByZ); -    for (size_t disp = 0; disp < mDisplays.size(); ++disp) { -        clearHwcLayers(mDisplays[disp]->getVisibleLayersSortedByZ()); -    }      // Clear the drawing state so that the logic inside of      // handleTransactionLocked will fire. It will determine the delta between      // mCurrentState and mDrawingState and re-apply all changes when we make the      // transition.      mDrawingState.displays.clear(); -    // Release virtual display hwcId during vr mode transition. -    for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) { -        const sp<DisplayDevice>& displayDevice = mDisplays[displayId]; -        if (displayDevice->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL) { -            displayDevice->disconnect(getHwComposer()); -        } -    } +    eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);      mDisplays.clear();  } @@ -1304,57 +1388,54 @@ void SurfaceFlinger::updateVrFlinger() {          return;      } -    if (vrFlingerRequestsDisplay && !mVrHwc) { -        // Construct new HWComposer without holding any locks. -        mVrHwc = new HWComposer(true); - -        // Set up the event handlers. This step is neccessary to initialize the internal state of -        // the hardware composer object properly. Our callbacks are designed such that if they are -        // triggered between now and the point where the display is properly re-initialized, they -        // will not have any effect, so this is safe to do here, before the lock is aquired. -        mVrHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this)); -        ALOGV("Vr HWC created"); +    if (vrFlingerRequestsDisplay && !mHwc->getComposer()->isRemote()) { +        ALOGE("Vr flinger is only supported for remote hardware composer" +              " service connections. Ignoring request to transition to vr" +              " flinger."); +        mVrFlingerRequestsDisplay = false; +        return;      }      Mutex::Autolock _l(mStateLock); -    if (vrFlingerRequestsDisplay) { -        resetHwcLocked(); - -        mHwc = mVrHwc; -        mVrFlinger->GrantDisplayOwnership(); +    int currentDisplayPowerMode = getDisplayDeviceLocked( +            mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY])->getPowerMode(); -    } else { +    if (!vrFlingerRequestsDisplay) {          mVrFlinger->SeizeDisplayOwnership(); +    } + +    resetDisplayState(); +    mHwc.reset();  // Delete the current instance before creating the new one +    mHwc.reset(new HWComposer( +            vrFlingerRequestsDisplay ? "vr" : mHwcServiceName)); +    mHwc->registerCallback(this, ++mComposerSequenceId); -        resetHwcLocked(); +    LOG_ALWAYS_FATAL_IF(!mHwc->getComposer()->isRemote(), +            "Switched to non-remote hardware composer"); -        mHwc = mRealHwc; +    if (vrFlingerRequestsDisplay) { +        mVrFlinger->GrantDisplayOwnership(); +    } else {          enableHardwareVsync();      }      mVisibleRegionsDirty = true;      invalidateHwcGeometry(); -    // Explicitly re-initialize the primary display. This is because some other -    // parts of this class rely on the primary display always being available. -    createDefaultDisplayDevice(); -      // Re-enable default display. -    sp<LambdaMessage> requestMessage = new LambdaMessage([&]() { -        sp<DisplayDevice> hw(getDisplayDevice(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY])); -        setPowerModeInternal(hw, HWC_POWER_MODE_NORMAL); - -        // Reset the timing values to account for the period of the swapped in HWC -        const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY); -        const nsecs_t period = activeConfig->getVsyncPeriod(); -        mAnimFrameTracker.setDisplayRefreshPeriod(period); - -        // Use phase of 0 since phase is not known. -        // Use latency of 0, which will snap to the ideal latency. -        setCompositorTimingSnapped(0, period, 0); -    }); -    postMessageAsync(requestMessage); +    sp<DisplayDevice> hw(getDisplayDeviceLocked( +            mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY])); +    setPowerModeInternal(hw, currentDisplayPowerMode, /*stateLockHeld*/ true); + +    // Reset the timing values to account for the period of the swapped in HWC +    const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY); +    const nsecs_t period = activeConfig->getVsyncPeriod(); +    mAnimFrameTracker.setDisplayRefreshPeriod(period); + +    // Use phase of 0 since phase is not known. +    // Use latency of 0, which will snap to the ideal latency. +    setCompositorTimingSnapped(0, period, 0);      android_atomic_or(1, &mRepaintEverything);      setTransactionFlags(eDisplayTransactionNeeded); @@ -1370,7 +1451,6 @@ void SurfaceFlinger::onMessageReceived(int32_t what) {                              Fence::SIGNAL_TIME_PENDING);              ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));              if (mPropagateBackpressure && frameMissed) { -                ALOGD("Backpressure trigger, skipping transaction & refresh!");                  signalLayerUpdate();                  break;              } @@ -1572,6 +1652,7 @@ void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)      // |mStateLock| not needed as we are on the main thread      const sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked()); +    mGlCompositionDoneTimeline.updateSignalTimes();      std::shared_ptr<FenceTime> glCompositionDoneFenceTime;      if (mHwc->hasClientComposition(HWC_DISPLAY_PRIMARY)) {          glCompositionDoneFenceTime = @@ -1580,12 +1661,11 @@ void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)      } else {          glCompositionDoneFenceTime = FenceTime::NO_FENCE;      } -    mGlCompositionDoneTimeline.updateSignalTimes(); +    mDisplayTimeline.updateSignalTimes();      sp<Fence> presentFence = mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);      auto presentFenceTime = std::make_shared<FenceTime>(presentFence);      mDisplayTimeline.push(presentFenceTime); -    mDisplayTimeline.updateSignalTimes();      nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);      nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod(); @@ -1610,8 +1690,8 @@ void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)          }      }); -    if (presentFence->isValid()) { -        if (mPrimaryDispSync.addPresentFence(presentFence)) { +    if (presentFenceTime->isValid()) { +        if (mPrimaryDispSync.addPresentFence(presentFenceTime)) {              enableHardwareVsync();          } else {              disableHardwareVsync(false); @@ -1693,18 +1773,15 @@ void SurfaceFlinger::rebuildLayerStacks() {                          } else {                              // Clear out the HWC layer if this layer was                              // previously visible, but no longer is -                            hwcLayerDestroyed = layer->hasHwcLayer( +                            hwcLayerDestroyed = layer->destroyHwcLayer(                                      displayDevice->getHwcDisplayId()); -                            layer->setHwcLayer(displayDevice->getHwcDisplayId(), -                                    nullptr);                          }                      } else {                          // WM changes displayDevice->layerStack upon sleep/awake.                          // Here we make sure we delete the HWC layers even if                          // WM changed their layer stack. -                        hwcLayerDestroyed = layer->hasHwcLayer(displayDevice->getHwcDisplayId()); -                        layer->setHwcLayer(displayDevice->getHwcDisplayId(), -                                nullptr); +                        hwcLayerDestroyed = layer->destroyHwcLayer( +                                displayDevice->getHwcDisplayId());                      }                      // If a layer is not going to get a release fence because @@ -1832,10 +1909,7 @@ void SurfaceFlinger::setUpHWComposer() {                  for (size_t i = 0; i < currentLayers.size(); i++) {                      const auto& layer = currentLayers[i];                      if (!layer->hasHwcLayer(hwcId)) { -                        auto hwcLayer = mHwc->createLayer(hwcId); -                        if (hwcLayer) { -                            layer->setHwcLayer(hwcId, std::move(hwcLayer)); -                        } else { +                        if (!layer->createHwcLayer(mHwc.get(), hwcId)) {                              layer->forceClientComposition(hwcId);                              continue;                          } @@ -2136,7 +2210,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)                          if (state.surface != NULL) {                              // Allow VR composer to use virtual displays. -                            if (mUseHwcVirtualDisplays || mHwc == mVrHwc) { +                            if (mUseHwcVirtualDisplays || mHwc->isUsingVrComposer()) {                                  int width = 0;                                  int status = state.surface->query(                                          NATIVE_WINDOW_WIDTH, &width); @@ -2813,6 +2887,7 @@ status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly)          return NO_ERROR;      } +    layer->onRemovedFromCurrentState();      mLayersPendingRemoval.add(layer);      mLayersRemoved = true;      mNumLayers -= 1 + layer->getChildrenCount(); @@ -3010,7 +3085,10 @@ uint32_t SurfaceFlinger::setClientStateLocked(              }          }          if (what & layer_state_t::eRelativeLayerChanged) { +            ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);              if (layer->setRelativeLayer(s.relativeLayerHandle, s.z)) { +                mCurrentState.layersSortedByZ.removeAt(idx); +                mCurrentState.layersSortedByZ.add(layer);                  flags |= eTransactionNeeded|eTraversalNeeded;              }          } @@ -3259,7 +3337,8 @@ void SurfaceFlinger::onInitializeDisplays() {      d.height = 0;      displays.add(d);      setTransactionState(state, displays, 0); -    setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL); +    setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL, +                         /*stateLockHeld*/ false);      const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);      const nsecs_t period = activeConfig->getVsyncPeriod(); @@ -3285,7 +3364,7 @@ void SurfaceFlinger::initializeDisplays() {  }  void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw, -        int mode) { +             int mode, bool stateLockHeld) {      ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),              this);      int32_t type = hw->getDisplayType(); @@ -3302,7 +3381,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,      }      if (mInterceptor.isEnabled()) { -        Mutex::Autolock _l(mStateLock); +        ConditionalLock lock(mStateLock, !stateLockHeld);          ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());          if (idx < 0) {              ALOGW("Surface Interceptor SavePowerMode: invalid display token"); @@ -3323,7 +3402,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,          mVisibleRegionsDirty = true;          mHasPoweredOff = true; -        repaintEverything(); +        repaintEverythingLocked();          struct sched_param param = {0};          param.sched_priority = 1; @@ -3388,7 +3467,8 @@ void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {                  ALOGW("Attempt to set power mode = %d for virtual display",                          mMode);              } else { -                mFlinger.setPowerModeInternal(hw, mMode); +                mFlinger.setPowerModeInternal( +                        hw, mMode, /*stateLockHeld*/ false);              }              return true;          } @@ -3733,7 +3813,7 @@ void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,      result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);      colorizer.reset(result);      mCurrentState.traverseInZOrder([&](Layer* layer) { -        layer->dump(result, colorizer); +        result.append(to_string(layer->getLayerDebugInfo()).c_str());      });      /* @@ -3966,6 +4046,7 @@ status_t SurfaceFlinger::onTransact(                  return NO_ERROR;              }              case 1005:{ // force transaction +                Mutex::Autolock _l(mStateLock);                  setTransactionFlags(                          eTransactionNeeded|                          eDisplayTransactionNeeded| @@ -4102,11 +4183,17 @@ status_t SurfaceFlinger::onTransact(      return err;  } -void SurfaceFlinger::repaintEverything() { +void SurfaceFlinger::repaintEverythingLocked() {      android_atomic_or(1, &mRepaintEverything);      signalTransaction();  } +void SurfaceFlinger::repaintEverything() { +    ConditionalLock _l(mStateLock, +            std::this_thread::get_id() != mMainThreadId); +    repaintEverythingLocked(); +} +  // Checks that the requested width and height are valid and updates them to the display dimensions  // if they are set to 0  static status_t updateDimensionsLocked(const sp<const DisplayDevice>& displayDevice, |