diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rwxr-xr-x | services/surfaceflinger/SurfaceFlinger.cpp | 141 |
1 files changed, 43 insertions, 98 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 0848ac878a..086be820c5 100755 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -431,48 +431,13 @@ bool callingThreadHasRotateSurfaceFlingerAccess() { PermissionCache::checkPermission(sRotateSurfaceFlinger, pid, uid); } -bool SmomoWrapper::init() { - mSmoMoLibHandle = dlopen(SMOMO_LIBRARY_NAME, RTLD_NOW); - if (!mSmoMoLibHandle) { - ALOGE("Unable to open SmoMo lib: %s", dlerror()); - return false; - } - - mSmoMoCreateFunc = - reinterpret_cast<CreateSmoMoFuncPtr>(dlsym(mSmoMoLibHandle, - CREATE_SMOMO_INTERFACE_NAME)); - mSmoMoDestroyFunc = - reinterpret_cast<DestroySmoMoFuncPtr>(dlsym(mSmoMoLibHandle, - DESTROY_SMOMO_INTERFACE_NAME)); - - if (!mSmoMoCreateFunc || !mSmoMoDestroyFunc) { - ALOGE("Can't load SmoMo symbols: %s", dlerror()); - dlclose(mSmoMoLibHandle); - return false; - } - - if (!mSmoMoCreateFunc(SMOMO_VERSION_TAG, &mInst)) { - ALOGE("Unable to create SmoMo interface"); - dlclose(mSmoMoLibHandle); - return false; - } - - return true; -} - -SmomoWrapper::~SmomoWrapper() { - if (mInst) { - mSmoMoDestroyFunc(mInst); - } +void SurfaceFlinger::setRefreshRates( + std::unique_ptr<scheduler::RefreshRateConfigs> &refreshRateConfigs) { + std::vector<float> refreshRates; - if (mSmoMoLibHandle) { - dlclose(mSmoMoLibHandle); + if (mSmoMo == nullptr) { + return; } -} - -void SmomoWrapper::setRefreshRates( - std::unique_ptr<scheduler::RefreshRateConfigs> &refreshRateConfigs) { - std::vector<float> refreshRates; auto iter = refreshRateConfigs->getAllRefreshRates().cbegin(); while (iter != refreshRateConfigs->getAllRefreshRates().cend()) { @@ -481,7 +446,7 @@ void SmomoWrapper::setRefreshRates( } ++iter; } - mInst->SetDisplayRefreshRates(refreshRates); + mSmoMo->SetDisplayRefreshRates(refreshRates); } bool LayerExtWrapper::init() { @@ -1178,18 +1143,8 @@ void SurfaceFlinger::init() { ALOGE("Run StartPropertySetThread failed!"); } - char smomoProp[PROPERTY_VALUE_MAX]; - property_get("vendor.display.use_smooth_motion", smomoProp, "0"); - if (atoi(smomoProp) && mSmoMo.init()) { - mSmoMo->SetChangeRefreshRateCallback( - [this](int32_t refreshRate) { - setRefreshRateTo(refreshRate); - }); - - mSmoMo.setRefreshRates(mRefreshRateConfigs); - - ALOGI("SmoMo is enabled"); - } + // Initialize Smomo. + InitSmomo(); char layerExtProp[PROPERTY_VALUE_MAX]; property_get("vendor.display.use_layer_ext", layerExtProp, "0"); @@ -1245,6 +1200,28 @@ void SurfaceFlinger::InitComposerExtn() { ALOGI("Init: mDisplayExtnIntf: %p", mDisplayExtnIntf); } +void SurfaceFlinger::InitSmomo() { + char smomoProp[PROPERTY_VALUE_MAX]; + property_get("vendor.display.use_smooth_motion", smomoProp, "0"); + if (!atoi(smomoProp)) { + return; + } + bool ret = mComposerExtnIntf->CreateSmomoExtn(&mSmoMo); + if (!ret) { + ALOGI("Unable to create smomo extension"); + } + if (mSmoMo != nullptr) { + mSmoMo->SetChangeRefreshRateCallback( + [this](int32_t refreshRate) { + setRefreshRateTo(refreshRate); + }); + + setRefreshRates(mRefreshRateConfigs); + + ALOGI("SmoMo is enabled"); + } +} + void SurfaceFlinger::startUnifiedDraw() { #ifdef QTI_UNIFIED_DRAW if (mDisplayExtnIntf) { @@ -4638,7 +4615,7 @@ bool SurfaceFlinger::transactionIsReadyToBeApplied( sp<Layer> layer = nullptr; if (s.surface) { - layer = fromHandleLocked(s.surface).promote(); + layer = fromHandle(s.surface).promote(); } else if (s.hasBufferChanges()) { ALOGW("Transaction with buffer, but no Layer?"); continue; @@ -4776,7 +4753,7 @@ status_t SurfaceFlinger::setTransactionState( sp<Layer> layer = nullptr; { Mutex::Autolock _l(mStateLock); - layer = fromHandleLocked(state.surface).promote(); + layer = fromHandle(state.surface).promote(); if (layer != nullptr) { layer->getPreviousGfxInfo(); } @@ -4844,7 +4821,7 @@ void SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelin setClientStateLocked(frameTimelineInfo, state, desiredPresentTime, isAutoTimestamp, postTime, permissions, listenerCallbacksWithSurfaces); if ((flags & eAnimation) && state.state.surface) { - if (const auto layer = fromHandleLocked(state.state.surface).promote(); layer) { + if (const auto layer = fromHandle(state.state.surface).promote(); layer) { mScheduler->recordLayerHistory(layer.get(), isAutoTimestamp ? 0 : desiredPresentTime, LayerHistory::LayerUpdateType::AnimationTX); @@ -5042,13 +5019,11 @@ uint32_t SurfaceFlinger::setClientStateLocked( if (what & layer_state_t::eLayerCreated) { layer = handleLayerCreatedLocked(s.surface); if (layer) { - // put the created layer into mLayersByLocalBinderToken. - mLayersByLocalBinderToken.emplace(s.surface->localBinder(), layer); flags |= eTransactionNeeded | eTraversalNeeded; mLayersAdded = true; } } else { - layer = fromHandleLocked(s.surface).promote(); + layer = fromHandle(s.surface).promote(); } } else { // The client may provide us a null handle. Treat it as if the layer was removed. @@ -5376,7 +5351,7 @@ status_t SurfaceFlinger::mirrorLayer(const sp<Client>& client, const sp<IBinder> { Mutex::Autolock _l(mStateLock); - mirrorFrom = fromHandleLocked(mirrorFromHandle).promote(); + mirrorFrom = fromHandle(mirrorFromHandle).promote(); if (!mirrorFrom) { return NAME_NOT_FOUND; } @@ -5603,7 +5578,7 @@ void SurfaceFlinger::markLayerPendingRemovalLocked(const sp<Layer>& layer) { setTransactionFlags(eTransactionNeeded); } -void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer) { +void SurfaceFlinger::onHandleDestroyed(BBinder* handle, sp<Layer>& layer) { Mutex::Autolock lock(mStateLock); // If a layer has a parent, we allow it to out-live it's handle // with the idea that the parent holds a reference and will eventually @@ -5614,17 +5589,7 @@ void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer) { mCurrentState.layersSortedByZ.remove(layer); } markLayerPendingRemovalLocked(layer); - - auto it = mLayersByLocalBinderToken.begin(); - while (it != mLayersByLocalBinderToken.end()) { - if (it->second == layer) { - mBufferCountTracker.remove(it->first->localBinder()); - it = mLayersByLocalBinderToken.erase(it); - } else { - it++; - } - } - + mBufferCountTracker.remove(handle); layer.clear(); } @@ -7679,7 +7644,7 @@ status_t SurfaceFlinger::captureLayers(const LayerCaptureArgs& args, { Mutex::Autolock lock(mStateLock); - parent = fromHandleLocked(args.layerHandle).promote(); + parent = fromHandle(args.layerHandle).promote(); if (parent == nullptr || parent->isRemovedFromCurrentState()) { ALOGE("captureLayers called with an invalid or removed parent"); return NAME_NOT_FOUND; @@ -7710,7 +7675,7 @@ status_t SurfaceFlinger::captureLayers(const LayerCaptureArgs& args, reqSize = ui::Size(crop.width() * args.frameScaleX, crop.height() * args.frameScaleY); for (const auto& handle : args.excludeHandles) { - sp<Layer> excludeLayer = fromHandleLocked(handle).promote(); + sp<Layer> excludeLayer = fromHandle(handle).promote(); if (excludeLayer != nullptr) { excludeLayers.emplace(excludeLayer); } else { @@ -8155,9 +8120,7 @@ status_t SurfaceFlinger::setDesiredDisplayModeSpecsInternal( preferredRefreshRate.getModeId().value()); } - if (mSmoMo) { - mSmoMo.setRefreshRates(mRefreshRateConfigs); - } + setRefreshRates(mRefreshRateConfigs); return NO_ERROR; } @@ -8261,24 +8224,8 @@ status_t SurfaceFlinger::getDesiredDisplayModeSpecs(const sp<IBinder>& displayTo } } -wp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) { - Mutex::Autolock _l(mStateLock); - return fromHandleLocked(handle); -} - -wp<Layer> SurfaceFlinger::fromHandleLocked(const sp<IBinder>& handle) const { - BBinder* b = nullptr; - if (handle) { - b = handle->localBinder(); - } - if (b == nullptr) { - return nullptr; - } - auto it = mLayersByLocalBinderToken.find(b); - if (it != mLayersByLocalBinderToken.end()) { - return it->second; - } - return nullptr; +wp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) const { + return Layer::fromHandle(handle); } void SurfaceFlinger::onLayerFirstRef(Layer* layer) { @@ -8583,7 +8530,7 @@ sp<Layer> SurfaceFlinger::handleLayerCreatedLocked(const sp<IBinder>& handle) { sp<Layer> parent; bool allowAddRoot = state->addToRoot; if (state->initialParent != nullptr) { - parent = fromHandleLocked(state->initialParent.promote()).promote(); + parent = fromHandle(state->initialParent.promote()).promote(); if (parent == nullptr) { ALOGE("Invalid parent %p", state->initialParent.unsafe_get()); allowAddRoot = false; @@ -8729,7 +8676,6 @@ void SurfaceFlinger::notifyAllDisplaysUpdateImminent() { ATRACE_CALL(); // Notify Display Extn for GPU and Display Early Wakeup mDisplayExtnIntf->NotifyEarlyWakeUp(true, true); - setTransactionFlags(eDisplayTransactionNeeded, TransactionSchedule::EarlyEnd); } #endif } @@ -8762,7 +8708,6 @@ void SurfaceFlinger::notifyDisplayUpdateImminent() { // Notify Display Extn for GPU and Display Early Wakeup mDisplayExtnIntf->NotifyEarlyWakeUp(true, true); } - setTransactionFlags(eDisplayTransactionNeeded, TransactionSchedule::EarlyEnd); } #endif } |