summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rwxr-xr-xservices/surfaceflinger/SurfaceFlinger.cpp141
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
}