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 <chrono> 20 #include <memory> 21 #include <variant> 22 23 #include <ftl/fake_guard.h> 24 #include <ftl/match.h> 25 #include <gui/LayerMetadata.h> 26 #include <gui/ScreenCaptureResults.h> 27 #include <ui/DynamicDisplayInfo.h> 28 29 #include <compositionengine/Display.h> 30 #include <compositionengine/LayerFECompositionState.h> 31 #include <compositionengine/OutputLayer.h> 32 #include <compositionengine/impl/CompositionEngine.h> 33 #include <compositionengine/impl/Display.h> 34 #include <compositionengine/impl/OutputLayerCompositionState.h> 35 #include <compositionengine/mock/DisplaySurface.h> 36 37 #include "DisplayDevice.h" 38 #include "FakeVsyncConfiguration.h" 39 #include "FrameTracer/FrameTracer.h" 40 #include "FrontEnd/LayerCreationArgs.h" 41 #include "FrontEnd/LayerHandle.h" 42 #include "FrontEnd/RequestedLayerState.h" 43 #include "Layer.h" 44 #include "NativeWindowSurface.h" 45 #include "RenderArea.h" 46 #include "Scheduler/RefreshRateSelector.h" 47 #include "Scheduler/VSyncTracker.h" 48 #include "Scheduler/VsyncController.h" 49 #include "SurfaceFlinger.h" 50 #include "TestableScheduler.h" 51 #include "android/gui/ISurfaceComposerClient.h" 52 53 #include "mock/DisplayHardware/MockComposer.h" 54 #include "mock/DisplayHardware/MockDisplayMode.h" 55 #include "mock/MockEventThread.h" 56 #include "mock/MockFrameTimeline.h" 57 #include "mock/MockFrameTracer.h" 58 #include "mock/MockSchedulerCallback.h" 59 #include "mock/MockVSyncTracker.h" 60 #include "mock/MockVsyncController.h" 61 #include "mock/PowerAdvisor/MockPowerAdvisor.h" 62 #include "mock/system/window/MockNativeWindow.h" 63 64 namespace android { 65 66 struct DisplayStatInfo; 67 68 namespace renderengine { 69 70 class RenderEngine; 71 72 } // namespace renderengine 73 74 namespace Hwc2 { 75 76 class Composer; 77 78 } // namespace Hwc2 79 80 namespace hal = android::hardware::graphics::composer::hal; 81 82 namespace surfaceflinger::test { 83 84 class Factory final : public surfaceflinger::Factory { 85 public: 86 ~Factory() = default; 87 createHWComposer(const std::string &)88 std::unique_ptr<HWComposer> createHWComposer(const std::string&) override { return nullptr; } 89 createVsyncConfiguration(Fps)90 std::unique_ptr<scheduler::VsyncConfiguration> createVsyncConfiguration( 91 Fps /*currentRefreshRate*/) override { 92 return std::make_unique<scheduler::FakePhaseOffsets>(); 93 } 94 createDisplayDevice(DisplayDeviceCreationArgs & creationArgs)95 sp<DisplayDevice> createDisplayDevice(DisplayDeviceCreationArgs& creationArgs) override { 96 return sp<DisplayDevice>::make(creationArgs); 97 } 98 createGraphicBuffer(uint32_t width,uint32_t height,PixelFormat format,uint32_t layerCount,uint64_t usage,std::string requestorName)99 sp<GraphicBuffer> createGraphicBuffer(uint32_t width, uint32_t height, PixelFormat format, 100 uint32_t layerCount, uint64_t usage, 101 std::string requestorName) override { 102 return sp<GraphicBuffer>::make(width, height, format, layerCount, usage, requestorName); 103 } 104 createBufferQueue(sp<IGraphicBufferProducer> * outProducer,sp<IGraphicBufferConsumer> * outConsumer,bool consumerIsSurfaceFlinger)105 void createBufferQueue(sp<IGraphicBufferProducer>* outProducer, 106 sp<IGraphicBufferConsumer>* outConsumer, 107 bool consumerIsSurfaceFlinger) override { 108 if (!mCreateBufferQueue) { 109 BufferQueue::createBufferQueue(outProducer, outConsumer, consumerIsSurfaceFlinger); 110 return; 111 } 112 mCreateBufferQueue(outProducer, outConsumer, consumerIsSurfaceFlinger); 113 } 114 createNativeWindowSurface(const sp<IGraphicBufferProducer> & producer)115 std::unique_ptr<surfaceflinger::NativeWindowSurface> createNativeWindowSurface( 116 const sp<IGraphicBufferProducer>& producer) override { 117 if (!mCreateNativeWindowSurface) return nullptr; 118 return mCreateNativeWindowSurface(producer); 119 } 120 createCompositionEngine()121 std::unique_ptr<compositionengine::CompositionEngine> createCompositionEngine() override { 122 return compositionengine::impl::createCompositionEngine(); 123 } 124 createBufferStateLayer(const LayerCreationArgs &)125 sp<Layer> createBufferStateLayer(const LayerCreationArgs&) override { return nullptr; } 126 createEffectLayer(const LayerCreationArgs &)127 sp<Layer> createEffectLayer(const LayerCreationArgs&) override { return nullptr; } 128 createLayerFE(const std::string & layerName,const Layer *)129 sp<LayerFE> createLayerFE(const std::string& layerName, const Layer* /* owner */) override { 130 return sp<LayerFE>::make(layerName); 131 } 132 createFrameTracer()133 std::unique_ptr<FrameTracer> createFrameTracer() override { 134 return std::make_unique<mock::FrameTracer>(); 135 } 136 137 std::unique_ptr<frametimeline::FrameTimeline> createFrameTimeline( 138 std::shared_ptr<TimeStats> timeStats, pid_t surfaceFlingerPid = 0) override { 139 return std::make_unique<mock::FrameTimeline>(timeStats, surfaceFlingerPid); 140 } 141 142 using CreateBufferQueueFunction = 143 std::function<void(sp<IGraphicBufferProducer>* /* outProducer */, 144 sp<IGraphicBufferConsumer>* /* outConsumer */, 145 bool /* consumerIsSurfaceFlinger */)>; 146 CreateBufferQueueFunction mCreateBufferQueue; 147 148 using CreateNativeWindowSurfaceFunction = 149 std::function<std::unique_ptr<surfaceflinger::NativeWindowSurface>( 150 const sp<IGraphicBufferProducer>&)>; 151 CreateNativeWindowSurfaceFunction mCreateNativeWindowSurface; 152 153 using CreateCompositionEngineFunction = 154 std::function<std::unique_ptr<compositionengine::CompositionEngine>()>; 155 CreateCompositionEngineFunction mCreateCompositionEngine; 156 }; 157 158 struct MockSchedulerOptions { 159 PhysicalDisplayId displayId = PhysicalDisplayId::fromPort(0); 160 bool useNiceMock = false; 161 }; 162 163 } // namespace surfaceflinger::test 164 165 class TestableSurfaceFlinger { 166 public: 167 using HotplugEvent = SurfaceFlinger::HotplugEvent; 168 mFlinger(flinger)169 TestableSurfaceFlinger(sp<SurfaceFlinger> flinger = nullptr) : mFlinger(flinger) { 170 if (!mFlinger) { 171 mFlinger = sp<SurfaceFlinger>::make(mFactory, SurfaceFlinger::SkipInitialization); 172 } 173 } 174 flinger()175 SurfaceFlinger* flinger() { return mFlinger.get(); } scheduler()176 scheduler::TestableScheduler* scheduler() { return mScheduler; } 177 178 // Extend this as needed for accessing SurfaceFlinger private (and public) 179 // functions. 180 setupRenderEngine(std::unique_ptr<renderengine::RenderEngine> renderEngine)181 void setupRenderEngine(std::unique_ptr<renderengine::RenderEngine> renderEngine) { 182 mFlinger->mRenderEngine = std::move(renderEngine); 183 mFlinger->mCompositionEngine->setRenderEngine(mFlinger->mRenderEngine.get()); 184 } 185 setupComposer(std::unique_ptr<Hwc2::Composer> composer)186 void setupComposer(std::unique_ptr<Hwc2::Composer> composer) { 187 mFlinger->mCompositionEngine->setHwComposer( 188 std::make_unique<impl::HWComposer>(std::move(composer))); 189 mFlinger->mDisplayModeController.setHwComposer( 190 &mFlinger->mCompositionEngine->getHwComposer()); 191 } 192 setupPowerAdvisor(std::unique_ptr<adpf::PowerAdvisor> powerAdvisor)193 void setupPowerAdvisor(std::unique_ptr<adpf::PowerAdvisor> powerAdvisor) { 194 mFlinger->mPowerAdvisor = std::move(powerAdvisor); 195 } 196 setupTimeStats(const std::shared_ptr<TimeStats> & timeStats)197 void setupTimeStats(const std::shared_ptr<TimeStats>& timeStats) { 198 mFlinger->mCompositionEngine->setTimeStats(timeStats); 199 } 200 setupCompositionEngine(std::unique_ptr<compositionengine::CompositionEngine> compositionEngine)201 void setupCompositionEngine( 202 std::unique_ptr<compositionengine::CompositionEngine> compositionEngine) { 203 mFlinger->mCompositionEngine = std::move(compositionEngine); 204 } 205 206 enum class SchedulerCallbackImpl { kNoOp, kMock }; 207 208 struct DefaultDisplayMode { 209 // The ID of the injected RefreshRateSelector and its default display mode. 210 PhysicalDisplayId displayId; 211 }; 212 213 using RefreshRateSelectorPtr = scheduler::Scheduler::RefreshRateSelectorPtr; 214 215 using DisplayModesVariant = std::variant<DefaultDisplayMode, RefreshRateSelectorPtr>; 216 getFactory()217 surfaceflinger::Factory& getFactory() { return mFactory; } 218 getTimeStats()219 TimeStats& getTimeStats() { return *mFlinger->mTimeStats; } 220 221 void setupScheduler(std::unique_ptr<scheduler::VsyncController> vsyncController, 222 std::shared_ptr<scheduler::VSyncTracker> vsyncTracker, 223 std::unique_ptr<EventThread> appEventThread, 224 std::unique_ptr<EventThread> sfEventThread, 225 DisplayModesVariant modesVariant, 226 SchedulerCallbackImpl callbackImpl = SchedulerCallbackImpl::kNoOp, 227 bool useNiceMock = false) { 228 RefreshRateSelectorPtr selectorPtr = ftl::match( 229 modesVariant, 230 [](DefaultDisplayMode arg) { 231 constexpr DisplayModeId kModeId60{0}; 232 return std::make_shared<scheduler::RefreshRateSelector>( 233 makeModes(mock::createDisplayMode(arg.displayId, kModeId60, 60_Hz)), 234 kModeId60); 235 }, 236 [](RefreshRateSelectorPtr selectorPtr) { return selectorPtr; }); 237 238 mTokenManager = std::make_unique<frametimeline::impl::TokenManager>(); 239 240 using ISchedulerCallback = scheduler::ISchedulerCallback; 241 ISchedulerCallback& schedulerCallback = callbackImpl == SchedulerCallbackImpl::kNoOp 242 ? static_cast<ISchedulerCallback&>(mNoOpSchedulerCallback) 243 : static_cast<ISchedulerCallback&>(mSchedulerCallback); 244 245 if (useNiceMock) { 246 mScheduler = 247 new testing::NiceMock<scheduler::TestableScheduler>(std::move(vsyncController), 248 std::move(vsyncTracker), 249 std::move(selectorPtr), 250 mFactory, 251 *mFlinger->mTimeStats, 252 schedulerCallback); 253 } else { 254 mScheduler = new scheduler::TestableScheduler(std::move(vsyncController), 255 std::move(vsyncTracker), 256 std::move(selectorPtr), mFactory, 257 *mFlinger->mTimeStats, schedulerCallback); 258 } 259 260 mScheduler->initVsync(*mTokenManager, 0ms); 261 262 mScheduler->setEventThread(scheduler::Cycle::Render, std::move(appEventThread)); 263 mScheduler->setEventThread(scheduler::Cycle::LastComposite, std::move(sfEventThread)); 264 265 resetScheduler(mScheduler); 266 } 267 268 void setupMockScheduler(surfaceflinger::test::MockSchedulerOptions options = {}) { 269 using testing::_; 270 using testing::Return; 271 272 auto eventThread = makeMock<mock::EventThread>(options.useNiceMock); 273 auto sfEventThread = makeMock<mock::EventThread>(options.useNiceMock); 274 auto vsyncController = makeMock<mock::VsyncController>(options.useNiceMock); 275 auto vsyncTracker = makeSharedMock<mock::VSyncTracker>(options.useNiceMock); 276 277 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_, _)).WillRepeatedly(Return(0)); 278 EXPECT_CALL(*vsyncTracker, currentPeriod()) 279 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD)); 280 EXPECT_CALL(*vsyncTracker, minFramePeriod()) 281 .WillRepeatedly( 282 Return(Period::fromNs(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD))); 283 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_, _)).WillRepeatedly(Return(0)); 284 setupScheduler(std::move(vsyncController), std::move(vsyncTracker), std::move(eventThread), 285 std::move(sfEventThread), DefaultDisplayMode{options.displayId}, 286 SchedulerCallbackImpl::kNoOp, options.useNiceMock); 287 } 288 resetScheduler(scheduler::Scheduler * scheduler)289 void resetScheduler(scheduler::Scheduler* scheduler) { mFlinger->mScheduler.reset(scheduler); } 290 mutableScheduler()291 scheduler::TestableScheduler& mutableScheduler() { return *mScheduler; } mockSchedulerCallback()292 scheduler::mock::SchedulerCallback& mockSchedulerCallback() { return mSchedulerCallback; } 293 294 using CreateBufferQueueFunction = surfaceflinger::test::Factory::CreateBufferQueueFunction; setCreateBufferQueueFunction(CreateBufferQueueFunction f)295 void setCreateBufferQueueFunction(CreateBufferQueueFunction f) { 296 mFactory.mCreateBufferQueue = f; 297 } 298 299 using CreateNativeWindowSurfaceFunction = 300 surfaceflinger::test::Factory::CreateNativeWindowSurfaceFunction; setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f)301 void setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f) { 302 mFactory.mCreateNativeWindowSurface = f; 303 } 304 setInternalDisplayPrimaries(const ui::DisplayPrimaries & primaries)305 void setInternalDisplayPrimaries(const ui::DisplayPrimaries& primaries) { 306 memcpy(&mFlinger->mInternalDisplayPrimaries, &primaries, sizeof(ui::DisplayPrimaries)); 307 } 308 mutableLayerDrawingState(const sp<Layer> & layer)309 static auto& mutableLayerDrawingState(const sp<Layer>& layer) { return layer->mDrawingState; } 310 mutableStateLock()311 auto& mutableStateLock() { return mFlinger->mStateLock; } 312 findOutputLayerForDisplay(uint32_t layerId,const sp<const DisplayDevice> & display)313 compositionengine::OutputLayer* findOutputLayerForDisplay( 314 uint32_t layerId, const sp<const DisplayDevice>& display) { 315 ftl::FakeGuard guard(kMainThreadContext); 316 if (mFlinger->mLegacyLayers.find(layerId) == mFlinger->mLegacyLayers.end()) { 317 return nullptr; 318 } 319 return mFlinger->mLegacyLayers[layerId]->findOutputLayerForDisplay(display.get()); 320 } 321 setLayerCompositionType(const sp<Layer> & layer,aidl::android::hardware::graphics::composer3::Composition type)322 void setLayerCompositionType(const sp<Layer>& layer, 323 aidl::android::hardware::graphics::composer3::Composition type) { 324 auto outputLayer = findOutputLayerForDisplay(static_cast<uint32_t>(layer->sequence), 325 mFlinger->getDefaultDisplayDevice()); 326 LOG_ALWAYS_FATAL_IF(!outputLayer); 327 auto& state = outputLayer->editState(); 328 LOG_ALWAYS_FATAL_IF(!outputLayer->getState().hwc); 329 (*state.hwc).hwcCompositionType = type; 330 } 331 332 /* ------------------------------------------------------------------------ 333 * Forwarding for functions being tested 334 */ 335 configure()336 void configure() { 337 ftl::FakeGuard guard(kMainThreadContext); 338 mFlinger->configure(); 339 } 340 configureAndCommit()341 void configureAndCommit() { 342 configure(); 343 commitTransactionsLocked(eDisplayTransactionNeeded); 344 } 345 346 void commit(TimePoint frameTime, VsyncId vsyncId, TimePoint expectedVsyncTime, 347 bool composite = false) { 348 ftl::FakeGuard guard(kMainThreadContext); 349 350 const auto displayIdOpt = mScheduler->pacesetterDisplayId(); 351 LOG_ALWAYS_FATAL_IF(!displayIdOpt); 352 const auto displayId = *displayIdOpt; 353 354 scheduler::FrameTargeter frameTargeter(displayId, 355 scheduler::Feature::kBackpressureGpuComposition); 356 357 frameTargeter.beginFrame({.frameBeginTime = frameTime, 358 .vsyncId = vsyncId, 359 .expectedVsyncTime = expectedVsyncTime, 360 .sfWorkDuration = 10ms, 361 .hwcMinWorkDuration = 10ms}, 362 *mScheduler->getVsyncSchedule()); 363 364 scheduler::FrameTargets targets; 365 scheduler::FrameTargeters targeters; 366 367 for (const auto& [id, display] : 368 FTL_FAKE_GUARD(mFlinger->mStateLock, mFlinger->mPhysicalDisplays)) { 369 targets.try_emplace(id, &frameTargeter.target()); 370 targeters.try_emplace(id, &frameTargeter); 371 } 372 mFlinger->setTransactionFlags(eTransactionFlushNeeded); 373 mFlinger->commit(displayId, targets); 374 375 if (composite) { 376 mFlinger->composite(displayId, targeters); 377 } 378 } 379 380 void commit(TimePoint frameTime, VsyncId vsyncId, bool composite = false) { 381 return commit(frameTime, vsyncId, frameTime + Period(10ms), composite); 382 } 383 384 void commit(bool composite = false) { 385 const TimePoint frameTime = scheduler::SchedulerClock::now(); 386 commit(frameTime, kVsyncId, composite); 387 } 388 commitAndComposite(TimePoint frameTime,VsyncId vsyncId,TimePoint expectedVsyncTime)389 void commitAndComposite(TimePoint frameTime, VsyncId vsyncId, TimePoint expectedVsyncTime) { 390 constexpr bool kComposite = true; 391 commit(frameTime, vsyncId, expectedVsyncTime, kComposite); 392 } 393 commitAndComposite()394 void commitAndComposite() { 395 constexpr bool kComposite = true; 396 commit(kComposite); 397 } 398 399 auto createVirtualDisplay(const std::string& displayName, bool isSecure, 400 float requestedRefreshRate = 0.0f) { 401 static const std::string kTestId = 402 "virtual:libsurfaceflinger_unittest:TestableSurfaceFlinger"; 403 return mFlinger->createVirtualDisplay(displayName, isSecure, kTestId, requestedRefreshRate); 404 } 405 406 auto createVirtualDisplay(const std::string& displayName, bool isSecure, 407 const std::string& uniqueId, float requestedRefreshRate = 0.0f) { 408 return mFlinger->createVirtualDisplay(displayName, isSecure, uniqueId, 409 requestedRefreshRate); 410 } 411 destroyVirtualDisplay(const sp<IBinder> & displayToken)412 auto destroyVirtualDisplay(const sp<IBinder>& displayToken) { 413 return mFlinger->destroyVirtualDisplay(displayToken); 414 } 415 getDisplay(const sp<IBinder> & displayToken)416 auto getDisplay(const sp<IBinder>& displayToken) { 417 Mutex::Autolock lock(mFlinger->mStateLock); 418 return mFlinger->getDisplayDeviceLocked(displayToken); 419 } 420 enableHalVirtualDisplays(bool enable)421 void enableHalVirtualDisplays(bool enable) { mFlinger->enableHalVirtualDisplays(enable); } 422 setupNewDisplayDeviceInternal(const wp<IBinder> & displayToken,std::shared_ptr<compositionengine::Display> compositionDisplay,const DisplayDeviceState & state,const sp<compositionengine::DisplaySurface> & dispSurface,const sp<IGraphicBufferProducer> & producer)423 auto setupNewDisplayDeviceInternal( 424 const wp<IBinder>& displayToken, 425 std::shared_ptr<compositionengine::Display> compositionDisplay, 426 const DisplayDeviceState& state, 427 const sp<compositionengine::DisplaySurface>& dispSurface, 428 const sp<IGraphicBufferProducer>& producer) NO_THREAD_SAFETY_ANALYSIS { 429 return mFlinger->setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state, 430 dispSurface, producer); 431 } 432 commitTransactionsLocked(uint32_t transactionFlags)433 void commitTransactionsLocked(uint32_t transactionFlags) { 434 Mutex::Autolock lock(mFlinger->mStateLock); 435 ftl::FakeGuard guard(kMainThreadContext); 436 mFlinger->processDisplayChangesLocked(); 437 mFlinger->commitTransactionsLocked(transactionFlags); 438 } 439 onComposerHalHotplugEvent(hal::HWDisplayId hwcDisplayId,DisplayHotplugEvent event)440 void onComposerHalHotplugEvent(hal::HWDisplayId hwcDisplayId, DisplayHotplugEvent event) { 441 mFlinger->onComposerHalHotplugEvent(hwcDisplayId, event); 442 } 443 setDisplayStateLocked(const DisplayState & s)444 auto setDisplayStateLocked(const DisplayState& s) { 445 Mutex::Autolock lock(mFlinger->mStateLock); 446 return mFlinger->setDisplayStateLocked(s); 447 } 448 initializeDisplays()449 void initializeDisplays() FTL_FAKE_GUARD(kMainThreadContext) { mFlinger->initializeDisplays(); } 450 notifyPowerBoost(int32_t boostId)451 auto notifyPowerBoost(int32_t boostId) { return mFlinger->notifyPowerBoost(boostId); } 452 setDisplayBrightness(const sp<IBinder> & display,const gui::DisplayBrightness & brightness)453 auto setDisplayBrightness(const sp<IBinder>& display, 454 const gui::DisplayBrightness& brightness) { 455 return mFlinger->setDisplayBrightness(display, brightness); 456 } 457 458 // Allow reading display state without locking, as if called on the SF main thread. setPowerModeInternal(const sp<DisplayDevice> & display,hal::PowerMode mode)459 auto setPowerModeInternal(const sp<DisplayDevice>& display, 460 hal::PowerMode mode) NO_THREAD_SAFETY_ANALYSIS { 461 return mFlinger->setPowerModeInternal(display, mode); 462 } 463 renderScreenImpl(const sp<DisplayDevice> display,std::unique_ptr<const RenderArea> renderArea,SurfaceFlinger::GetLayerSnapshotsFunction getLayerSnapshotsFn,const std::shared_ptr<renderengine::ExternalTexture> & buffer,bool regionSampling)464 auto renderScreenImpl(const sp<DisplayDevice> display, 465 std::unique_ptr<const RenderArea> renderArea, 466 SurfaceFlinger::GetLayerSnapshotsFunction getLayerSnapshotsFn, 467 const std::shared_ptr<renderengine::ExternalTexture>& buffer, 468 bool regionSampling) { 469 Mutex::Autolock lock(mFlinger->mStateLock); 470 ftl::FakeGuard guard(kMainThreadContext); 471 472 ScreenCaptureResults captureResults; 473 auto displayState = std::optional{display->getCompositionDisplay()->getState()}; 474 auto layers = getLayerSnapshotsFn(); 475 476 return mFlinger->renderScreenImpl(renderArea.get(), buffer, regionSampling, 477 false /* grayscale */, false /* isProtected */, 478 captureResults, displayState, layers); 479 } 480 getLayerSnapshotsForScreenshotsFn(ui::LayerStack layerStack,uint32_t uid)481 auto getLayerSnapshotsForScreenshotsFn(ui::LayerStack layerStack, uint32_t uid) { 482 return mFlinger->getLayerSnapshotsForScreenshots(layerStack, uid, 483 std::unordered_set<uint32_t>{}); 484 } 485 getDisplayNativePrimaries(const sp<IBinder> & displayToken,ui::DisplayPrimaries & primaries)486 auto getDisplayNativePrimaries(const sp<IBinder>& displayToken, 487 ui::DisplayPrimaries& primaries) { 488 return mFlinger->SurfaceFlinger::getDisplayNativePrimaries(displayToken, primaries); 489 } 490 getTransactionQueue()491 auto& getTransactionQueue() NO_THREAD_SAFETY_ANALYSIS { 492 return mFlinger->mTransactionHandler.mLocklessTransactionQueue; 493 } getPendingTransactionQueue()494 auto& getPendingTransactionQueue() NO_THREAD_SAFETY_ANALYSIS { 495 ftl::FakeGuard guard(kMainThreadContext); 496 return mFlinger->mTransactionHandler.mPendingTransactionQueues; 497 } getPendingTransactionCount()498 size_t getPendingTransactionCount() { 499 ftl::FakeGuard guard(kMainThreadContext); 500 return mFlinger->mTransactionHandler.mPendingTransactionCount.load(); 501 } 502 setTransactionState(const FrameTimelineInfo & frameTimelineInfo,Vector<ComposerState> & states,Vector<DisplayState> & displays,uint32_t flags,const sp<IBinder> & applyToken,const InputWindowCommands & inputWindowCommands,int64_t desiredPresentTime,bool isAutoTimestamp,const std::vector<client_cache_t> & uncacheBuffers,bool hasListenerCallbacks,std::vector<ListenerCallbacks> & listenerCallbacks,uint64_t transactionId,const std::vector<uint64_t> & mergedTransactionIds)503 auto setTransactionState( 504 const FrameTimelineInfo& frameTimelineInfo, Vector<ComposerState>& states, 505 Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, 506 const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime, 507 bool isAutoTimestamp, const std::vector<client_cache_t>& uncacheBuffers, 508 bool hasListenerCallbacks, std::vector<ListenerCallbacks>& listenerCallbacks, 509 uint64_t transactionId, const std::vector<uint64_t>& mergedTransactionIds) { 510 return mFlinger->setTransactionState(frameTimelineInfo, states, displays, flags, applyToken, 511 inputWindowCommands, desiredPresentTime, 512 isAutoTimestamp, uncacheBuffers, hasListenerCallbacks, 513 listenerCallbacks, transactionId, 514 mergedTransactionIds); 515 } 516 setTransactionStateInternal(TransactionState & transaction)517 auto setTransactionStateInternal(TransactionState& transaction) { 518 return FTL_FAKE_GUARD(kMainThreadContext, 519 mFlinger->mTransactionHandler.queueTransaction( 520 std::move(transaction))); 521 } 522 flushTransactionQueues()523 auto flushTransactionQueues() { 524 return FTL_FAKE_GUARD(kMainThreadContext, mFlinger->flushTransactionQueues()); 525 } 526 onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)527 auto onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 528 return mFlinger->onTransact(code, data, reply, flags); 529 } 530 getGpuContextPriority()531 auto getGpuContextPriority() { return mFlinger->getGpuContextPriority(); } 532 calculateMaxAcquiredBufferCount(Fps refreshRate,std::chrono::nanoseconds presentLatency)533 auto calculateMaxAcquiredBufferCount(Fps refreshRate, 534 std::chrono::nanoseconds presentLatency) const { 535 return SurfaceFlinger::calculateMaxAcquiredBufferCount(refreshRate, presentLatency); 536 } 537 setDesiredDisplayModeSpecs(const sp<IBinder> & displayToken,const gui::DisplayModeSpecs & specs)538 auto setDesiredDisplayModeSpecs(const sp<IBinder>& displayToken, 539 const gui::DisplayModeSpecs& specs) { 540 return mFlinger->setDesiredDisplayModeSpecs(displayToken, specs); 541 } 542 onActiveDisplayChanged(const DisplayDevice * inactiveDisplayPtr,const DisplayDevice & activeDisplay)543 void onActiveDisplayChanged(const DisplayDevice* inactiveDisplayPtr, 544 const DisplayDevice& activeDisplay) { 545 Mutex::Autolock lock(mFlinger->mStateLock); 546 ftl::FakeGuard guard(kMainThreadContext); 547 mFlinger->onActiveDisplayChangedLocked(inactiveDisplayPtr, activeDisplay); 548 } 549 createLayer(LayerCreationArgs & args,const sp<IBinder> & parentHandle,gui::CreateSurfaceResult & outResult)550 auto createLayer(LayerCreationArgs& args, const sp<IBinder>& parentHandle, 551 gui::CreateSurfaceResult& outResult) { 552 args.parentHandle = parentHandle; 553 return mFlinger->createLayer(args, outResult); 554 } 555 mirrorLayer(const LayerCreationArgs & args,const sp<IBinder> & mirrorFromHandle,gui::CreateSurfaceResult & outResult)556 auto mirrorLayer(const LayerCreationArgs& args, const sp<IBinder>& mirrorFromHandle, 557 gui::CreateSurfaceResult& outResult) { 558 return mFlinger->mirrorLayer(args, mirrorFromHandle, outResult); 559 } 560 getDynamicDisplayInfoFromToken(const sp<IBinder> & displayToken,ui::DynamicDisplayInfo * dynamicDisplayInfo)561 void getDynamicDisplayInfoFromToken(const sp<IBinder>& displayToken, 562 ui::DynamicDisplayInfo* dynamicDisplayInfo) { 563 mFlinger->getDynamicDisplayInfoFromToken(displayToken, dynamicDisplayInfo); 564 } 565 createVirtualDisplayDevice(const sp<IBinder> displayToken,VirtualDisplayId displayId,float requestedRefreshRate)566 sp<DisplayDevice> createVirtualDisplayDevice(const sp<IBinder> displayToken, 567 VirtualDisplayId displayId, 568 float requestedRefreshRate) { 569 constexpr ui::Size kResolution = {1080, 1920}; 570 auto compositionDisplay = compositionengine::impl:: 571 createDisplay(mFlinger->getCompositionEngine(), 572 compositionengine::DisplayCreationArgsBuilder() 573 .setId(displayId) 574 .setPixels(kResolution) 575 .setPowerAdvisor(&mPowerAdvisor) 576 .build()); 577 DisplayDeviceCreationArgs creationArgs(mFlinger, mFlinger->getHwComposer(), displayToken, 578 compositionDisplay); 579 creationArgs.requestedRefreshRate = Fps::fromValue(requestedRefreshRate); 580 creationArgs.nativeWindow = sp<mock::NativeWindow>::make(); 581 return sp<DisplayDevice>::make(creationArgs); 582 } 583 getDisplayStats(const sp<IBinder> & displayToken,DisplayStatInfo * outInfo)584 status_t getDisplayStats(const sp<IBinder>& displayToken, DisplayStatInfo* outInfo) { 585 return mFlinger->getDisplayStats(displayToken, outInfo); 586 } 587 588 // Used to add a layer before updateLayerSnapshots is called. 589 // Must have transactionsFlushed enabled for the new layer to be updated. addLayer(std::unique_ptr<frontend::RequestedLayerState> & layer)590 void addLayer(std::unique_ptr<frontend::RequestedLayerState>& layer) { 591 std::scoped_lock<std::mutex> lock(mFlinger->mCreatedLayersLock); 592 mFlinger->mNewLayers.emplace_back(std::move(layer)); 593 } 594 595 // Used to add a layer before updateLayerSnapshots is called. 596 // Must have transactionsFlushed enabled for the new layer to be updated. addLayer(uint32_t layerId)597 void addLayer(uint32_t layerId) { 598 std::scoped_lock<std::mutex> lock(mFlinger->mCreatedLayersLock); 599 LayerCreationArgs args(std::make_optional(layerId)); 600 args.flinger = this->mFlinger.get(); 601 auto layer = std::make_unique<frontend::RequestedLayerState>(args); 602 auto legacyLayer = sp<Layer>::make(args); 603 injectLegacyLayer(legacyLayer); 604 mFlinger->mNewLayers.emplace_back(std::move(layer)); 605 } 606 607 /* ------------------------------------------------------------------------ 608 * Read-only access to private data to assert post-conditions. 609 */ 610 getVisibleRegionsDirty()611 const auto& getVisibleRegionsDirty() const { return mFlinger->mVisibleRegionsDirty; } getHwComposer()612 auto& getHwComposer() const { 613 return static_cast<impl::HWComposer&>(mFlinger->getHwComposer()); 614 } getCompositionEngine()615 auto& getCompositionEngine() const { return mFlinger->getCompositionEngine(); } 616 getFrameTracer()617 mock::FrameTracer* getFrameTracer() const { 618 return static_cast<mock::FrameTracer*>(mFlinger->mFrameTracer.get()); 619 } 620 injectLegacyLayer(sp<Layer> layer)621 void injectLegacyLayer(sp<Layer> layer) { 622 FTL_FAKE_GUARD(kMainThreadContext, 623 mFlinger->mLegacyLayers[static_cast<uint32_t>(layer->sequence)] = layer); 624 } 625 releaseLegacyLayer(uint32_t sequence)626 void releaseLegacyLayer(uint32_t sequence) { 627 FTL_FAKE_GUARD(kMainThreadContext, mFlinger->mLegacyLayers.erase(sequence)); 628 } 629 getLegacyLayer(uint32_t layerId)630 auto getLegacyLayer(uint32_t layerId) { 631 ftl::FakeGuard guard(kMainThreadContext); 632 return mFlinger->mLegacyLayers[layerId]; 633 }; 634 destroyAllLayerHandles()635 void destroyAllLayerHandles() { 636 ftl::FakeGuard guard(kMainThreadContext); 637 for (auto [layerId, legacyLayer] : mFlinger->mLegacyLayers) { 638 mFlinger->onHandleDestroyed(legacyLayer, layerId); 639 } 640 } 641 setLayerHistoryDisplayArea(uint32_t displayArea)642 auto setLayerHistoryDisplayArea(uint32_t displayArea) { 643 return mFlinger->mScheduler->onActiveDisplayAreaChanged(displayArea); 644 }; updateLayerHistory(nsecs_t now)645 auto updateLayerHistory(nsecs_t now) { 646 return FTL_FAKE_GUARD(kMainThreadContext, mFlinger->updateLayerHistory(now)); 647 }; setDaltonizerType(ColorBlindnessType type)648 auto setDaltonizerType(ColorBlindnessType type) { 649 mFlinger->mDaltonizer.setType(type); 650 return mFlinger->updateColorMatrixLocked(); 651 } updateLayerSnapshots(VsyncId vsyncId,nsecs_t frameTimeNs,bool transactionsFlushed,bool & out)652 auto updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, 653 bool& out) { 654 ftl::FakeGuard guard(kMainThreadContext); 655 return mFlinger->updateLayerSnapshots(vsyncId, frameTimeNs, transactionsFlushed, out); 656 } 657 /* ------------------------------------------------------------------------ 658 * Read-write access to private data to set up preconditions and assert 659 * post-conditions. 660 */ 661 displays()662 const auto& displays() const NO_THREAD_SAFETY_ANALYSIS { return mFlinger->mDisplays; } physicalDisplays()663 const auto& physicalDisplays() const NO_THREAD_SAFETY_ANALYSIS { 664 return mFlinger->mPhysicalDisplays; 665 } currentState()666 const auto& currentState() const { return mFlinger->mCurrentState; } drawingState()667 const auto& drawingState() const { return mFlinger->mDrawingState; } transactionFlags()668 const auto& transactionFlags() const { return mFlinger->mTransactionFlags; } 669 hwcPhysicalDisplayIdMap()670 const auto& hwcPhysicalDisplayIdMap() const { return getHwComposer().mPhysicalDisplayIdMap; } hwcDisplayData()671 const auto& hwcDisplayData() const { return getHwComposer().mDisplayData; } 672 mutableSupportsWideColor()673 auto& mutableSupportsWideColor() { return mFlinger->mSupportsWideColor; } 674 mutableDisplayModeController()675 auto& mutableDisplayModeController() { return mFlinger->mDisplayModeController; } mutableCurrentState()676 auto& mutableCurrentState() { return mFlinger->mCurrentState; } mutableDisplayColorSetting()677 auto& mutableDisplayColorSetting() { return mFlinger->mDisplayColorSetting; } mutableDisplays()678 auto& mutableDisplays() NO_THREAD_SAFETY_ANALYSIS { return mFlinger->mDisplays; } mutablePhysicalDisplays()679 auto& mutablePhysicalDisplays() NO_THREAD_SAFETY_ANALYSIS { 680 return mFlinger->mPhysicalDisplays; 681 } mutableDrawingState()682 auto& mutableDrawingState() { return mFlinger->mDrawingState; } mutableGeometryDirty()683 auto& mutableGeometryDirty() { return mFlinger->mGeometryDirty; } mutableVisibleRegionsDirty()684 auto& mutableVisibleRegionsDirty() { return mFlinger->mVisibleRegionsDirty; } mutableMainThreadId()685 auto& mutableMainThreadId() { return mFlinger->mMainThreadId; } mutablePendingHotplugEvents()686 auto& mutablePendingHotplugEvents() NO_THREAD_SAFETY_ANALYSIS { 687 return mFlinger->mPendingHotplugEvents; 688 } mutableTransactionFlags()689 auto& mutableTransactionFlags() { return mFlinger->mTransactionFlags; } mutableDebugDisableHWC()690 auto& mutableDebugDisableHWC() { return mFlinger->mDebugDisableHWC; } mutableMaxRenderTargetSize()691 auto& mutableMaxRenderTargetSize() { return mFlinger->mMaxRenderTargetSize; } 692 mutableHwcDisplayData()693 auto& mutableHwcDisplayData() { return getHwComposer().mDisplayData; } mutableHwcPhysicalDisplayIdMap()694 auto& mutableHwcPhysicalDisplayIdMap() { return getHwComposer().mPhysicalDisplayIdMap; } mutablePrimaryHwcDisplayId()695 auto& mutablePrimaryHwcDisplayId() { return getHwComposer().mPrimaryHwcDisplayId; } mutableActiveDisplayId()696 auto& mutableActiveDisplayId() NO_THREAD_SAFETY_ANALYSIS { return mFlinger->mActiveDisplayId; } mutablePreviouslyComposedLayers()697 auto& mutablePreviouslyComposedLayers() { return mFlinger->mPreviouslyComposedLayers; } 698 mutableActiveDisplayRotationFlags()699 auto& mutableActiveDisplayRotationFlags() { 700 return SurfaceFlinger::sActiveDisplayRotationFlags; 701 } 702 mutableMinAcquiredBuffers()703 auto& mutableMinAcquiredBuffers() { return SurfaceFlinger::minAcquiredBuffers; } mutableLayerSnapshotBuilder()704 auto& mutableLayerSnapshotBuilder() NO_THREAD_SAFETY_ANALYSIS { 705 return mFlinger->mLayerSnapshotBuilder; 706 } 707 fromHandle(const sp<IBinder> & handle)708 auto fromHandle(const sp<IBinder>& handle) { return LayerHandle::getLayer(handle); } 709 initTransactionTraceWriter()710 auto initTransactionTraceWriter() { 711 mFlinger->mTransactionTracing.emplace(); 712 return mFlinger->initTransactionTraceWriter(); 713 } 714 notifyExpectedPresentIfRequired(PhysicalDisplayId displayId,Period vsyncPeriod,TimePoint expectedPresentTime,Fps frameInterval,std::optional<Period> timeoutOpt)715 void notifyExpectedPresentIfRequired(PhysicalDisplayId displayId, Period vsyncPeriod, 716 TimePoint expectedPresentTime, Fps frameInterval, 717 std::optional<Period> timeoutOpt) { 718 mFlinger->notifyExpectedPresentIfRequired(displayId, vsyncPeriod, expectedPresentTime, 719 frameInterval, timeoutOpt); 720 } 721 sendNotifyExpectedPresentHint(PhysicalDisplayId displayId)722 void sendNotifyExpectedPresentHint(PhysicalDisplayId displayId) { 723 ftl::FakeGuard guard(kMainThreadContext); 724 mFlinger->sendNotifyExpectedPresentHint(displayId); 725 } 726 verifyHintIsScheduledOnPresent(PhysicalDisplayId displayId)727 bool verifyHintIsScheduledOnPresent(PhysicalDisplayId displayId) { 728 return mFlinger->mNotifyExpectedPresentMap.at(displayId).hintStatus == 729 SurfaceFlinger::NotifyExpectedPresentHintStatus::ScheduleOnPresent; 730 } 731 verifyHintIsSent(PhysicalDisplayId displayId)732 bool verifyHintIsSent(PhysicalDisplayId displayId) { 733 return mFlinger->mNotifyExpectedPresentMap.at(displayId).hintStatus == 734 SurfaceFlinger::NotifyExpectedPresentHintStatus::Sent; 735 } 736 verifyHintStatusIsStart(PhysicalDisplayId displayId)737 bool verifyHintStatusIsStart(PhysicalDisplayId displayId) { 738 return mFlinger->mNotifyExpectedPresentMap.at(displayId).hintStatus == 739 SurfaceFlinger::NotifyExpectedPresentHintStatus::Start; 740 } 741 verifyHintStatusIsScheduledOnTx(PhysicalDisplayId displayId)742 bool verifyHintStatusIsScheduledOnTx(PhysicalDisplayId displayId) { 743 return mFlinger->mNotifyExpectedPresentMap.at(displayId).hintStatus == 744 SurfaceFlinger::NotifyExpectedPresentHintStatus::ScheduleOnTx; 745 } 746 verifyLastExpectedPresentTime(PhysicalDisplayId displayId,nsecs_t expectedPresentTime)747 bool verifyLastExpectedPresentTime(PhysicalDisplayId displayId, nsecs_t expectedPresentTime) { 748 return mFlinger->mNotifyExpectedPresentMap.at(displayId) 749 .lastExpectedPresentTimestamp.ns() == expectedPresentTime; 750 } 751 setNotifyExpectedPresentData(PhysicalDisplayId displayId,TimePoint lastExpectedPresentTimestamp,Fps lastFrameInterval)752 void setNotifyExpectedPresentData(PhysicalDisplayId displayId, 753 TimePoint lastExpectedPresentTimestamp, 754 Fps lastFrameInterval) { 755 auto& displayData = mFlinger->mNotifyExpectedPresentMap[displayId]; 756 displayData.lastExpectedPresentTimestamp = lastExpectedPresentTimestamp; 757 displayData.lastFrameInterval = lastFrameInterval; 758 } 759 resetNotifyExpectedPresentHintState(PhysicalDisplayId displayId)760 void resetNotifyExpectedPresentHintState(PhysicalDisplayId displayId) { 761 mFlinger->mNotifyExpectedPresentMap.at(displayId).hintStatus = 762 SurfaceFlinger::NotifyExpectedPresentHintStatus::Start; 763 } 764 ~TestableSurfaceFlinger()765 ~TestableSurfaceFlinger() { 766 // All these pointer and container clears help ensure that GMock does 767 // not report a leaked object, since the SurfaceFlinger instance may 768 // still be referenced by something despite our best efforts to destroy 769 // it after each test is done. 770 mutableDisplays().clear(); 771 mutableCurrentState().displays.clear(); 772 mutableDrawingState().displays.clear(); 773 mFlinger->mScheduler.reset(); 774 mFlinger->mCompositionEngine->setHwComposer(std::unique_ptr<HWComposer>()); 775 mFlinger->mRenderEngine = std::unique_ptr<renderengine::RenderEngine>(); 776 mFlinger->mCompositionEngine->setRenderEngine(mFlinger->mRenderEngine.get()); 777 mFlinger->mTransactionTracing.reset(); 778 } 779 780 /* ------------------------------------------------------------------------ 781 * Wrapper classes for Read-write access to private data to set up 782 * preconditions and assert post-conditions. 783 */ 784 struct HWC2Display : public HWC2::impl::Display { HWC2DisplayHWC2Display785 HWC2Display( 786 Hwc2::Composer& composer, 787 const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability>& 788 capabilities, 789 hal::HWDisplayId id, hal::DisplayType type) 790 : HWC2::impl::Display(composer, capabilities, id, type) {} ~HWC2DisplayHWC2Display791 ~HWC2Display() { 792 // Prevents a call to disable vsyncs. 793 mType = hal::DisplayType::INVALID; 794 } 795 mutableIsConnectedHWC2Display796 auto& mutableIsConnected() { return this->mIsConnected; } mutableLayersHWC2Display797 auto& mutableLayers() { return this->mLayers; } 798 }; 799 800 class FakeHwcDisplayInjector { 801 public: 802 static constexpr hal::HWDisplayId DEFAULT_HWC_DISPLAY_ID = 1000; 803 static constexpr ui::Size DEFAULT_RESOLUTION{1920, 1280}; 804 static constexpr int32_t DEFAULT_VSYNC_PERIOD = 16'666'667; 805 static constexpr int32_t DEFAULT_CONFIG_GROUP = 7; 806 static constexpr int32_t DEFAULT_DPI = 320; 807 static constexpr hal::HWConfigId DEFAULT_ACTIVE_CONFIG = 0; 808 FakeHwcDisplayInjector(HalDisplayId displayId,hal::DisplayType hwcDisplayType,bool isPrimary)809 FakeHwcDisplayInjector(HalDisplayId displayId, hal::DisplayType hwcDisplayType, 810 bool isPrimary) 811 : mDisplayId(displayId), mHwcDisplayType(hwcDisplayType), mIsPrimary(isPrimary) {} 812 setHwcDisplayId(hal::HWDisplayId displayId)813 auto& setHwcDisplayId(hal::HWDisplayId displayId) { 814 mHwcDisplayId = displayId; 815 return *this; 816 } 817 setResolution(ui::Size resolution)818 auto& setResolution(ui::Size resolution) { 819 mResolution = resolution; 820 return *this; 821 } 822 setVsyncPeriod(nsecs_t vsyncPeriod)823 auto& setVsyncPeriod(nsecs_t vsyncPeriod) { 824 mVsyncPeriod = vsyncPeriod; 825 return *this; 826 } 827 setDpiX(int32_t dpi)828 auto& setDpiX(int32_t dpi) { 829 mDpiX = dpi; 830 return *this; 831 } 832 setDpiY(int32_t dpi)833 auto& setDpiY(int32_t dpi) { 834 mDpiY = dpi; 835 return *this; 836 } 837 setActiveConfig(hal::HWConfigId config)838 auto& setActiveConfig(hal::HWConfigId config) { 839 mActiveConfig = config; 840 return *this; 841 } 842 setCapabilities(const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability> * capabilities)843 auto& setCapabilities( 844 const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability>* 845 capabilities) { 846 mCapabilities = capabilities; 847 return *this; 848 } 849 setPowerMode(hal::PowerMode mode)850 auto& setPowerMode(hal::PowerMode mode) { 851 mPowerMode = mode; 852 return *this; 853 } 854 inject(TestableSurfaceFlinger * flinger,Hwc2::mock::Composer * composer)855 void inject(TestableSurfaceFlinger* flinger, Hwc2::mock::Composer* composer) { 856 using ::testing::_; 857 using ::testing::DoAll; 858 using ::testing::Return; 859 using ::testing::SetArgPointee; 860 861 static const std::unordered_set< 862 aidl::android::hardware::graphics::composer3::Capability> 863 defaultCapabilities; 864 if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities; 865 866 // Caution - Make sure that any values passed by reference here do 867 // not refer to an instance owned by FakeHwcDisplayInjector. This 868 // class has temporary lifetime, while the constructed HWC2::Display 869 // is much longer lived. 870 auto display = std::make_unique<HWC2Display>(*composer, *mCapabilities, mHwcDisplayId, 871 mHwcDisplayType); 872 display->mutableIsConnected() = true; 873 874 display->setPowerMode(mPowerMode); 875 876 flinger->mutableHwcDisplayData()[mDisplayId].hwcDisplay = std::move(display); 877 878 EXPECT_CALL(*composer, getDisplayConfigs(mHwcDisplayId, _)) 879 .WillRepeatedly( 880 DoAll(SetArgPointee<1>(std::vector<hal::HWConfigId>{mActiveConfig}), 881 Return(hal::Error::NONE))); 882 EXPECT_CALL(*composer, 883 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::WIDTH, _)) 884 .WillRepeatedly(DoAll(SetArgPointee<3>(mResolution.getWidth()), 885 Return(hal::Error::NONE))); 886 887 EXPECT_CALL(*composer, 888 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::HEIGHT, 889 _)) 890 .WillRepeatedly(DoAll(SetArgPointee<3>(mResolution.getHeight()), 891 Return(hal::Error::NONE))); 892 893 EXPECT_CALL(*composer, 894 getDisplayAttribute(mHwcDisplayId, mActiveConfig, 895 hal::Attribute::VSYNC_PERIOD, _)) 896 .WillRepeatedly(DoAll(SetArgPointee<3>(static_cast<int32_t>(mVsyncPeriod)), 897 Return(hal::Error::NONE))); 898 899 EXPECT_CALL(*composer, 900 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::DPI_X, _)) 901 .WillRepeatedly(DoAll(SetArgPointee<3>(mDpiX), Return(hal::Error::NONE))); 902 903 EXPECT_CALL(*composer, 904 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::DPI_Y, _)) 905 .WillRepeatedly(DoAll(SetArgPointee<3>(mDpiY), Return(hal::Error::NONE))); 906 907 EXPECT_CALL(*composer, 908 getDisplayAttribute(mHwcDisplayId, mActiveConfig, 909 hal::Attribute::CONFIG_GROUP, _)) 910 .WillRepeatedly( 911 DoAll(SetArgPointee<3>(mConfigGroup), Return(hal::Error::NONE))); 912 913 if (mHwcDisplayType == hal::DisplayType::PHYSICAL) { 914 const auto physicalId = PhysicalDisplayId::tryCast(mDisplayId); 915 LOG_ALWAYS_FATAL_IF(!physicalId); 916 flinger->mutableHwcPhysicalDisplayIdMap().emplace(mHwcDisplayId, *physicalId); 917 if (mIsPrimary) { 918 flinger->mutablePrimaryHwcDisplayId() = mHwcDisplayId; 919 } else { 920 // If there is an external HWC display, there should always be a primary ID 921 // as well. Set it to some arbitrary value. 922 auto& primaryId = flinger->mutablePrimaryHwcDisplayId(); 923 if (!primaryId) primaryId = mHwcDisplayId - 1; 924 } 925 } 926 } 927 928 private: 929 const HalDisplayId mDisplayId; 930 const hal::DisplayType mHwcDisplayType; 931 const bool mIsPrimary; 932 933 hal::HWDisplayId mHwcDisplayId = DEFAULT_HWC_DISPLAY_ID; 934 ui::Size mResolution = DEFAULT_RESOLUTION; 935 nsecs_t mVsyncPeriod = DEFAULT_VSYNC_PERIOD; 936 int32_t mDpiX = DEFAULT_DPI; 937 int32_t mDpiY = DEFAULT_DPI; 938 int32_t mConfigGroup = DEFAULT_CONFIG_GROUP; 939 hal::HWConfigId mActiveConfig = DEFAULT_ACTIVE_CONFIG; 940 hal::PowerMode mPowerMode = hal::PowerMode::ON; 941 const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability>* 942 mCapabilities = nullptr; 943 }; 944 945 class FakeDisplayDeviceInjector { 946 public: FakeDisplayDeviceInjector(TestableSurfaceFlinger & flinger,std::shared_ptr<compositionengine::Display> display,std::optional<ui::DisplayConnectionType> connectionType,std::optional<hal::HWDisplayId> hwcDisplayId,bool isPrimary)947 FakeDisplayDeviceInjector(TestableSurfaceFlinger& flinger, 948 std::shared_ptr<compositionengine::Display> display, 949 std::optional<ui::DisplayConnectionType> connectionType, 950 std::optional<hal::HWDisplayId> hwcDisplayId, bool isPrimary) 951 : mFlinger(flinger), 952 mCreationArgs(flinger.mFlinger, flinger.mFlinger->getHwComposer(), mDisplayToken, 953 display), 954 mConnectionType(connectionType), 955 mHwcDisplayId(hwcDisplayId) { 956 mCreationArgs.isPrimary = isPrimary; 957 mCreationArgs.initialPowerMode = hal::PowerMode::ON; 958 } 959 token()960 sp<IBinder> token() const { return mDisplayToken; } 961 physicalDisplay()962 auto physicalDisplay() const { 963 return ftl::Optional(mCreationArgs.compositionDisplay->getDisplayId()) 964 .and_then(&PhysicalDisplayId::tryCast) 965 .and_then(display::getPhysicalDisplay(mFlinger.physicalDisplays())); 966 } 967 mutableDrawingDisplayState()968 DisplayDeviceState& mutableDrawingDisplayState() { 969 return mFlinger.mutableDrawingState().displays.editValueFor(mDisplayToken); 970 } 971 mutableCurrentDisplayState()972 DisplayDeviceState& mutableCurrentDisplayState() { 973 return mFlinger.mutableCurrentState().displays.editValueFor(mDisplayToken); 974 } 975 getDrawingDisplayState()976 const auto& getDrawingDisplayState() { 977 return mFlinger.mutableDrawingState().displays.valueFor(mDisplayToken); 978 } 979 getCurrentDisplayState()980 const auto& getCurrentDisplayState() { 981 return mFlinger.mutableCurrentState().displays.valueFor(mDisplayToken); 982 } 983 mutableDisplayDevice()984 const sp<DisplayDevice>& mutableDisplayDevice() { 985 return mFlinger.mutableDisplays().get(mDisplayToken)->get(); 986 } 987 setDisplayModes(DisplayModes modes,DisplayModeId activeModeId)988 auto& setDisplayModes(DisplayModes modes, DisplayModeId activeModeId) { 989 mDisplayModes = std::move(modes); 990 mActiveModeId = activeModeId; 991 mCreationArgs.refreshRateSelector = nullptr; 992 return *this; 993 } 994 setRefreshRateSelector(RefreshRateSelectorPtr selectorPtr)995 auto& setRefreshRateSelector(RefreshRateSelectorPtr selectorPtr) { 996 mDisplayModes = selectorPtr->displayModes(); 997 mActiveModeId = selectorPtr->getActiveMode().modePtr->getId(); 998 mCreationArgs.refreshRateSelector = std::move(selectorPtr); 999 return *this; 1000 } 1001 setNativeWindow(const sp<ANativeWindow> & nativeWindow)1002 auto& setNativeWindow(const sp<ANativeWindow>& nativeWindow) { 1003 mCreationArgs.nativeWindow = nativeWindow; 1004 return *this; 1005 } 1006 setDisplaySurface(const sp<compositionengine::DisplaySurface> & displaySurface)1007 auto& setDisplaySurface(const sp<compositionengine::DisplaySurface>& displaySurface) { 1008 mCreationArgs.displaySurface = displaySurface; 1009 return *this; 1010 } 1011 setSecure(bool secure)1012 auto& setSecure(bool secure) { 1013 mCreationArgs.isSecure = secure; 1014 return *this; 1015 } 1016 setPowerMode(hal::PowerMode mode)1017 auto& setPowerMode(hal::PowerMode mode) { 1018 mCreationArgs.initialPowerMode = mode; 1019 return *this; 1020 } 1021 setHwcColorModes(const std::unordered_map<ui::ColorMode,std::vector<ui::RenderIntent>> hwcColorModes)1022 auto& setHwcColorModes( 1023 const std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>> 1024 hwcColorModes) { 1025 mCreationArgs.hwcColorModes = hwcColorModes; 1026 return *this; 1027 } 1028 setHasWideColorGamut(bool hasWideColorGamut)1029 auto& setHasWideColorGamut(bool hasWideColorGamut) { 1030 mCreationArgs.hasWideColorGamut = hasWideColorGamut; 1031 return *this; 1032 } 1033 setPhysicalOrientation(ui::Rotation orientation)1034 auto& setPhysicalOrientation(ui::Rotation orientation) { 1035 mCreationArgs.physicalOrientation = orientation; 1036 return *this; 1037 } 1038 1039 // Used to avoid overwriting mocks injected by TestableSurfaceFlinger::setupMockScheduler. skipSchedulerRegistration()1040 auto& skipSchedulerRegistration() { 1041 mSchedulerRegistration = false; 1042 return *this; 1043 } 1044 inject()1045 sp<DisplayDevice> inject() NO_THREAD_SAFETY_ANALYSIS { 1046 return inject(std::make_unique<mock::VsyncController>(), 1047 std::make_shared<mock::VSyncTracker>()); 1048 } 1049 inject(std::unique_ptr<android::scheduler::VsyncController> controller,std::shared_ptr<android::scheduler::VSyncTracker> tracker)1050 sp<DisplayDevice> inject(std::unique_ptr<android::scheduler::VsyncController> controller, 1051 std::shared_ptr<android::scheduler::VSyncTracker> tracker) 1052 NO_THREAD_SAFETY_ANALYSIS { 1053 const auto displayId = mCreationArgs.compositionDisplay->getDisplayId(); 1054 LOG_ALWAYS_FATAL_IF(!displayId); 1055 1056 auto& modes = mDisplayModes; 1057 auto& activeModeId = mActiveModeId; 1058 1059 DisplayDeviceState state; 1060 state.isSecure = mCreationArgs.isSecure; 1061 1062 if (const auto physicalId = PhysicalDisplayId::tryCast(*displayId)) { 1063 LOG_ALWAYS_FATAL_IF(!mConnectionType); 1064 LOG_ALWAYS_FATAL_IF(!mHwcDisplayId); 1065 1066 if (mCreationArgs.isPrimary) { 1067 mFlinger.mutableActiveDisplayId() = *physicalId; 1068 } 1069 1070 if (!mCreationArgs.refreshRateSelector) { 1071 if (modes.empty()) { 1072 constexpr DisplayModeId kModeId{0}; 1073 DisplayModePtr mode = 1074 DisplayMode::Builder(FakeHwcDisplayInjector::DEFAULT_ACTIVE_CONFIG) 1075 .setId(kModeId) 1076 .setPhysicalDisplayId(*physicalId) 1077 .setResolution(FakeHwcDisplayInjector::DEFAULT_RESOLUTION) 1078 .setVsyncPeriod( 1079 FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD) 1080 .setDpiX(FakeHwcDisplayInjector::DEFAULT_DPI) 1081 .setDpiY(FakeHwcDisplayInjector::DEFAULT_DPI) 1082 .setGroup(FakeHwcDisplayInjector::DEFAULT_CONFIG_GROUP) 1083 .build(); 1084 1085 modes = ftl::init::map(kModeId, std::move(mode)); 1086 activeModeId = kModeId; 1087 } 1088 1089 mCreationArgs.refreshRateSelector = 1090 std::make_shared<scheduler::RefreshRateSelector>(modes, activeModeId); 1091 } 1092 1093 const auto activeModeOpt = modes.get(activeModeId); 1094 LOG_ALWAYS_FATAL_IF(!activeModeOpt); 1095 1096 // Save a copy for use after `modes` is consumed. 1097 const Fps refreshRate = activeModeOpt->get()->getPeakFps(); 1098 1099 state.physical = {.id = *physicalId, 1100 .hwcDisplayId = *mHwcDisplayId, 1101 .activeMode = activeModeOpt->get()}; 1102 1103 const auto it = mFlinger.mutablePhysicalDisplays() 1104 .emplace_or_replace(*physicalId, mDisplayToken, *physicalId, 1105 *mConnectionType, std::move(modes), 1106 ui::ColorModes(), std::nullopt) 1107 .first; 1108 1109 mFlinger.mutableDisplayModeController() 1110 .registerDisplay(*physicalId, it->second.snapshot(), 1111 mCreationArgs.refreshRateSelector); 1112 1113 mFlinger.mutableDisplayModeController().setActiveMode(*physicalId, activeModeId, 1114 refreshRate, refreshRate); 1115 1116 if (mFlinger.scheduler() && mSchedulerRegistration) { 1117 mFlinger.scheduler()->registerDisplay(*physicalId, 1118 mCreationArgs.refreshRateSelector, 1119 std::move(controller), std::move(tracker), 1120 mFlinger.mutableActiveDisplayId()); 1121 } 1122 } 1123 1124 sp<DisplayDevice> display = sp<DisplayDevice>::make(mCreationArgs); 1125 mFlinger.mutableDisplays().emplace_or_replace(mDisplayToken, display); 1126 1127 mFlinger.mutableCurrentState().displays.add(mDisplayToken, state); 1128 mFlinger.mutableDrawingState().displays.add(mDisplayToken, state); 1129 1130 return display; 1131 } 1132 1133 private: 1134 TestableSurfaceFlinger& mFlinger; 1135 sp<BBinder> mDisplayToken = sp<BBinder>::make(); 1136 DisplayDeviceCreationArgs mCreationArgs; 1137 DisplayModes mDisplayModes; 1138 DisplayModeId mActiveModeId; 1139 bool mSchedulerRegistration = true; 1140 const std::optional<ui::DisplayConnectionType> mConnectionType; 1141 const std::optional<hal::HWDisplayId> mHwcDisplayId; 1142 }; 1143 1144 private: 1145 template <typename T> makeMock(bool useNiceMock)1146 static std::unique_ptr<T> makeMock(bool useNiceMock) { 1147 return useNiceMock ? std::make_unique<testing::NiceMock<T>>() : std::make_unique<T>(); 1148 } 1149 1150 template <typename T> makeSharedMock(bool useNiceMock)1151 static std::shared_ptr<T> makeSharedMock(bool useNiceMock) { 1152 return useNiceMock ? std::make_shared<testing::NiceMock<T>>() : std::make_shared<T>(); 1153 } 1154 1155 static constexpr VsyncId kVsyncId{123}; 1156 1157 surfaceflinger::test::Factory mFactory; 1158 sp<SurfaceFlinger> mFlinger; 1159 scheduler::mock::SchedulerCallback mSchedulerCallback; 1160 scheduler::mock::NoOpSchedulerCallback mNoOpSchedulerCallback; 1161 std::unique_ptr<frametimeline::impl::TokenManager> mTokenManager; 1162 scheduler::TestableScheduler* mScheduler = nullptr; 1163 adpf::mock::PowerAdvisor mPowerAdvisor; 1164 }; 1165 1166 } // namespace android 1167