1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <compositionengine/Display.h> 20 #include <compositionengine/LayerFECompositionState.h> 21 #include <compositionengine/OutputLayer.h> 22 #include <compositionengine/impl/CompositionEngine.h> 23 #include <compositionengine/impl/Display.h> 24 #include <compositionengine/impl/OutputLayerCompositionState.h> 25 #include <compositionengine/mock/DisplaySurface.h> 26 #include <gui/ScreenCaptureResults.h> 27 28 #include "BufferQueueLayer.h" 29 #include "BufferStateLayer.h" 30 #include "ContainerLayer.h" 31 #include "DisplayDevice.h" 32 #include "EffectLayer.h" 33 #include "FakeVsyncConfiguration.h" 34 #include "FrameTracer/FrameTracer.h" 35 #include "Layer.h" 36 #include "NativeWindowSurface.h" 37 #include "Scheduler/MessageQueue.h" 38 #include "Scheduler/RefreshRateConfigs.h" 39 #include "StartPropertySetThread.h" 40 #include "SurfaceFlinger.h" 41 #include "SurfaceFlingerDefaultFactory.h" 42 #include "SurfaceInterceptor.h" 43 #include "TestableScheduler.h" 44 #include "mock/DisplayHardware/MockComposer.h" 45 #include "mock/MockFrameTimeline.h" 46 #include "mock/MockFrameTracer.h" 47 48 namespace android { 49 50 class EventThread; 51 52 namespace renderengine { 53 54 class RenderEngine; 55 56 } // namespace renderengine 57 58 namespace Hwc2 { 59 60 class Composer; 61 62 } // namespace Hwc2 63 64 namespace hal = android::hardware::graphics::composer::hal; 65 66 namespace surfaceflinger::test { 67 68 class Factory final : public surfaceflinger::Factory { 69 public: 70 ~Factory() = default; 71 createHWComposer(const std::string &)72 std::unique_ptr<HWComposer> createHWComposer(const std::string&) override { 73 return nullptr; 74 } 75 createMessageQueue()76 std::unique_ptr<MessageQueue> createMessageQueue() override { 77 return std::make_unique<android::impl::MessageQueue>(); 78 } 79 createVsyncConfiguration(Fps)80 std::unique_ptr<scheduler::VsyncConfiguration> createVsyncConfiguration( 81 Fps /*currentRefreshRate*/) override { 82 return std::make_unique<scheduler::FakePhaseOffsets>(); 83 } 84 createScheduler(const std::shared_ptr<scheduler::RefreshRateConfigs> &,ISchedulerCallback &)85 std::unique_ptr<Scheduler> createScheduler( 86 const std::shared_ptr<scheduler::RefreshRateConfigs>&, ISchedulerCallback&) override { 87 return nullptr; 88 } 89 createSurfaceInterceptor()90 sp<SurfaceInterceptor> createSurfaceInterceptor() override { 91 return new android::impl::SurfaceInterceptor(); 92 } 93 createStartPropertySetThread(bool timestampPropertyValue)94 sp<StartPropertySetThread> createStartPropertySetThread(bool timestampPropertyValue) override { 95 return new StartPropertySetThread(timestampPropertyValue); 96 } 97 createDisplayDevice(DisplayDeviceCreationArgs & creationArgs)98 sp<DisplayDevice> createDisplayDevice(DisplayDeviceCreationArgs& creationArgs) override { 99 return new DisplayDevice(creationArgs); 100 } 101 createGraphicBuffer(uint32_t width,uint32_t height,PixelFormat format,uint32_t layerCount,uint64_t usage,std::string requestorName)102 sp<GraphicBuffer> createGraphicBuffer(uint32_t width, uint32_t height, PixelFormat format, 103 uint32_t layerCount, uint64_t usage, 104 std::string requestorName) override { 105 return new GraphicBuffer(width, height, format, layerCount, usage, requestorName); 106 } 107 createBufferQueue(sp<IGraphicBufferProducer> * outProducer,sp<IGraphicBufferConsumer> * outConsumer,bool consumerIsSurfaceFlinger)108 void createBufferQueue(sp<IGraphicBufferProducer>* outProducer, 109 sp<IGraphicBufferConsumer>* outConsumer, 110 bool consumerIsSurfaceFlinger) override { 111 if (!mCreateBufferQueue) { 112 BufferQueue::createBufferQueue(outProducer, outConsumer, consumerIsSurfaceFlinger); 113 return; 114 } 115 mCreateBufferQueue(outProducer, outConsumer, consumerIsSurfaceFlinger); 116 } 117 createMonitoredProducer(const sp<IGraphicBufferProducer> & producer,const sp<SurfaceFlinger> & flinger,const wp<Layer> & layer)118 sp<IGraphicBufferProducer> createMonitoredProducer(const sp<IGraphicBufferProducer>& producer, 119 const sp<SurfaceFlinger>& flinger, 120 const wp<Layer>& layer) override { 121 return new MonitoredProducer(producer, flinger, layer); 122 } 123 createBufferLayerConsumer(const sp<IGraphicBufferConsumer> & consumer,renderengine::RenderEngine & renderEngine,uint32_t textureName,Layer * layer)124 sp<BufferLayerConsumer> createBufferLayerConsumer(const sp<IGraphicBufferConsumer>& consumer, 125 renderengine::RenderEngine& renderEngine, 126 uint32_t textureName, Layer* layer) override { 127 return new BufferLayerConsumer(consumer, renderEngine, textureName, layer); 128 } 129 createNativeWindowSurface(const sp<IGraphicBufferProducer> & producer)130 std::unique_ptr<surfaceflinger::NativeWindowSurface> createNativeWindowSurface( 131 const sp<IGraphicBufferProducer>& producer) override { 132 if (!mCreateNativeWindowSurface) return nullptr; 133 return mCreateNativeWindowSurface(producer); 134 } 135 createCompositionEngine()136 std::unique_ptr<compositionengine::CompositionEngine> createCompositionEngine() override { 137 return compositionengine::impl::createCompositionEngine(); 138 } 139 createBufferQueueLayer(const LayerCreationArgs &)140 sp<BufferQueueLayer> createBufferQueueLayer(const LayerCreationArgs&) override { 141 return nullptr; 142 } 143 createBufferStateLayer(const LayerCreationArgs &)144 sp<BufferStateLayer> createBufferStateLayer(const LayerCreationArgs&) override { 145 return nullptr; 146 } 147 createEffectLayer(const LayerCreationArgs &)148 sp<EffectLayer> createEffectLayer(const LayerCreationArgs&) override { return nullptr; } 149 createContainerLayer(const LayerCreationArgs &)150 sp<ContainerLayer> createContainerLayer(const LayerCreationArgs&) override { 151 return nullptr; 152 } 153 createFrameTracer()154 std::unique_ptr<FrameTracer> createFrameTracer() override { 155 return std::make_unique<mock::FrameTracer>(); 156 } 157 158 std::unique_ptr<frametimeline::FrameTimeline> createFrameTimeline( 159 std::shared_ptr<TimeStats> timeStats, pid_t surfaceFlingerPid = 0) override { 160 return std::make_unique<mock::FrameTimeline>(timeStats, surfaceFlingerPid); 161 } 162 163 using CreateBufferQueueFunction = 164 std::function<void(sp<IGraphicBufferProducer>* /* outProducer */, 165 sp<IGraphicBufferConsumer>* /* outConsumer */, 166 bool /* consumerIsSurfaceFlinger */)>; 167 CreateBufferQueueFunction mCreateBufferQueue; 168 169 using CreateNativeWindowSurfaceFunction = 170 std::function<std::unique_ptr<surfaceflinger::NativeWindowSurface>( 171 const sp<IGraphicBufferProducer>&)>; 172 CreateNativeWindowSurfaceFunction mCreateNativeWindowSurface; 173 174 using CreateCompositionEngineFunction = 175 std::function<std::unique_ptr<compositionengine::CompositionEngine>()>; 176 CreateCompositionEngineFunction mCreateCompositionEngine; 177 }; 178 179 } // namespace surfaceflinger::test 180 181 class TestableSurfaceFlinger final : private ISchedulerCallback { 182 public: 183 using HotplugEvent = SurfaceFlinger::HotplugEvent; 184 flinger()185 SurfaceFlinger* flinger() { return mFlinger.get(); } scheduler()186 TestableScheduler* scheduler() { return mScheduler; } 187 188 // Extend this as needed for accessing SurfaceFlinger private (and public) 189 // functions. 190 setupRenderEngine(std::unique_ptr<renderengine::RenderEngine> renderEngine)191 void setupRenderEngine(std::unique_ptr<renderengine::RenderEngine> renderEngine) { 192 mFlinger->mCompositionEngine->setRenderEngine(std::move(renderEngine)); 193 } 194 setupComposer(std::unique_ptr<Hwc2::Composer> composer)195 void setupComposer(std::unique_ptr<Hwc2::Composer> composer) { 196 mFlinger->mCompositionEngine->setHwComposer( 197 std::make_unique<impl::HWComposer>(std::move(composer))); 198 } 199 setupTimeStats(const std::shared_ptr<TimeStats> & timeStats)200 void setupTimeStats(const std::shared_ptr<TimeStats>& timeStats) { 201 mFlinger->mCompositionEngine->setTimeStats(timeStats); 202 } 203 204 // The ISchedulerCallback argument can be nullptr for a no-op implementation. 205 void setupScheduler(std::unique_ptr<scheduler::VsyncController> vsyncController, 206 std::unique_ptr<scheduler::VSyncTracker> vsyncTracker, 207 std::unique_ptr<EventThread> appEventThread, 208 std::unique_ptr<EventThread> sfEventThread, 209 ISchedulerCallback* callback = nullptr, bool hasMultipleModes = false) { 210 DisplayModes modes{DisplayMode::Builder(0) 211 .setId(DisplayModeId(0)) 212 .setPhysicalDisplayId(PhysicalDisplayId(0)) 213 .setVsyncPeriod(16'666'667) 214 .setGroup(0) 215 .build()}; 216 217 if (hasMultipleModes) { 218 modes.emplace_back(DisplayMode::Builder(1) 219 .setId(DisplayModeId(1)) 220 .setPhysicalDisplayId(PhysicalDisplayId(0)) 221 .setVsyncPeriod(11'111'111) 222 .setGroup(0) 223 .build()); 224 } 225 226 const auto currMode = DisplayModeId(0); 227 mRefreshRateConfigs = std::make_shared<scheduler::RefreshRateConfigs>(modes, currMode); 228 const auto currFps = mRefreshRateConfigs->getCurrentRefreshRate().getFps(); 229 mFlinger->mVsyncConfiguration = mFactory.createVsyncConfiguration(currFps); 230 mFlinger->mVsyncModulator = sp<scheduler::VsyncModulator>::make( 231 mFlinger->mVsyncConfiguration->getCurrentConfigs()); 232 mFlinger->mRefreshRateStats = 233 std::make_unique<scheduler::RefreshRateStats>(*mFlinger->mTimeStats, currFps, 234 /*powerMode=*/hal::PowerMode::OFF); 235 236 mScheduler = new TestableScheduler(std::move(vsyncController), std::move(vsyncTracker), 237 mRefreshRateConfigs, *(callback ?: this)); 238 239 mFlinger->mAppConnectionHandle = mScheduler->createConnection(std::move(appEventThread)); 240 mFlinger->mSfConnectionHandle = mScheduler->createConnection(std::move(sfEventThread)); 241 resetScheduler(mScheduler); 242 } 243 resetScheduler(Scheduler * scheduler)244 void resetScheduler(Scheduler* scheduler) { mFlinger->mScheduler.reset(scheduler); } 245 mutableScheduler()246 TestableScheduler& mutableScheduler() const { return *mScheduler; } 247 248 using CreateBufferQueueFunction = surfaceflinger::test::Factory::CreateBufferQueueFunction; setCreateBufferQueueFunction(CreateBufferQueueFunction f)249 void setCreateBufferQueueFunction(CreateBufferQueueFunction f) { 250 mFactory.mCreateBufferQueue = f; 251 } 252 253 using CreateNativeWindowSurfaceFunction = 254 surfaceflinger::test::Factory::CreateNativeWindowSurfaceFunction; setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f)255 void setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f) { 256 mFactory.mCreateNativeWindowSurface = f; 257 } 258 setInternalDisplayPrimaries(const ui::DisplayPrimaries & primaries)259 void setInternalDisplayPrimaries(const ui::DisplayPrimaries& primaries) { 260 memcpy(&mFlinger->mInternalDisplayPrimaries, &primaries, sizeof(ui::DisplayPrimaries)); 261 } 262 mutableLayerDrawingState(const sp<Layer> & layer)263 static auto& mutableLayerDrawingState(const sp<Layer>& layer) { return layer->mDrawingState; } 264 mutableStateLock()265 auto& mutableStateLock() { return mFlinger->mStateLock; } 266 findOutputLayerForDisplay(const sp<Layer> & layer,const sp<const DisplayDevice> & display)267 static auto findOutputLayerForDisplay(const sp<Layer>& layer, 268 const sp<const DisplayDevice>& display) { 269 return layer->findOutputLayerForDisplay(display.get()); 270 } 271 setLayerSidebandStream(const sp<Layer> & layer,const sp<NativeHandle> & sidebandStream)272 static void setLayerSidebandStream(const sp<Layer>& layer, 273 const sp<NativeHandle>& sidebandStream) { 274 layer->mDrawingState.sidebandStream = sidebandStream; 275 layer->mSidebandStream = sidebandStream; 276 layer->editCompositionState()->sidebandStream = sidebandStream; 277 } 278 setLayerCompositionType(const sp<Layer> & layer,hal::Composition type)279 void setLayerCompositionType(const sp<Layer>& layer, hal::Composition type) { 280 auto outputLayer = findOutputLayerForDisplay(layer, mFlinger->getDefaultDisplayDevice()); 281 LOG_ALWAYS_FATAL_IF(!outputLayer); 282 auto& state = outputLayer->editState(); 283 LOG_ALWAYS_FATAL_IF(!outputLayer->getState().hwc); 284 (*state.hwc).hwcCompositionType = type; 285 } 286 setLayerPotentialCursor(const sp<Layer> & layer,bool potentialCursor)287 static void setLayerPotentialCursor(const sp<Layer>& layer, bool potentialCursor) { 288 layer->mPotentialCursor = potentialCursor; 289 } 290 setLayerDrawingParent(const sp<Layer> & layer,const sp<Layer> & drawingParent)291 static void setLayerDrawingParent(const sp<Layer>& layer, const sp<Layer>& drawingParent) { 292 layer->mDrawingParent = drawingParent; 293 } 294 295 /* ------------------------------------------------------------------------ 296 * Forwarding for functions being tested 297 */ 298 createDisplay(const String8 & displayName,bool secure)299 auto createDisplay(const String8& displayName, bool secure) { 300 return mFlinger->createDisplay(displayName, secure); 301 } 302 destroyDisplay(const sp<IBinder> & displayToken)303 auto destroyDisplay(const sp<IBinder>& displayToken) { 304 return mFlinger->destroyDisplay(displayToken); 305 } 306 enableHalVirtualDisplays(bool enable)307 void enableHalVirtualDisplays(bool enable) { mFlinger->enableHalVirtualDisplays(enable); } 308 setupNewDisplayDeviceInternal(const wp<IBinder> & displayToken,std::shared_ptr<compositionengine::Display> compositionDisplay,const DisplayDeviceState & state,const sp<compositionengine::DisplaySurface> & dispSurface,const sp<IGraphicBufferProducer> & producer)309 auto setupNewDisplayDeviceInternal( 310 const wp<IBinder>& displayToken, 311 std::shared_ptr<compositionengine::Display> compositionDisplay, 312 const DisplayDeviceState& state, 313 const sp<compositionengine::DisplaySurface>& dispSurface, 314 const sp<IGraphicBufferProducer>& producer) NO_THREAD_SAFETY_ANALYSIS { 315 return mFlinger->setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state, 316 dispSurface, producer); 317 } 318 handleTransactionLocked(uint32_t transactionFlags)319 auto handleTransactionLocked(uint32_t transactionFlags) { 320 Mutex::Autolock _l(mFlinger->mStateLock); 321 return mFlinger->handleTransactionLocked(transactionFlags); 322 } 323 onComposerHalHotplug(hal::HWDisplayId hwcDisplayId,hal::Connection connection)324 void onComposerHalHotplug(hal::HWDisplayId hwcDisplayId, hal::Connection connection) { 325 mFlinger->onComposerHalHotplug(hwcDisplayId, connection); 326 } 327 setDisplayStateLocked(const DisplayState & s)328 auto setDisplayStateLocked(const DisplayState& s) { 329 Mutex::Autolock _l(mFlinger->mStateLock); 330 return mFlinger->setDisplayStateLocked(s); 331 } 332 333 // Allow reading display state without locking, as if called on the SF main thread. onInitializeDisplays()334 auto onInitializeDisplays() NO_THREAD_SAFETY_ANALYSIS { 335 return mFlinger->onInitializeDisplays(); 336 } 337 notifyPowerBoost(int32_t boostId)338 auto notifyPowerBoost(int32_t boostId) { return mFlinger->notifyPowerBoost(boostId); } 339 340 // Allow reading display state without locking, as if called on the SF main thread. setPowerModeInternal(const sp<DisplayDevice> & display,hal::PowerMode mode)341 auto setPowerModeInternal(const sp<DisplayDevice>& display, 342 hal::PowerMode mode) NO_THREAD_SAFETY_ANALYSIS { 343 return mFlinger->setPowerModeInternal(display, mode); 344 } 345 onMessageReceived(int32_t what)346 auto onMessageReceived(int32_t what) { 347 return mFlinger->onMessageReceived(what, /*vsyncId=*/0, systemTime()); 348 } 349 renderScreenImplLocked(const RenderArea & renderArea,SurfaceFlinger::TraverseLayersFunction traverseLayers,const std::shared_ptr<renderengine::ExternalTexture> & buffer,bool forSystem,bool regionSampling)350 auto renderScreenImplLocked(const RenderArea& renderArea, 351 SurfaceFlinger::TraverseLayersFunction traverseLayers, 352 const std::shared_ptr<renderengine::ExternalTexture>& buffer, 353 bool forSystem, bool regionSampling) { 354 ScreenCaptureResults captureResults; 355 return mFlinger->renderScreenImplLocked(renderArea, traverseLayers, buffer, forSystem, 356 regionSampling, false /* grayscale */, 357 captureResults); 358 } 359 traverseLayersInLayerStack(ui::LayerStack layerStack,int32_t uid,const LayerVector::Visitor & visitor)360 auto traverseLayersInLayerStack(ui::LayerStack layerStack, int32_t uid, 361 const LayerVector::Visitor& visitor) { 362 return mFlinger->SurfaceFlinger::traverseLayersInLayerStack(layerStack, uid, visitor); 363 } 364 getDisplayNativePrimaries(const sp<IBinder> & displayToken,ui::DisplayPrimaries & primaries)365 auto getDisplayNativePrimaries(const sp<IBinder>& displayToken, 366 ui::DisplayPrimaries &primaries) { 367 return mFlinger->SurfaceFlinger::getDisplayNativePrimaries(displayToken, primaries); 368 } 369 getTransactionQueue()370 auto& getTransactionQueue() { return mFlinger->mTransactionQueue; } getPendingTransactionQueue()371 auto& getPendingTransactionQueue() { return mFlinger->mPendingTransactionQueues; } 372 setTransactionState(const FrameTimelineInfo & frameTimelineInfo,const Vector<ComposerState> & states,const Vector<DisplayState> & displays,uint32_t flags,const sp<IBinder> & applyToken,const InputWindowCommands & inputWindowCommands,int64_t desiredPresentTime,bool isAutoTimestamp,const client_cache_t & uncacheBuffer,bool hasListenerCallbacks,std::vector<ListenerCallbacks> & listenerCallbacks,uint64_t transactionId)373 auto setTransactionState( 374 const FrameTimelineInfo& frameTimelineInfo, const Vector<ComposerState>& states, 375 const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, 376 const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime, 377 bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool hasListenerCallbacks, 378 std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) { 379 return mFlinger->setTransactionState(frameTimelineInfo, states, displays, flags, applyToken, 380 inputWindowCommands, desiredPresentTime, 381 isAutoTimestamp, uncacheBuffer, hasListenerCallbacks, 382 listenerCallbacks, transactionId); 383 } 384 flushTransactionQueues()385 auto flushTransactionQueues() { return mFlinger->flushTransactionQueues(); }; 386 onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)387 auto onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 388 return mFlinger->onTransact(code, data, reply, flags); 389 } 390 getGPUContextPriority()391 auto getGPUContextPriority() { return mFlinger->getGPUContextPriority(); } 392 calculateMaxAcquiredBufferCount(Fps refreshRate,std::chrono::nanoseconds presentLatency)393 auto calculateMaxAcquiredBufferCount(Fps refreshRate, 394 std::chrono::nanoseconds presentLatency) const { 395 return SurfaceFlinger::calculateMaxAcquiredBufferCount(refreshRate, presentLatency); 396 } 397 398 /* ------------------------------------------------------------------------ 399 * Read-only access to private data to assert post-conditions. 400 */ 401 getAnimFrameTracker()402 const auto& getAnimFrameTracker() const { return mFlinger->mAnimFrameTracker; } getHasPoweredOff()403 const auto& getHasPoweredOff() const { return mFlinger->mHasPoweredOff; } getVisibleRegionsDirty()404 const auto& getVisibleRegionsDirty() const { return mFlinger->mVisibleRegionsDirty; } getHwComposer()405 auto& getHwComposer() const { 406 return static_cast<impl::HWComposer&>(mFlinger->getHwComposer()); 407 } getCompositionEngine()408 auto& getCompositionEngine() const { return mFlinger->getCompositionEngine(); } 409 getCompositorTiming()410 const auto& getCompositorTiming() const { return mFlinger->getBE().mCompositorTiming; } 411 getFrameTracer()412 mock::FrameTracer* getFrameTracer() const { 413 return static_cast<mock::FrameTracer*>(mFlinger->mFrameTracer.get()); 414 } 415 416 /* ------------------------------------------------------------------------ 417 * Read-write access to private data to set up preconditions and assert 418 * post-conditions. 419 */ 420 mutableHasWideColorDisplay()421 auto& mutableHasWideColorDisplay() { return SurfaceFlinger::hasWideColorDisplay; } mutableUseColorManagement()422 auto& mutableUseColorManagement() { return SurfaceFlinger::useColorManagement; } 423 mutableCurrentState()424 auto& mutableCurrentState() { return mFlinger->mCurrentState; } mutableDisplayColorSetting()425 auto& mutableDisplayColorSetting() { return mFlinger->mDisplayColorSetting; } mutableDisplays()426 auto& mutableDisplays() { return mFlinger->mDisplays; } mutableDrawingState()427 auto& mutableDrawingState() { return mFlinger->mDrawingState; } mutableEventQueue()428 auto& mutableEventQueue() { return mFlinger->mEventQueue; } mutableGeometryInvalid()429 auto& mutableGeometryInvalid() { return mFlinger->mGeometryInvalid; } mutableInterceptor()430 auto& mutableInterceptor() { return mFlinger->mInterceptor; } mutableMainThreadId()431 auto& mutableMainThreadId() { return mFlinger->mMainThreadId; } mutablePendingHotplugEvents()432 auto& mutablePendingHotplugEvents() { return mFlinger->mPendingHotplugEvents; } mutablePhysicalDisplayTokens()433 auto& mutablePhysicalDisplayTokens() { return mFlinger->mPhysicalDisplayTokens; } mutableTexturePool()434 auto& mutableTexturePool() { return mFlinger->mTexturePool; } mutableTransactionFlags()435 auto& mutableTransactionFlags() { return mFlinger->mTransactionFlags; } mutablePowerAdvisor()436 auto& mutablePowerAdvisor() { return mFlinger->mPowerAdvisor; } mutableDebugDisableHWC()437 auto& mutableDebugDisableHWC() { return mFlinger->mDebugDisableHWC; } mutableMaxRenderTargetSize()438 auto& mutableMaxRenderTargetSize() { return mFlinger->mMaxRenderTargetSize; } 439 mutableHwcDisplayData()440 auto& mutableHwcDisplayData() { return getHwComposer().mDisplayData; } mutableHwcPhysicalDisplayIdMap()441 auto& mutableHwcPhysicalDisplayIdMap() { return getHwComposer().mPhysicalDisplayIdMap; } mutableInternalHwcDisplayId()442 auto& mutableInternalHwcDisplayId() { return getHwComposer().mInternalHwcDisplayId; } mutableExternalHwcDisplayId()443 auto& mutableExternalHwcDisplayId() { return getHwComposer().mExternalHwcDisplayId; } mutableUseFrameRateApi()444 auto& mutableUseFrameRateApi() { return mFlinger->useFrameRateApi; } mutableActiveDisplayToken()445 auto& mutableActiveDisplayToken() { return mFlinger->mActiveDisplayToken; } 446 fromHandle(const sp<IBinder> & handle)447 auto fromHandle(const sp<IBinder>& handle) { 448 return mFlinger->fromHandle(handle); 449 } 450 ~TestableSurfaceFlinger()451 ~TestableSurfaceFlinger() { 452 // All these pointer and container clears help ensure that GMock does 453 // not report a leaked object, since the SurfaceFlinger instance may 454 // still be referenced by something despite our best efforts to destroy 455 // it after each test is done. 456 mutableDisplays().clear(); 457 mutableCurrentState().displays.clear(); 458 mutableDrawingState().displays.clear(); 459 mutableEventQueue().reset(); 460 mutableInterceptor().clear(); 461 mFlinger->mScheduler.reset(); 462 mFlinger->mCompositionEngine->setHwComposer(std::unique_ptr<HWComposer>()); 463 mFlinger->mCompositionEngine->setRenderEngine( 464 std::unique_ptr<renderengine::RenderEngine>()); 465 } 466 467 /* ------------------------------------------------------------------------ 468 * Wrapper classes for Read-write access to private data to set up 469 * preconditions and assert post-conditions. 470 */ 471 struct HWC2Display : public HWC2::impl::Display { HWC2DisplayHWC2Display472 HWC2Display(Hwc2::Composer& composer, 473 const std::unordered_set<hal::Capability>& capabilities, hal::HWDisplayId id, 474 hal::DisplayType type) 475 : HWC2::impl::Display(composer, capabilities, id, type) {} ~HWC2DisplayHWC2Display476 ~HWC2Display() { 477 // Prevents a call to disable vsyncs. 478 mType = hal::DisplayType::INVALID; 479 } 480 mutableIsConnectedHWC2Display481 auto& mutableIsConnected() { return this->mIsConnected; } mutableLayersHWC2Display482 auto& mutableLayers() { return this->mLayers; } 483 }; 484 485 class FakeHwcDisplayInjector { 486 public: 487 static constexpr hal::HWDisplayId DEFAULT_HWC_DISPLAY_ID = 1000; 488 static constexpr int32_t DEFAULT_WIDTH = 1920; 489 static constexpr int32_t DEFAULT_HEIGHT = 1280; 490 static constexpr int32_t DEFAULT_VSYNC_PERIOD = 16'666'666; 491 static constexpr int32_t DEFAULT_CONFIG_GROUP = 7; 492 static constexpr int32_t DEFAULT_DPI = 320; 493 static constexpr hal::HWConfigId DEFAULT_ACTIVE_CONFIG = 0; 494 static constexpr hal::PowerMode DEFAULT_POWER_MODE = hal::PowerMode::ON; 495 FakeHwcDisplayInjector(HalDisplayId displayId,hal::DisplayType hwcDisplayType,bool isPrimary)496 FakeHwcDisplayInjector(HalDisplayId displayId, hal::DisplayType hwcDisplayType, 497 bool isPrimary) 498 : mDisplayId(displayId), mHwcDisplayType(hwcDisplayType), mIsPrimary(isPrimary) {} 499 setHwcDisplayId(hal::HWDisplayId displayId)500 auto& setHwcDisplayId(hal::HWDisplayId displayId) { 501 mHwcDisplayId = displayId; 502 return *this; 503 } 504 setWidth(int32_t width)505 auto& setWidth(int32_t width) { 506 mWidth = width; 507 return *this; 508 } 509 setHeight(int32_t height)510 auto& setHeight(int32_t height) { 511 mHeight = height; 512 return *this; 513 } 514 setVsyncPeriod(int32_t vsyncPeriod)515 auto& setVsyncPeriod(int32_t vsyncPeriod) { 516 mVsyncPeriod = vsyncPeriod; 517 return *this; 518 } 519 setDpiX(int32_t dpi)520 auto& setDpiX(int32_t dpi) { 521 mDpiX = dpi; 522 return *this; 523 } 524 setDpiY(int32_t dpi)525 auto& setDpiY(int32_t dpi) { 526 mDpiY = dpi; 527 return *this; 528 } 529 setActiveConfig(hal::HWConfigId config)530 auto& setActiveConfig(hal::HWConfigId config) { 531 mActiveConfig = config; 532 return *this; 533 } 534 setCapabilities(const std::unordered_set<hal::Capability> * capabilities)535 auto& setCapabilities(const std::unordered_set<hal::Capability>* capabilities) { 536 mCapabilities = capabilities; 537 return *this; 538 } 539 setPowerMode(hal::PowerMode mode)540 auto& setPowerMode(hal::PowerMode mode) { 541 mPowerMode = mode; 542 return *this; 543 } 544 inject(TestableSurfaceFlinger * flinger,Hwc2::mock::Composer * composer)545 void inject(TestableSurfaceFlinger* flinger, Hwc2::mock::Composer* composer) { 546 using ::testing::_; 547 using ::testing::DoAll; 548 using ::testing::Return; 549 using ::testing::SetArgPointee; 550 551 static const std::unordered_set<hal::Capability> defaultCapabilities; 552 if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities; 553 554 // Caution - Make sure that any values passed by reference here do 555 // not refer to an instance owned by FakeHwcDisplayInjector. This 556 // class has temporary lifetime, while the constructed HWC2::Display 557 // is much longer lived. 558 auto display = std::make_unique<HWC2Display>(*composer, *mCapabilities, mHwcDisplayId, 559 mHwcDisplayType); 560 561 display->mutableIsConnected() = true; 562 display->setPowerMode(mPowerMode); 563 flinger->mutableHwcDisplayData()[mDisplayId].hwcDisplay = std::move(display); 564 565 EXPECT_CALL(*composer, getDisplayConfigs(mHwcDisplayId, _)) 566 .WillRepeatedly( 567 DoAll(SetArgPointee<1>(std::vector<hal::HWConfigId>{mActiveConfig}), 568 Return(hal::Error::NONE))); 569 570 EXPECT_CALL(*composer, 571 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::WIDTH, _)) 572 .WillRepeatedly(DoAll(SetArgPointee<3>(mWidth), Return(hal::Error::NONE))); 573 574 EXPECT_CALL(*composer, 575 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::HEIGHT, 576 _)) 577 .WillRepeatedly(DoAll(SetArgPointee<3>(mHeight), Return(hal::Error::NONE))); 578 579 EXPECT_CALL(*composer, 580 getDisplayAttribute(mHwcDisplayId, mActiveConfig, 581 hal::Attribute::VSYNC_PERIOD, _)) 582 .WillRepeatedly( 583 DoAll(SetArgPointee<3>(mVsyncPeriod), Return(hal::Error::NONE))); 584 585 EXPECT_CALL(*composer, 586 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::DPI_X, _)) 587 .WillRepeatedly(DoAll(SetArgPointee<3>(mDpiX), Return(hal::Error::NONE))); 588 589 EXPECT_CALL(*composer, 590 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::DPI_Y, _)) 591 .WillRepeatedly(DoAll(SetArgPointee<3>(mDpiY), Return(hal::Error::NONE))); 592 593 EXPECT_CALL(*composer, 594 getDisplayAttribute(mHwcDisplayId, mActiveConfig, 595 hal::Attribute::CONFIG_GROUP, _)) 596 .WillRepeatedly( 597 DoAll(SetArgPointee<3>(mConfigGroup), Return(hal::Error::NONE))); 598 599 if (mHwcDisplayType == hal::DisplayType::PHYSICAL) { 600 const auto physicalId = PhysicalDisplayId::tryCast(mDisplayId); 601 LOG_ALWAYS_FATAL_IF(!physicalId); 602 flinger->mutableHwcPhysicalDisplayIdMap().emplace(mHwcDisplayId, *physicalId); 603 if (mIsPrimary) { 604 flinger->mutableInternalHwcDisplayId() = mHwcDisplayId; 605 } else { 606 // If there is an external HWC display there should always be an internal ID 607 // as well. Set it to some arbitrary value. 608 auto& internalId = flinger->mutableInternalHwcDisplayId(); 609 if (!internalId) internalId = mHwcDisplayId - 1; 610 flinger->mutableExternalHwcDisplayId() = mHwcDisplayId; 611 } 612 } 613 } 614 615 private: 616 const HalDisplayId mDisplayId; 617 const hal::DisplayType mHwcDisplayType; 618 const bool mIsPrimary; 619 620 hal::HWDisplayId mHwcDisplayId = DEFAULT_HWC_DISPLAY_ID; 621 int32_t mWidth = DEFAULT_WIDTH; 622 int32_t mHeight = DEFAULT_HEIGHT; 623 int32_t mVsyncPeriod = DEFAULT_VSYNC_PERIOD; 624 int32_t mDpiX = DEFAULT_DPI; 625 int32_t mDpiY = DEFAULT_DPI; 626 int32_t mConfigGroup = DEFAULT_CONFIG_GROUP; 627 hal::HWConfigId mActiveConfig = DEFAULT_ACTIVE_CONFIG; 628 hal::PowerMode mPowerMode = DEFAULT_POWER_MODE; 629 const std::unordered_set<hal::Capability>* mCapabilities = nullptr; 630 }; 631 632 class FakeDisplayDeviceInjector { 633 public: FakeDisplayDeviceInjector(TestableSurfaceFlinger & flinger,std::shared_ptr<compositionengine::Display> compositionDisplay,std::optional<ui::DisplayConnectionType> connectionType,std::optional<hal::HWDisplayId> hwcDisplayId,bool isPrimary)634 FakeDisplayDeviceInjector(TestableSurfaceFlinger& flinger, 635 std::shared_ptr<compositionengine::Display> compositionDisplay, 636 std::optional<ui::DisplayConnectionType> connectionType, 637 std::optional<hal::HWDisplayId> hwcDisplayId, bool isPrimary) 638 : mFlinger(flinger), 639 mCreationArgs(flinger.mFlinger.get(), flinger.mFlinger->getHwComposer(), 640 mDisplayToken, compositionDisplay), 641 mHwcDisplayId(hwcDisplayId) { 642 mCreationArgs.connectionType = connectionType; 643 mCreationArgs.isPrimary = isPrimary; 644 645 mActiveModeId = DisplayModeId(0); 646 DisplayModePtr activeMode = 647 DisplayMode::Builder(FakeHwcDisplayInjector::DEFAULT_ACTIVE_CONFIG) 648 .setId(mActiveModeId) 649 .setPhysicalDisplayId(PhysicalDisplayId(0)) 650 .setWidth(FakeHwcDisplayInjector::DEFAULT_WIDTH) 651 .setHeight(FakeHwcDisplayInjector::DEFAULT_HEIGHT) 652 .setVsyncPeriod(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD) 653 .setDpiX(FakeHwcDisplayInjector::DEFAULT_DPI) 654 .setDpiY(FakeHwcDisplayInjector::DEFAULT_DPI) 655 .setGroup(0) 656 .build(); 657 658 DisplayModes modes{activeMode}; 659 mCreationArgs.supportedModes = modes; 660 mCreationArgs.refreshRateConfigs = flinger.mRefreshRateConfigs; 661 } 662 token()663 sp<IBinder> token() const { return mDisplayToken; } 664 mutableDrawingDisplayState()665 DisplayDeviceState& mutableDrawingDisplayState() { 666 return mFlinger.mutableDrawingState().displays.editValueFor(mDisplayToken); 667 } 668 mutableCurrentDisplayState()669 DisplayDeviceState& mutableCurrentDisplayState() { 670 return mFlinger.mutableCurrentState().displays.editValueFor(mDisplayToken); 671 } 672 getDrawingDisplayState()673 const auto& getDrawingDisplayState() { 674 return mFlinger.mutableDrawingState().displays.valueFor(mDisplayToken); 675 } 676 getCurrentDisplayState()677 const auto& getCurrentDisplayState() { 678 return mFlinger.mutableCurrentState().displays.valueFor(mDisplayToken); 679 } 680 mutableDisplayDevice()681 auto& mutableDisplayDevice() { return mFlinger.mutableDisplays()[mDisplayToken]; } 682 setActiveMode(DisplayModeId mode)683 auto& setActiveMode(DisplayModeId mode) { 684 mActiveModeId = mode; 685 return *this; 686 } 687 setSupportedModes(DisplayModes mode)688 auto& setSupportedModes(DisplayModes mode) { 689 mCreationArgs.supportedModes = mode; 690 return *this; 691 } 692 setNativeWindow(const sp<ANativeWindow> & nativeWindow)693 auto& setNativeWindow(const sp<ANativeWindow>& nativeWindow) { 694 mCreationArgs.nativeWindow = nativeWindow; 695 return *this; 696 } 697 setDisplaySurface(const sp<compositionengine::DisplaySurface> & displaySurface)698 auto& setDisplaySurface(const sp<compositionengine::DisplaySurface>& displaySurface) { 699 mCreationArgs.displaySurface = displaySurface; 700 return *this; 701 } 702 setSecure(bool secure)703 auto& setSecure(bool secure) { 704 mCreationArgs.isSecure = secure; 705 return *this; 706 } 707 setPowerMode(hal::PowerMode mode)708 auto& setPowerMode(hal::PowerMode mode) { 709 mCreationArgs.initialPowerMode = mode; 710 return *this; 711 } 712 setHwcColorModes(const std::unordered_map<ui::ColorMode,std::vector<ui::RenderIntent>> hwcColorModes)713 auto& setHwcColorModes( 714 const std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>> 715 hwcColorModes) { 716 mCreationArgs.hwcColorModes = hwcColorModes; 717 return *this; 718 } 719 setHasWideColorGamut(bool hasWideColorGamut)720 auto& setHasWideColorGamut(bool hasWideColorGamut) { 721 mCreationArgs.hasWideColorGamut = hasWideColorGamut; 722 return *this; 723 } 724 setPhysicalOrientation(ui::Rotation orientation)725 auto& setPhysicalOrientation(ui::Rotation orientation) { 726 mCreationArgs.physicalOrientation = orientation; 727 return *this; 728 } 729 inject()730 sp<DisplayDevice> inject() NO_THREAD_SAFETY_ANALYSIS { 731 const auto displayId = mCreationArgs.compositionDisplay->getDisplayId(); 732 733 DisplayDeviceState state; 734 if (const auto type = mCreationArgs.connectionType) { 735 LOG_ALWAYS_FATAL_IF(!displayId); 736 const auto physicalId = PhysicalDisplayId::tryCast(*displayId); 737 LOG_ALWAYS_FATAL_IF(!physicalId); 738 LOG_ALWAYS_FATAL_IF(!mHwcDisplayId); 739 state.physical = {.id = *physicalId, .type = *type, .hwcDisplayId = *mHwcDisplayId}; 740 } 741 742 state.isSecure = mCreationArgs.isSecure; 743 744 sp<DisplayDevice> device = new DisplayDevice(mCreationArgs); 745 if (!device->isVirtual()) { 746 device->setActiveMode(mActiveModeId); 747 } 748 mFlinger.mutableDisplays().emplace(mDisplayToken, device); 749 mFlinger.mutableCurrentState().displays.add(mDisplayToken, state); 750 mFlinger.mutableDrawingState().displays.add(mDisplayToken, state); 751 752 if (const auto& physical = state.physical) { 753 mFlinger.mutablePhysicalDisplayTokens()[physical->id] = mDisplayToken; 754 } 755 756 return device; 757 } 758 759 private: 760 TestableSurfaceFlinger& mFlinger; 761 sp<BBinder> mDisplayToken = new BBinder(); 762 DisplayDeviceCreationArgs mCreationArgs; 763 const std::optional<hal::HWDisplayId> mHwcDisplayId; 764 DisplayModeId mActiveModeId; 765 }; 766 767 private: setVsyncEnabled(bool)768 void setVsyncEnabled(bool) override {} changeRefreshRate(const Scheduler::RefreshRate &,Scheduler::ModeEvent)769 void changeRefreshRate(const Scheduler::RefreshRate&, Scheduler::ModeEvent) override {} repaintEverythingForHWC()770 void repaintEverythingForHWC() override {} kernelTimerChanged(bool)771 void kernelTimerChanged(bool) override {} triggerOnFrameRateOverridesChanged()772 void triggerOnFrameRateOverridesChanged() {} 773 774 surfaceflinger::test::Factory mFactory; 775 sp<SurfaceFlinger> mFlinger = new SurfaceFlinger(mFactory, SurfaceFlinger::SkipInitialization); 776 TestableScheduler* mScheduler = nullptr; 777 std::shared_ptr<scheduler::RefreshRateConfigs> mRefreshRateConfigs; 778 }; 779 780 } // namespace android 781