diff options
| -rw-r--r-- | services/surfaceflinger/BufferStateLayer.cpp | 8 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 5 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/TunnelModeEnabledReporter.cpp | 11 | ||||
| -rw-r--r-- | services/surfaceflinger/TunnelModeEnabledReporter.h | 7 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/TunnelModeEnabledReporterTest.cpp | 17 |
7 files changed, 34 insertions, 17 deletions
diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index a3b7b13d4c..6b5cf04536 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -540,10 +540,16 @@ bool BufferStateLayer::setApi(int32_t api) { bool BufferStateLayer::setSidebandStream(const sp<NativeHandle>& sidebandStream) { if (mDrawingState.sidebandStream == sidebandStream) return false; + + if (mDrawingState.sidebandStream != nullptr && sidebandStream == nullptr) { + mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount(); + } else if (sidebandStream != nullptr) { + mFlinger->mTunnelModeEnabledReporter->incrementTunnelModeCount(); + } + mDrawingState.sidebandStream = sidebandStream; mDrawingState.modified = true; setTransactionFlags(eTransactionNeeded); - if (!mSidebandStreamChanged.exchange(true)) { // mSidebandStreamChanged was false mFlinger->signalLayerUpdate(); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index bb1d3fc93e..ad31b3fcad 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -70,6 +70,7 @@ #include "MonitoredProducer.h" #include "SurfaceFlinger.h" #include "TimeStats/TimeStats.h" +#include "TunnelModeEnabledReporter.h" #include "input/InputWindow.h" #define DEBUG_RESIZE 0 @@ -172,6 +173,10 @@ Layer::~Layer() { mFrameTracker.logAndResetStats(mName); mFlinger->onLayerDestroyed(this); + + if (mDrawingState.sidebandStream != nullptr) { + mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount(); + } } LayerCreationArgs::LayerCreationArgs(SurfaceFlinger* flinger, sp<Client> client, std::string name, diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index deda3173ed..a022a8e85f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -342,6 +342,7 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag) mEventQueue(mFactory.createMessageQueue()), mCompositionEngine(mFactory.createCompositionEngine()), mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)), + mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()), mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)), mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)) { ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str()); @@ -3153,7 +3154,6 @@ void SurfaceFlinger::initScheduler(const DisplayDeviceState& displayState) { mRegionSamplingThread = new RegionSamplingThread(*this, RegionSamplingThread::EnvironmentTimingTunables()); mFpsReporter = new FpsReporter(*mFrameTimeline, *this); - mTunnelModeEnabledReporter = new TunnelModeEnabledReporter(*this); // Dispatch a mode change request for the primary display on scheduler // initialization, so that the EventThreads always contain a reference to a // prior configuration. diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 044b0b4805..f33df86494 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -364,6 +364,7 @@ private: // For unit tests friend class TestableSurfaceFlinger; friend class TransactionApplicationTest; + friend class TunnelModeEnabledReporterTest; using RefreshRate = scheduler::RefreshRateConfigs::RefreshRate; using VsyncModulator = scheduler::VsyncModulator; diff --git a/services/surfaceflinger/TunnelModeEnabledReporter.cpp b/services/surfaceflinger/TunnelModeEnabledReporter.cpp index 48e321635b..4497cafa58 100644 --- a/services/surfaceflinger/TunnelModeEnabledReporter.cpp +++ b/services/surfaceflinger/TunnelModeEnabledReporter.cpp @@ -26,17 +26,10 @@ namespace android { -TunnelModeEnabledReporter::TunnelModeEnabledReporter(SurfaceFlinger& flinger) : mFlinger(flinger) {} +TunnelModeEnabledReporter::TunnelModeEnabledReporter() {} void TunnelModeEnabledReporter::updateTunnelModeStatus() { - bool tunnelModeEnabled = false; - mFlinger.mCurrentState.traverse([&](Layer* layer) { - auto& state = layer->getDrawingState(); - if (state.sidebandStream != nullptr) { - tunnelModeEnabled = true; - return; - } - }); + bool tunnelModeEnabled = mTunnelModeCount > 0; dispatchTunnelModeEnabled(tunnelModeEnabled); } diff --git a/services/surfaceflinger/TunnelModeEnabledReporter.h b/services/surfaceflinger/TunnelModeEnabledReporter.h index d55507a8e9..935502a6e1 100644 --- a/services/surfaceflinger/TunnelModeEnabledReporter.h +++ b/services/surfaceflinger/TunnelModeEnabledReporter.h @@ -29,7 +29,7 @@ class SurfaceFlinger; class TunnelModeEnabledReporter : public IBinder::DeathRecipient { public: - TunnelModeEnabledReporter(SurfaceFlinger& flinger); + TunnelModeEnabledReporter(); // Checks if there is a tunnel mode enabled state change and if so, dispatches the updated // tunnel mode enabled/disabled state to the registered listeners @@ -49,6 +49,9 @@ public: // Deregisters a TunnelModeEnabled listener void removeListener(const sp<gui::ITunnelModeEnabledListener>& listener); + inline void incrementTunnelModeCount() { mTunnelModeCount++; } + inline void decrementTunnelModeCount() { mTunnelModeCount--; } + private: mutable std::mutex mMutex; struct WpHash { @@ -57,10 +60,10 @@ private: } }; - SurfaceFlinger& mFlinger; std::unordered_map<wp<IBinder>, sp<gui::ITunnelModeEnabledListener>, WpHash> mListeners GUARDED_BY(mMutex); bool mTunnelModeEnabled GUARDED_BY(mMutex) = false; + uint32_t mTunnelModeCount = 0; }; } // namespace android diff --git a/services/surfaceflinger/tests/unittests/TunnelModeEnabledReporterTest.cpp b/services/surfaceflinger/tests/unittests/TunnelModeEnabledReporterTest.cpp index d7d7ea77d6..e4f74694f7 100644 --- a/services/surfaceflinger/tests/unittests/TunnelModeEnabledReporterTest.cpp +++ b/services/surfaceflinger/tests/unittests/TunnelModeEnabledReporterTest.cpp @@ -27,6 +27,7 @@ #include "TunnelModeEnabledReporter.h" #include "mock/DisplayHardware/MockComposer.h" #include "mock/MockEventThread.h" +#include "mock/MockMessageQueue.h" namespace android { @@ -71,15 +72,20 @@ protected: sp<TestableTunnelModeEnabledListener> mTunnelModeEnabledListener = new TestableTunnelModeEnabledListener(); sp<TunnelModeEnabledReporter> mTunnelModeEnabledReporter = - new TunnelModeEnabledReporter(*(mFlinger.flinger())); + new TunnelModeEnabledReporter(); + + mock::MessageQueue* mMessageQueue = new mock::MessageQueue(); }; TunnelModeEnabledReporterTest::TunnelModeEnabledReporterTest() { const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info(); ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name()); + + mFlinger.mutableEventQueue().reset(mMessageQueue); setupScheduler(); mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>()); + mFlinger.flinger()->mTunnelModeEnabledReporter = mTunnelModeEnabledReporter; mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(false); } @@ -156,16 +162,18 @@ TEST_F(TunnelModeEnabledReporterTest, callsNewListenerWithFreshInformation) { sp<NativeHandle> stream = NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM), false); - mFlinger.setLayerSidebandStream(layer, stream); + layer->setSidebandStream(stream); mFlinger.mutableCurrentState().layersSortedByZ.add(layer); mTunnelModeEnabledReporter->updateTunnelModeStatus(); mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener); EXPECT_EQ(true, mTunnelModeEnabledListener->mTunnelModeEnabled); mTunnelModeEnabledReporter->removeListener(mTunnelModeEnabledListener); - mFlinger.mutableCurrentState().layersSortedByZ.remove(layer); + layer = nullptr; + mTunnelModeEnabledReporter->updateTunnelModeStatus(); mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener); + EXPECT_EQ(false, mTunnelModeEnabledListener->mTunnelModeEnabled); } @@ -178,7 +186,7 @@ TEST_F(TunnelModeEnabledReporterTest, layerWithSidebandStreamTriggersUpdate) { sp<NativeHandle> stream = NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM), false); - mFlinger.setLayerSidebandStream(layerWithSidebandStream, stream); + layerWithSidebandStream->setSidebandStream(stream); mFlinger.mutableCurrentState().layersSortedByZ.add(simpleLayer); mFlinger.mutableCurrentState().layersSortedByZ.add(layerWithSidebandStream); @@ -186,6 +194,7 @@ TEST_F(TunnelModeEnabledReporterTest, layerWithSidebandStreamTriggersUpdate) { EXPECT_EQ(true, mTunnelModeEnabledListener->mTunnelModeEnabled); mFlinger.mutableCurrentState().layersSortedByZ.remove(layerWithSidebandStream); + layerWithSidebandStream = nullptr; mTunnelModeEnabledReporter->updateTunnelModeStatus(); EXPECT_EQ(false, mTunnelModeEnabledListener->mTunnelModeEnabled); } |