summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVikas batchu <quic_vikabatc@quicinc.com>2022-03-31 15:05:25 +0530
committerVikas batchu <quic_vikabatc@quicinc.com>2022-04-14 19:50:28 +0530
commit8f2727dfc631eda85e153478b8d5d6a5b15aa4f7 (patch)
tree38d3babeddd635a58c65632d0d8cad5e1d7c63e7
parenta3996862bab999901d3682d36ca970e447980427 (diff)
sf: add smomoLayerStackId for Layers
avoid using getLayerStack in setTransactionState as it results in sf crashes. CRs-Fixed: 3174977 Change-Id: I029c6488a5165e702ca6b514ba54f47384a7449a
-rw-r--r--services/surfaceflinger/Layer.cpp8
-rw-r--r--services/surfaceflinger/Layer.h5
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp49
3 files changed, 40 insertions, 22 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..0be7df1488 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3291,6 +3291,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;
@@ -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();
}
}
});