diff options
author | alk3pInjection <webmaster@raspii.tech> | 2022-06-02 22:45:00 +0800 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2022-06-02 22:45:00 +0800 |
commit | 780f2727923b656adcdcd08f41da399c7b8301ee (patch) | |
tree | a2a1e35b3dcb2c408da313f8d558a57c2d6cc7ee | |
parent | 8bd964a91e09bd9ed187bc194fe87a956431d345 (diff) | |
parent | c15a23917517c1ffbaaa470d35423e968f7ddffe (diff) |
Merge tag 'LA.QSSI.12.0.r1-07600-qssi.0' into sugisawa-mr1
"LA.QSSI.12.0.r1-07600-qssi.0"
Change-Id: Id9fc85810c1fae395e39c4d53c7633928b2d2bc8
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 8 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 5 | ||||
-rwxr-xr-x | services/surfaceflinger/SurfaceFlinger.cpp | 143 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 4 |
4 files changed, 97 insertions, 63 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 316144c0d1..008cd80559 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1106,6 +1106,14 @@ uint32_t Layer::getLayerStack() const { return p->getLayerStack(); } +void Layer::setSmomoLayerStackId() { + smomoLayerStackId = getLayerStack(); +} + +uint32_t Layer::getSmomoLayerStackId() { + return smomoLayerStackId; +} + bool Layer::setShadowRadius(float shadowRadius) { if (mDrawingState.shadowRadius == shadowRadius) { return false; diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index a95f9085d7..bfa97a07c8 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -906,6 +906,9 @@ public: virtual std::string getPendingBufferCounterName() { return ""; } virtual bool updateGeometry() { return false; } + void setSmomoLayerStackId(); + uint32_t getSmomoLayerStackId(); + protected: friend class impl::SurfaceInterceptor; @@ -1135,6 +1138,8 @@ private: const std::vector<BlurRegion> getBlurRegions() const; bool mIsAtRoot = false; + + uint32_t smomoLayerStackId = UINT32_MAX; public: nsecs_t getPreviousGfxInfo(); }; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 1aeb21778c..6dc2c6d809 100755 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -461,14 +461,13 @@ bool callingThreadHasRotateSurfaceFlingerAccess() { PermissionCache::checkPermission(sRotateSurfaceFlinger, pid, uid); } -void SurfaceFlinger::setRefreshRates( - std::unique_ptr<scheduler::RefreshRateConfigs> &refreshRateConfigs) { +void SurfaceFlinger::setRefreshRates(const sp<DisplayDevice>& display) { // Get Primary Smomo Instance. std::vector<float> refreshRates; - auto iter = refreshRateConfigs->getAllRefreshRates().cbegin(); - while (iter != refreshRateConfigs->getAllRefreshRates().cend()) { - if (refreshRateConfigs->isModeAllowed(iter->second->getModeId())) { + auto iter = display->refreshRateConfigs().getAllRefreshRates().cbegin(); + while (iter != display->refreshRateConfigs().getAllRefreshRates().cend()) { + if (display->refreshRateConfigs().isModeAllowed(iter->second->getModeId())) { refreshRates.push_back(iter->second->getFps().getValue()); } ++iter; @@ -1263,8 +1262,8 @@ void SurfaceFlinger::createSmomoInstance(const DisplayDeviceState& state) { setRefreshRateTo(refreshRate); }); - // b/223439401 Fix the following value-add - // setRefreshRates(mRefreshRateConfigs); + const auto display = getDefaultDisplayDeviceLocked(); + setRefreshRates(display); if (mSmomoInstances.size() > 1) { // Disable DRC on all instances. @@ -3291,6 +3290,10 @@ void SurfaceFlinger::UpdateSmomoState() { return; } + mDrawingState.traverse([&](Layer* layer) { + layer->setSmomoLayerStackId(); + }); + // Disable smomo if external or virtual is connected. bool enableSmomo = mSmomoInstances.size() == mDisplays.size(); uint32_t fps = 0; @@ -4764,6 +4767,7 @@ bool SurfaceFlinger::transactionIsReadyToBeApplied( if (smoMo) { ATRACE_BEGIN("smomo_begin"); if (smoMo->FrameIsEarly(layer->getSequence(), desiredPresentTime)) { + ATRACE_END(); return false; } ATRACE_END(); @@ -4895,11 +4899,15 @@ status_t SurfaceFlinger::setTransactionState( } state.traverseStatesWithBuffers([&](const layer_state_t& state) { - sp<Layer> layer = fromHandle(state.surface).promote(); - if (layer != nullptr) { - SmomoIntf *smoMo = nullptr; - if (mSmomoInstances.size() > 1) { - const uint32_t layerStackId = layer->getLayerStack(); + SmomoIntf *smoMo = nullptr; + int32_t sequence; + sp<Layer> layer = nullptr; + { + Mutex::Autolock _l(mStateLock); + layer = fromHandle(state.surface).promote(); + if (layer != nullptr) { + const uint32_t layerStackId = layer->getSmomoLayerStackId(); + sequence = layer->getSequence(); for (auto &instance: mSmomoInstances) { if (instance.layerStackId == layerStackId) { smoMo = instance.smoMo; @@ -4907,24 +4915,21 @@ status_t SurfaceFlinger::setTransactionState( } } } - else if (mSmomoInstances.size() == 1) { - smoMo = mSmomoInstances[0].smoMo; - } + } - if (smoMo) { - smomo::SmomoBufferStats bufferStats; - const nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); - bufferStats.id = layer->getSequence(); - bufferStats.auto_timestamp = isAutoTimestamp; - bufferStats.timestamp = now; - bufferStats.dequeue_latency = 0; - bufferStats.key = desiredPresentTime; - smoMo->CollectLayerStats(bufferStats); - - const DisplayStatInfo stats = mScheduler->getDisplayStatInfo(now); - if (smoMo->FrameIsLate(bufferStats.id, stats.vsyncTime)) { - signalImmedLayerUpdate(); - } + if (smoMo) { + smomo::SmomoBufferStats bufferStats; + const nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); + bufferStats.id = sequence; + bufferStats.auto_timestamp = isAutoTimestamp; + bufferStats.timestamp = now; + bufferStats.dequeue_latency = 0; + bufferStats.key = desiredPresentTime; + smoMo->CollectLayerStats(bufferStats); + + const DisplayStatInfo stats = mScheduler->getDisplayStatInfo(now); + if (smoMo->FrameIsLate(bufferStats.id, stats.vsyncTime)) { + signalImmedLayerUpdate(); } } }); @@ -5023,46 +5028,60 @@ void SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelin } void SurfaceFlinger::checkVirtualDisplayHint(const Vector<DisplayState>& displays) { - for (const DisplayState& s : displays) { - const ssize_t index = mCurrentState.displays.indexOfKey(s.token); - if (index < 0) - continue; + int width = 0, height = 0, format = 0; +#ifdef QTI_DISPLAY_CONFIG_ENABLED + bool createVirtualDisplay = false; +#endif + + { + Mutex::Autolock _l(mStateLock); + for (const DisplayState& s : displays) { + const ssize_t index = mCurrentState.displays.indexOfKey(s.token); + if (index < 0) + continue; - DisplayDeviceState& state = mCurrentState.displays.editValueAt(index); - const uint32_t what = s.what; - if (what & DisplayState::eSurfaceChanged) { - if (IInterface::asBinder(state.surface) != IInterface::asBinder(s.surface)) { - if (state.isVirtual() && s.surface != nullptr && - mVirtualDisplayIdGenerators.hal) { - int width = 0; - int status = s.surface->query(NATIVE_WINDOW_WIDTH, &width); - ALOGE_IF(status != NO_ERROR, "Unable to query width (%d)", status); - int height = 0; - status = s.surface->query(NATIVE_WINDOW_HEIGHT, &height); - ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status); - int format = 0; - status = s.surface->query(NATIVE_WINDOW_FORMAT, &format); - ALOGE_IF(status != NO_ERROR, "Unable to query format (%d)", status); + DisplayDeviceState& state = mCurrentState.displays.editValueAt(index); + const uint32_t what = s.what; + if (what & DisplayState::eSurfaceChanged) { + if (IInterface::asBinder(state.surface) != IInterface::asBinder(s.surface)) { + if (state.isVirtual() && s.surface != nullptr && + mVirtualDisplayIdGenerators.hal) { + width = 0; + int status = s.surface->query(NATIVE_WINDOW_WIDTH, &width); + ALOGE_IF(status != NO_ERROR, "Unable to query width (%d)", status); + height = 0; + status = s.surface->query(NATIVE_WINDOW_HEIGHT, &height); + ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status); + format = 0; + status = s.surface->query(NATIVE_WINDOW_FORMAT, &format); + ALOGE_IF(status != NO_ERROR, "Unable to query format (%d)", status); #ifdef QTI_DISPLAY_CONFIG_ENABLED - size_t maxVirtualDisplaySize = - getHwComposer().getMaxVirtualDisplayDimension(); - if ((mDisplayConfigIntf) && (maxVirtualDisplaySize == 0 || - ((uint64_t)width <= maxVirtualDisplaySize && - (uint64_t)height <= maxVirtualDisplaySize))) { - uint64_t usage = 0; - // Replace with native_window_get_consumer_usage ? - status = s.surface->getConsumerUsage(&usage); - ALOGW_IF(status != NO_ERROR, "Unable to query usage (%d)", status); - if ((status == NO_ERROR) && canAllocateHwcDisplayIdForVDS(usage)) { - mDisplayConfigIntf->CreateVirtualDisplay(width, height, format); - return; + size_t maxVirtualDisplaySize = + getHwComposer().getMaxVirtualDisplayDimension(); + if ((mDisplayConfigIntf) && (maxVirtualDisplaySize == 0 || + ((uint64_t)width <= maxVirtualDisplaySize && + (uint64_t)height <= maxVirtualDisplaySize))) { + uint64_t usage = 0; + // Replace with native_window_get_consumer_usage ? + status = s.surface->getConsumerUsage(&usage); + ALOGW_IF(status != NO_ERROR, "Unable to query usage (%d)", status); + if ((status == NO_ERROR) && canAllocateHwcDisplayIdForVDS(usage)) { + createVirtualDisplay = true; + break; + } } - } #endif + } } } } } + +#ifdef QTI_DISPLAY_CONFIG_ENABLED + if(createVirtualDisplay) { + mDisplayConfigIntf->CreateVirtualDisplay(width, height, format); + } +#endif } uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s) { @@ -8344,6 +8363,8 @@ status_t SurfaceFlinger::setDesiredDisplayModeSpecsInternal( preferredDisplayMode->getId().value()); } + setRefreshRates(display); + return NO_ERROR; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 16305aa135..44394e50fc 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -902,7 +902,7 @@ private: // Check if unified draw supported void startUnifiedDraw(); void InitComposerExtn(); - void createSmomoInstance(const DisplayDeviceState& state); + void createSmomoInstance(const DisplayDeviceState& state) REQUIRES(mStateLock); void destroySmomoInstance(const sp<DisplayDevice>& display); // Returns whether a new buffer has been latched (see handlePageFlip()) @@ -1682,7 +1682,7 @@ private: void scheduleRegionSamplingThread(); void notifyRegionSamplingThread(); - void setRefreshRates(std::unique_ptr<scheduler::RefreshRateConfigs> &refreshRateConfigs); + void setRefreshRates(const sp<DisplayDevice>& display); void UpdateSmomoState(); bool isRefreshRateOverlayEnabled() const REQUIRES(mStateLock) { return std::any_of(mDisplays.begin(), mDisplays.end(), |