diff options
author | 2018-01-22 17:21:36 -0800 | |
---|---|---|
committer | 2018-03-26 17:25:28 -0700 | |
commit | 4d2348551e73b4990aedc83db17a336b533316e6 (patch) | |
tree | 1f9c9bbd90eeb0d939994cbcd9bd459c10ec6909 | |
parent | 81b57db2100b438f429af7c7cc8116034078f37c (diff) |
SF: Separate SurfaceInterceptor into interface and impl
SurfaceInterceptor is now an abstract interface.
impl::SurfaceInterceptor is the normal implementation.
This allows unit tests to replace it with a GMock.
Test: Builds
Bug: 74827900
Change-Id: I4d5bb2649b0c7a8ec1e6c0abf01ab53174d06a19
(cherry picked from commit 4dccc413ddf822ca6f1856fd2d8ab80185203eed)
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/EventThread.cpp | 2 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 6 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 25 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceInterceptor.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceInterceptor.h | 72 |
7 files changed, 85 insertions, 35 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index d22c021139..9200207f4a 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -690,9 +690,9 @@ void BufferLayer::onFrameAvailable(const BufferItem& item) { // Add this buffer from our internal queue tracker { // Autolock scope Mutex::Autolock lock(mQueueItemLock); - mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), - item.mGraphicBuffer->getHeight(), - item.mFrameNumber); + mFlinger->mInterceptor->saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), + item.mGraphicBuffer->getHeight(), + item.mFrameNumber); // Reset the frame number tracker when we receive the first buffer after // a frame number reset if (item.mFrameNumber == 1) { diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp index 1f4f5a53f4..bb9c0703ed 100644 --- a/services/surfaceflinger/EventThread.cpp +++ b/services/surfaceflinger/EventThread.cpp @@ -217,7 +217,7 @@ Vector<sp<EventThread::Connection> > EventThread::waitForEventLocked( if (timestamp) { // we have a vsync event to dispatch if (mInterceptVSyncs) { - mFlinger.mInterceptor.saveVSyncEvent(timestamp); + mFlinger.mInterceptor->saveVSyncEvent(timestamp); } *event = mVSyncEvent[i]; mVSyncEvent[i].header.timestamp = 0; diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 996d686371..3d572c67fb 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -66,6 +66,10 @@ class SurfaceFlinger; class LayerDebugInfo; class LayerBE; +namespace impl { +class SurfaceInterceptor; +} + // --------------------------------------------------------------------------- struct CompositionInfo { @@ -593,7 +597,7 @@ protected: virtual void onFirstRef(); - friend class SurfaceInterceptor; + friend class impl::SurfaceInterceptor; void commitTransaction(const State& stateToCommit); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e5a15d58af..932b92e653 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -186,7 +186,6 @@ SurfaceFlinger::SurfaceFlinger(SurfaceFlinger::SkipInitializationTag) mLastTransactionTime(0), mBootFinished(false), mForceFullDamage(false), - mInterceptor(this), mPrimaryDispSync("PrimaryDispSync"), mPrimaryHWVsyncEnabled(false), mHWVsyncAvailable(false), @@ -350,7 +349,7 @@ sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName, DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure); info.displayName = displayName; mCurrentState.displays.add(token, info); - mInterceptor.saveDisplayCreation(info); + mInterceptor->saveDisplayCreation(info); return token; } @@ -368,7 +367,7 @@ void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) { ALOGE("destroyDisplay called for non-virtual display"); return; } - mInterceptor.saveDisplayDeletion(info.displayId); + mInterceptor->saveDisplayDeletion(info.displayId); mCurrentState.displays.removeItemsAt(idx); setTransactionFlags(eDisplayTransactionNeeded); } @@ -2131,7 +2130,7 @@ void SurfaceFlinger::processDisplayHotplugEventsLocked() { info.displayName = displayType == DisplayDevice::DISPLAY_PRIMARY ? "Built-in Screen" : "External Screen"; mCurrentState.displays.add(mBuiltinDisplays[displayType], info); - mInterceptor.saveDisplayCreation(info); + mInterceptor->saveDisplayCreation(info); } } else { ALOGV("Removing built in display %d", displayType); @@ -2139,7 +2138,7 @@ void SurfaceFlinger::processDisplayHotplugEventsLocked() { ssize_t idx = mCurrentState.displays.indexOfKey(mBuiltinDisplays[displayType]); if (idx >= 0) { const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx)); - mInterceptor.saveDisplayDeletion(info.displayId); + mInterceptor->saveDisplayDeletion(info.displayId); mCurrentState.displays.removeItemsAt(idx); } mBuiltinDisplays[displayType].clear(); @@ -3066,8 +3065,8 @@ void SurfaceFlinger::setTransactionState( } if (transactionFlags) { - if (mInterceptor.isEnabled()) { - mInterceptor.saveTransaction(states, mCurrentState.displays, displays, flags); + if (mInterceptor->isEnabled()) { + mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags); } // this triggers the transaction @@ -3370,7 +3369,7 @@ status_t SurfaceFlinger::createLayer( if (result != NO_ERROR) { return result; } - mInterceptor.saveSurfaceCreation(layer); + mInterceptor->saveSurfaceCreation(layer); setTransactionFlags(eTransactionNeeded); return result; @@ -3442,7 +3441,7 @@ status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBind status_t err = NO_ERROR; sp<Layer> l(client->getLayerUser(handle)); if (l != nullptr) { - mInterceptor.saveSurfaceDeletion(l); + mInterceptor->saveSurfaceDeletion(l); err = removeLayer(l); ALOGE_IF(err<0 && err != NAME_NOT_FOUND, "error removing layer=%p (%s)", l.get(), strerror(-err)); @@ -3524,14 +3523,14 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw, return; } - if (mInterceptor.isEnabled()) { + if (mInterceptor->isEnabled()) { ConditionalLock lock(mStateLock, !stateLockHeld); ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken()); if (idx < 0) { ALOGW("Surface Interceptor SavePowerMode: invalid display token"); return; } - mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode); + mInterceptor->savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode); } if (currentMode == HWC_POWER_MODE_OFF) { @@ -4335,11 +4334,11 @@ status_t SurfaceFlinger::onTransact( n = data.readInt32(); if (n) { ALOGV("Interceptor enabled"); - mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays); + mInterceptor->enable(mDrawingState.layersSortedByZ, mDrawingState.displays); } else{ ALOGV("Interceptor disabled"); - mInterceptor.disable(); + mInterceptor->disable(); } return NO_ERROR; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 989e20d6fe..7d15622d4f 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -777,7 +777,8 @@ private: bool mBootFinished; bool mForceFullDamage; bool mPropagateBackpressure = true; - SurfaceInterceptor mInterceptor; + std::unique_ptr<SurfaceInterceptor> mInterceptor = + std::make_unique<impl::SurfaceInterceptor>(this); SurfaceTracing mTracing; bool mUseHwcVirtualDisplays = false; diff --git a/services/surfaceflinger/SurfaceInterceptor.cpp b/services/surfaceflinger/SurfaceInterceptor.cpp index eeb492978c..4596a21f12 100644 --- a/services/surfaceflinger/SurfaceInterceptor.cpp +++ b/services/surfaceflinger/SurfaceInterceptor.cpp @@ -31,6 +31,10 @@ namespace android { // ---------------------------------------------------------------------------- +SurfaceInterceptor::~SurfaceInterceptor() = default; + +namespace impl { + SurfaceInterceptor::SurfaceInterceptor(SurfaceFlinger* flinger) : mFlinger(flinger) { @@ -593,5 +597,5 @@ void SurfaceInterceptor::savePowerModeUpdate(int32_t displayId, int32_t mode) { addPowerModeUpdateLocked(createTraceIncrementLocked(), displayId, mode); } - +} // namespace impl } // namespace android diff --git a/services/surfaceflinger/SurfaceInterceptor.h b/services/surfaceflinger/SurfaceInterceptor.h index 30ebcc6a1c..96defcc265 100644 --- a/services/surfaceflinger/SurfaceInterceptor.h +++ b/services/surfaceflinger/SurfaceInterceptor.h @@ -21,48 +21,89 @@ #include <mutex> +#include <gui/LayerState.h> + +#include <utils/KeyedVector.h> #include <utils/SortedVector.h> +#include <utils/StrongPointer.h> #include <utils/Vector.h> +#include "DisplayDevice.h" + namespace android { class BufferItem; class Layer; class SurfaceFlinger; +struct ComposerState; +struct DisplayDeviceState; struct DisplayState; struct layer_state_t; constexpr auto DEFAULT_FILENAME = "/data/SurfaceTrace.dat"; +class SurfaceInterceptor { +public: + virtual ~SurfaceInterceptor(); + + // Both vectors are used to capture the current state of SF as the initial snapshot in the trace + virtual void enable(const SortedVector<sp<Layer>>& layers, + const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) = 0; + virtual void disable() = 0; + virtual bool isEnabled() = 0; + + // Intercept display and surface transactions + virtual void saveTransaction( + const Vector<ComposerState>& stateUpdates, + const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays, + const Vector<DisplayState>& changedDisplays, uint32_t flags) = 0; + + // Intercept surface data + virtual void saveSurfaceCreation(const sp<const Layer>& layer) = 0; + virtual void saveSurfaceDeletion(const sp<const Layer>& layer) = 0; + virtual void saveBufferUpdate(const sp<const Layer>& layer, uint32_t width, uint32_t height, + uint64_t frameNumber) = 0; + + // Intercept display data + virtual void saveDisplayCreation(const DisplayDeviceState& info) = 0; + virtual void saveDisplayDeletion(int32_t displayId) = 0; + virtual void savePowerModeUpdate(int32_t displayId, int32_t mode) = 0; + virtual void saveVSyncEvent(nsecs_t timestamp) = 0; +}; + +namespace impl { + /* * SurfaceInterceptor intercepts and stores incoming streams of window * properties on SurfaceFlinger. */ -class SurfaceInterceptor { +class SurfaceInterceptor final : public android::SurfaceInterceptor { public: - SurfaceInterceptor(SurfaceFlinger* const flinger); + explicit SurfaceInterceptor(SurfaceFlinger* const flinger); + ~SurfaceInterceptor() override = default; + // Both vectors are used to capture the current state of SF as the initial snapshot in the trace void enable(const SortedVector<sp<Layer>>& layers, - const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays); - void disable(); - bool isEnabled(); + const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays) override; + void disable() override; + bool isEnabled() override; // Intercept display and surface transactions void saveTransaction(const Vector<ComposerState>& stateUpdates, - const DefaultKeyedVector< wp<IBinder>, DisplayDeviceState>& displays, - const Vector<DisplayState>& changedDisplays, uint32_t flags); + const DefaultKeyedVector<wp<IBinder>, DisplayDeviceState>& displays, + const Vector<DisplayState>& changedDisplays, uint32_t flags) override; // Intercept surface data - void saveSurfaceCreation(const sp<const Layer>& layer); - void saveSurfaceDeletion(const sp<const Layer>& layer); + void saveSurfaceCreation(const sp<const Layer>& layer) override; + void saveSurfaceDeletion(const sp<const Layer>& layer) override; void saveBufferUpdate(const sp<const Layer>& layer, uint32_t width, uint32_t height, - uint64_t frameNumber); + uint64_t frameNumber) override; // Intercept display data - void saveDisplayCreation(const DisplayDeviceState& info); - void saveDisplayDeletion(int32_t displayId); - void savePowerModeUpdate(int32_t displayId, int32_t mode); - void saveVSyncEvent(nsecs_t timestamp); + void saveDisplayCreation(const DisplayDeviceState& info) override; + void saveDisplayDeletion(int32_t displayId) override; + void savePowerModeUpdate(int32_t displayId, int32_t mode) override; + void saveVSyncEvent(nsecs_t timestamp) override; private: // The creation increments of Surfaces and Displays do not contain enough information to capture @@ -134,6 +175,7 @@ private: SurfaceFlinger* const mFlinger; }; -} +} // namespace impl +} // namespace android #endif // ANDROID_SURFACEINTERCEPTOR_H |