summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralk3pInjection <webmaster@raspii.tech>2022-06-02 22:45:00 +0800
committeralk3pInjection <webmaster@raspii.tech>2022-06-02 22:45:00 +0800
commit780f2727923b656adcdcd08f41da399c7b8301ee (patch)
treea2a1e35b3dcb2c408da313f8d558a57c2d6cc7ee
parent8bd964a91e09bd9ed187bc194fe87a956431d345 (diff)
parentc15a23917517c1ffbaaa470d35423e968f7ddffe (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.cpp8
-rw-r--r--services/surfaceflinger/Layer.h5
-rwxr-xr-xservices/surfaceflinger/SurfaceFlinger.cpp143
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h4
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(),