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 <algorithm> 20 #include <chrono> 21 #include <variant> 22 23 #include <ftl/fake_guard.h> 24 #include <ftl/match.h> 25 #include <gui/ScreenCaptureResults.h> 26 #include <ui/DynamicDisplayInfo.h> 27 28 #include <compositionengine/Display.h> 29 #include <compositionengine/LayerFECompositionState.h> 30 #include <compositionengine/OutputLayer.h> 31 #include <compositionengine/impl/CompositionEngine.h> 32 #include <compositionengine/impl/Display.h> 33 #include <compositionengine/impl/OutputLayerCompositionState.h> 34 #include <compositionengine/mock/DisplaySurface.h> 35 36 #include "DisplayDevice.h" 37 #include "FakeVsyncConfiguration.h" 38 #include "FrameTracer/FrameTracer.h" 39 #include "FrontEnd/LayerCreationArgs.h" 40 #include "FrontEnd/LayerHandle.h" 41 #include "Layer.h" 42 #include "NativeWindowSurface.h" 43 #include "RenderArea.h" 44 #include "Scheduler/MessageQueue.h" 45 #include "Scheduler/RefreshRateSelector.h" 46 #include "StartPropertySetThread.h" 47 #include "SurfaceFlinger.h" 48 #include "TestableScheduler.h" 49 #include "mock/DisplayHardware/MockComposer.h" 50 #include "mock/DisplayHardware/MockDisplayMode.h" 51 #include "mock/DisplayHardware/MockPowerAdvisor.h" 52 #include "mock/MockEventThread.h" 53 #include "mock/MockFrameTimeline.h" 54 #include "mock/MockFrameTracer.h" 55 #include "mock/MockSchedulerCallback.h" 56 #include "mock/system/window/MockNativeWindow.h" 57 58 namespace android { 59 60 struct DisplayStatInfo; 61 62 namespace renderengine { 63 64 class RenderEngine; 65 66 } // namespace renderengine 67 68 namespace Hwc2 { 69 70 class Composer; 71 72 } // namespace Hwc2 73 74 namespace hal = android::hardware::graphics::composer::hal; 75 76 namespace surfaceflinger::test { 77 78 class Factory final : public surfaceflinger::Factory { 79 public: 80 ~Factory() = default; 81 createHWComposer(const std::string &)82 std::unique_ptr<HWComposer> createHWComposer(const std::string&) override { 83 return nullptr; 84 } 85 createVsyncConfiguration(Fps)86 std::unique_ptr<scheduler::VsyncConfiguration> createVsyncConfiguration( 87 Fps /*currentRefreshRate*/) override { 88 return std::make_unique<scheduler::FakePhaseOffsets>(); 89 } 90 createStartPropertySetThread(bool timestampPropertyValue)91 sp<StartPropertySetThread> createStartPropertySetThread(bool timestampPropertyValue) override { 92 return sp<StartPropertySetThread>::make(timestampPropertyValue); 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)129 sp<LayerFE> createLayerFE(const std::string& layerName) 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 } 190 setupPowerAdvisor(std::unique_ptr<Hwc2::PowerAdvisor> powerAdvisor)191 void setupPowerAdvisor(std::unique_ptr<Hwc2::PowerAdvisor> powerAdvisor) { 192 mFlinger->mPowerAdvisor = std::move(powerAdvisor); 193 } 194 setupTimeStats(const std::shared_ptr<TimeStats> & timeStats)195 void setupTimeStats(const std::shared_ptr<TimeStats>& timeStats) { 196 mFlinger->mCompositionEngine->setTimeStats(timeStats); 197 } 198 199 enum class SchedulerCallbackImpl { kNoOp, kMock }; 200 201 struct DefaultDisplayMode { 202 // The ID of the injected RefreshRateSelector and its default display mode. 203 PhysicalDisplayId displayId; 204 }; 205 206 using RefreshRateSelectorPtr = scheduler::Scheduler::RefreshRateSelectorPtr; 207 208 using DisplayModesVariant = std::variant<DefaultDisplayMode, RefreshRateSelectorPtr>; 209 210 void setupScheduler(std::unique_ptr<scheduler::VsyncController> vsyncController, 211 std::shared_ptr<scheduler::VSyncTracker> vsyncTracker, 212 std::unique_ptr<EventThread> appEventThread, 213 std::unique_ptr<EventThread> sfEventThread, 214 DisplayModesVariant modesVariant, 215 SchedulerCallbackImpl callbackImpl = SchedulerCallbackImpl::kNoOp, 216 bool useNiceMock = false) { 217 RefreshRateSelectorPtr selectorPtr = ftl::match( 218 modesVariant, 219 [](DefaultDisplayMode arg) { 220 constexpr DisplayModeId kModeId60{0}; 221 return std::make_shared<scheduler::RefreshRateSelector>( 222 makeModes(mock::createDisplayMode(arg.displayId, kModeId60, 60_Hz)), 223 kModeId60); 224 }, 225 [](RefreshRateSelectorPtr selectorPtr) { return selectorPtr; }); 226 227 const auto fps = selectorPtr->getActiveMode().fps; 228 mFlinger->mVsyncConfiguration = mFactory.createVsyncConfiguration(fps); 229 230 mFlinger->mRefreshRateStats = 231 std::make_unique<scheduler::RefreshRateStats>(*mFlinger->mTimeStats, fps, 232 hal::PowerMode::OFF); 233 234 mTokenManager = std::make_unique<frametimeline::impl::TokenManager>(); 235 236 using Callback = scheduler::ISchedulerCallback; 237 Callback& callback = callbackImpl == SchedulerCallbackImpl::kNoOp 238 ? static_cast<Callback&>(mNoOpSchedulerCallback) 239 : static_cast<Callback&>(mSchedulerCallback); 240 241 auto modulatorPtr = sp<scheduler::VsyncModulator>::make( 242 mFlinger->mVsyncConfiguration->getCurrentConfigs()); 243 244 if (useNiceMock) { 245 mScheduler = 246 new testing::NiceMock<scheduler::TestableScheduler>(std::move(vsyncController), 247 std::move(vsyncTracker), 248 std::move(selectorPtr), 249 std::move(modulatorPtr), 250 callback); 251 } else { 252 mScheduler = new scheduler::TestableScheduler(std::move(vsyncController), 253 std::move(vsyncTracker), 254 std::move(selectorPtr), 255 std::move(modulatorPtr), callback); 256 } 257 258 mScheduler->initVsync(mScheduler->getVsyncSchedule()->getDispatch(), *mTokenManager, 0ms); 259 260 mScheduler->mutableAppConnectionHandle() = 261 mScheduler->createConnection(std::move(appEventThread)); 262 263 mFlinger->mAppConnectionHandle = mScheduler->mutableAppConnectionHandle(); 264 mFlinger->mSfConnectionHandle = mScheduler->createConnection(std::move(sfEventThread)); 265 resetScheduler(mScheduler); 266 } 267 268 void setupMockScheduler(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 275 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_)); 276 EXPECT_CALL(*eventThread, createEventConnection(_, _)) 277 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(), 278 mock::EventThread::kCallingUid, 279 ResyncCallback()))); 280 281 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_)); 282 EXPECT_CALL(*sfEventThread, createEventConnection(_, _)) 283 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(), 284 mock::EventThread::kCallingUid, 285 ResyncCallback()))); 286 287 auto vsyncController = makeMock<mock::VsyncController>(options.useNiceMock); 288 auto vsyncTracker = makeSharedMock<mock::VSyncTracker>(options.useNiceMock); 289 290 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); 291 EXPECT_CALL(*vsyncTracker, currentPeriod()) 292 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD)); 293 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); 294 setupScheduler(std::move(vsyncController), std::move(vsyncTracker), std::move(eventThread), 295 std::move(sfEventThread), DefaultDisplayMode{options.displayId}, 296 SchedulerCallbackImpl::kNoOp, options.useNiceMock); 297 } 298 resetScheduler(scheduler::Scheduler * scheduler)299 void resetScheduler(scheduler::Scheduler* scheduler) { mFlinger->mScheduler.reset(scheduler); } 300 mutableScheduler()301 scheduler::TestableScheduler& mutableScheduler() { return *mScheduler; } mockSchedulerCallback()302 scheduler::mock::SchedulerCallback& mockSchedulerCallback() { return mSchedulerCallback; } 303 304 using CreateBufferQueueFunction = surfaceflinger::test::Factory::CreateBufferQueueFunction; setCreateBufferQueueFunction(CreateBufferQueueFunction f)305 void setCreateBufferQueueFunction(CreateBufferQueueFunction f) { 306 mFactory.mCreateBufferQueue = f; 307 } 308 309 using CreateNativeWindowSurfaceFunction = 310 surfaceflinger::test::Factory::CreateNativeWindowSurfaceFunction; setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f)311 void setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f) { 312 mFactory.mCreateNativeWindowSurface = f; 313 } 314 setInternalDisplayPrimaries(const ui::DisplayPrimaries & primaries)315 void setInternalDisplayPrimaries(const ui::DisplayPrimaries& primaries) { 316 memcpy(&mFlinger->mInternalDisplayPrimaries, &primaries, sizeof(ui::DisplayPrimaries)); 317 } 318 mutableLayerDrawingState(const sp<Layer> & layer)319 static auto& mutableLayerDrawingState(const sp<Layer>& layer) { return layer->mDrawingState; } 320 mutableStateLock()321 auto& mutableStateLock() { return mFlinger->mStateLock; } 322 findOutputLayerForDisplay(const sp<Layer> & layer,const sp<const DisplayDevice> & display)323 static auto findOutputLayerForDisplay(const sp<Layer>& layer, 324 const sp<const DisplayDevice>& display) { 325 return layer->findOutputLayerForDisplay(display.get()); 326 } 327 setLayerSidebandStream(const sp<Layer> & layer,const sp<NativeHandle> & sidebandStream)328 static void setLayerSidebandStream(const sp<Layer>& layer, 329 const sp<NativeHandle>& sidebandStream) { 330 layer->mDrawingState.sidebandStream = sidebandStream; 331 layer->mSidebandStream = sidebandStream; 332 layer->editLayerSnapshot()->sidebandStream = sidebandStream; 333 } 334 setLayerCompositionType(const sp<Layer> & layer,aidl::android::hardware::graphics::composer3::Composition type)335 void setLayerCompositionType(const sp<Layer>& layer, 336 aidl::android::hardware::graphics::composer3::Composition type) { 337 auto outputLayer = findOutputLayerForDisplay(layer, mFlinger->getDefaultDisplayDevice()); 338 LOG_ALWAYS_FATAL_IF(!outputLayer); 339 auto& state = outputLayer->editState(); 340 LOG_ALWAYS_FATAL_IF(!outputLayer->getState().hwc); 341 (*state.hwc).hwcCompositionType = type; 342 } 343 setLayerPotentialCursor(const sp<Layer> & layer,bool potentialCursor)344 static void setLayerPotentialCursor(const sp<Layer>& layer, bool potentialCursor) { 345 layer->mPotentialCursor = potentialCursor; 346 } 347 setLayerDrawingParent(const sp<Layer> & layer,const sp<Layer> & drawingParent)348 static void setLayerDrawingParent(const sp<Layer>& layer, const sp<Layer>& drawingParent) { 349 layer->mDrawingParent = drawingParent; 350 } 351 352 /* ------------------------------------------------------------------------ 353 * Forwarding for functions being tested 354 */ 355 configure()356 void configure() { 357 ftl::FakeGuard guard(kMainThreadContext); 358 mFlinger->configure(); 359 } 360 configureAndCommit()361 void configureAndCommit() { 362 configure(); 363 commitTransactionsLocked(eDisplayTransactionNeeded); 364 } 365 366 void commit(TimePoint frameTime, VsyncId vsyncId, TimePoint expectedVsyncTime, 367 bool composite = false) { 368 ftl::FakeGuard guard(kMainThreadContext); 369 370 const auto displayIdOpt = mScheduler->pacesetterDisplayId(); 371 LOG_ALWAYS_FATAL_IF(!displayIdOpt); 372 const auto displayId = *displayIdOpt; 373 374 constexpr bool kBackpressureGpuComposition = true; 375 scheduler::FrameTargeter frameTargeter(displayId, kBackpressureGpuComposition); 376 377 frameTargeter.beginFrame({.frameBeginTime = frameTime, 378 .vsyncId = vsyncId, 379 .expectedVsyncTime = expectedVsyncTime, 380 .sfWorkDuration = 10ms}, 381 *mScheduler->getVsyncSchedule()); 382 383 scheduler::FrameTargets targets; 384 scheduler::FrameTargeters targeters; 385 386 for (const auto& [id, display] : 387 FTL_FAKE_GUARD(mFlinger->mStateLock, mFlinger->mPhysicalDisplays)) { 388 targets.try_emplace(id, &frameTargeter.target()); 389 targeters.try_emplace(id, &frameTargeter); 390 } 391 392 mFlinger->commit(displayId, targets); 393 394 if (composite) { 395 mFlinger->composite(displayId, targeters); 396 } 397 } 398 399 void commit(TimePoint frameTime, VsyncId vsyncId, bool composite = false) { 400 return commit(frameTime, vsyncId, frameTime + Period(10ms), composite); 401 } 402 403 void commit(bool composite = false) { 404 const TimePoint frameTime = scheduler::SchedulerClock::now(); 405 commit(frameTime, kVsyncId, composite); 406 } 407 commitAndComposite(TimePoint frameTime,VsyncId vsyncId,TimePoint expectedVsyncTime)408 void commitAndComposite(TimePoint frameTime, VsyncId vsyncId, TimePoint expectedVsyncTime) { 409 constexpr bool kComposite = true; 410 commit(frameTime, vsyncId, expectedVsyncTime, kComposite); 411 } 412 commitAndComposite()413 void commitAndComposite() { 414 constexpr bool kComposite = true; 415 commit(kComposite); 416 } 417 418 auto createDisplay(const String8& displayName, bool secure, float requestedRefreshRate = 0.0f) { 419 return mFlinger->createDisplay(displayName, secure, requestedRefreshRate); 420 } 421 destroyDisplay(const sp<IBinder> & displayToken)422 auto destroyDisplay(const sp<IBinder>& displayToken) { 423 return mFlinger->destroyDisplay(displayToken); 424 } 425 getDisplay(const sp<IBinder> & displayToken)426 auto getDisplay(const sp<IBinder>& displayToken) { 427 Mutex::Autolock lock(mFlinger->mStateLock); 428 return mFlinger->getDisplayDeviceLocked(displayToken); 429 } 430 enableHalVirtualDisplays(bool enable)431 void enableHalVirtualDisplays(bool enable) { mFlinger->enableHalVirtualDisplays(enable); } 432 setupNewDisplayDeviceInternal(const wp<IBinder> & displayToken,std::shared_ptr<compositionengine::Display> compositionDisplay,const DisplayDeviceState & state,const sp<compositionengine::DisplaySurface> & dispSurface,const sp<IGraphicBufferProducer> & producer)433 auto setupNewDisplayDeviceInternal( 434 const wp<IBinder>& displayToken, 435 std::shared_ptr<compositionengine::Display> compositionDisplay, 436 const DisplayDeviceState& state, 437 const sp<compositionengine::DisplaySurface>& dispSurface, 438 const sp<IGraphicBufferProducer>& producer) NO_THREAD_SAFETY_ANALYSIS { 439 return mFlinger->setupNewDisplayDeviceInternal(displayToken, compositionDisplay, state, 440 dispSurface, producer); 441 } 442 commitTransactionsLocked(uint32_t transactionFlags)443 void commitTransactionsLocked(uint32_t transactionFlags) { 444 Mutex::Autolock lock(mFlinger->mStateLock); 445 ftl::FakeGuard guard(kMainThreadContext); 446 mFlinger->commitTransactionsLocked(transactionFlags); 447 } 448 onComposerHalHotplug(hal::HWDisplayId hwcDisplayId,hal::Connection connection)449 void onComposerHalHotplug(hal::HWDisplayId hwcDisplayId, hal::Connection connection) { 450 mFlinger->onComposerHalHotplug(hwcDisplayId, connection); 451 } 452 setDisplayStateLocked(const DisplayState & s)453 auto setDisplayStateLocked(const DisplayState& s) { 454 Mutex::Autolock lock(mFlinger->mStateLock); 455 return mFlinger->setDisplayStateLocked(s); 456 } 457 initializeDisplays()458 void initializeDisplays() FTL_FAKE_GUARD(kMainThreadContext) { mFlinger->initializeDisplays(); } 459 notifyPowerBoost(int32_t boostId)460 auto notifyPowerBoost(int32_t boostId) { return mFlinger->notifyPowerBoost(boostId); } 461 setDisplayBrightness(const sp<IBinder> & display,const gui::DisplayBrightness & brightness)462 auto setDisplayBrightness(const sp<IBinder>& display, 463 const gui::DisplayBrightness& brightness) { 464 return mFlinger->setDisplayBrightness(display, brightness); 465 } 466 467 // Allow reading display state without locking, as if called on the SF main thread. setPowerModeInternal(const sp<DisplayDevice> & display,hal::PowerMode mode)468 auto setPowerModeInternal(const sp<DisplayDevice>& display, 469 hal::PowerMode mode) NO_THREAD_SAFETY_ANALYSIS { 470 return mFlinger->setPowerModeInternal(display, mode); 471 } 472 renderScreenImpl(std::shared_ptr<const RenderArea> renderArea,SurfaceFlinger::GetLayerSnapshotsFunction traverseLayers,const std::shared_ptr<renderengine::ExternalTexture> & buffer,bool forSystem,bool regionSampling)473 auto renderScreenImpl(std::shared_ptr<const RenderArea> renderArea, 474 SurfaceFlinger::GetLayerSnapshotsFunction traverseLayers, 475 const std::shared_ptr<renderengine::ExternalTexture>& buffer, 476 bool forSystem, bool regionSampling) { 477 ScreenCaptureResults captureResults; 478 return FTL_FAKE_GUARD(kMainThreadContext, 479 mFlinger->renderScreenImpl(std::move(renderArea), traverseLayers, 480 buffer, forSystem, regionSampling, 481 false /* grayscale */, captureResults)); 482 } 483 traverseLayersInLayerStack(ui::LayerStack layerStack,int32_t uid,std::unordered_set<uint32_t> excludeLayerIds,const LayerVector::Visitor & visitor)484 auto traverseLayersInLayerStack(ui::LayerStack layerStack, int32_t uid, 485 std::unordered_set<uint32_t> excludeLayerIds, 486 const LayerVector::Visitor& visitor) { 487 return mFlinger->SurfaceFlinger::traverseLayersInLayerStack(layerStack, uid, 488 excludeLayerIds, visitor); 489 } 490 getDisplayNativePrimaries(const sp<IBinder> & displayToken,ui::DisplayPrimaries & primaries)491 auto getDisplayNativePrimaries(const sp<IBinder>& displayToken, 492 ui::DisplayPrimaries &primaries) { 493 return mFlinger->SurfaceFlinger::getDisplayNativePrimaries(displayToken, primaries); 494 } 495 getTransactionQueue()496 auto& getTransactionQueue() { return mFlinger->mTransactionHandler.mLocklessTransactionQueue; } getPendingTransactionQueue()497 auto& getPendingTransactionQueue() { 498 return mFlinger->mTransactionHandler.mPendingTransactionQueues; 499 } getPendingTransactionCount()500 size_t getPendingTransactionCount() { 501 return mFlinger->mTransactionHandler.mPendingTransactionCount.load(); 502 } 503 setTransactionState(const FrameTimelineInfo & frameTimelineInfo,Vector<ComposerState> & states,const 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)504 auto setTransactionState( 505 const FrameTimelineInfo& frameTimelineInfo, Vector<ComposerState>& states, 506 const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, 507 const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime, 508 bool isAutoTimestamp, const std::vector<client_cache_t>& uncacheBuffers, 509 bool hasListenerCallbacks, std::vector<ListenerCallbacks>& listenerCallbacks, 510 uint64_t transactionId, const std::vector<uint64_t>& mergedTransactionIds) { 511 return mFlinger->setTransactionState(frameTimelineInfo, states, displays, flags, applyToken, 512 inputWindowCommands, desiredPresentTime, 513 isAutoTimestamp, uncacheBuffers, hasListenerCallbacks, 514 listenerCallbacks, transactionId, 515 mergedTransactionIds); 516 } 517 setTransactionStateInternal(TransactionState & transaction)518 auto setTransactionStateInternal(TransactionState& transaction) { 519 return mFlinger->mTransactionHandler.queueTransaction(std::move(transaction)); 520 } 521 flushTransactionQueues()522 auto flushTransactionQueues() { 523 return FTL_FAKE_GUARD(kMainThreadContext, mFlinger->flushTransactionQueues(kVsyncId)); 524 } 525 onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)526 auto onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 527 return mFlinger->onTransact(code, data, reply, flags); 528 } 529 getGpuContextPriority()530 auto getGpuContextPriority() { return mFlinger->getGpuContextPriority(); } 531 calculateMaxAcquiredBufferCount(Fps refreshRate,std::chrono::nanoseconds presentLatency)532 auto calculateMaxAcquiredBufferCount(Fps refreshRate, 533 std::chrono::nanoseconds presentLatency) const { 534 return SurfaceFlinger::calculateMaxAcquiredBufferCount(refreshRate, presentLatency); 535 } 536 setDesiredDisplayModeSpecs(const sp<IBinder> & displayToken,const gui::DisplayModeSpecs & specs)537 auto setDesiredDisplayModeSpecs(const sp<IBinder>& displayToken, 538 const gui::DisplayModeSpecs& specs) { 539 return mFlinger->setDesiredDisplayModeSpecs(displayToken, specs); 540 } 541 onActiveDisplayChanged(const DisplayDevice * inactiveDisplayPtr,const DisplayDevice & activeDisplay)542 void onActiveDisplayChanged(const DisplayDevice* inactiveDisplayPtr, 543 const DisplayDevice& activeDisplay) { 544 Mutex::Autolock lock(mFlinger->mStateLock); 545 ftl::FakeGuard guard(kMainThreadContext); 546 mFlinger->onActiveDisplayChangedLocked(inactiveDisplayPtr, activeDisplay); 547 } 548 createLayer(LayerCreationArgs & args,const sp<IBinder> & parentHandle,gui::CreateSurfaceResult & outResult)549 auto createLayer(LayerCreationArgs& args, const sp<IBinder>& parentHandle, 550 gui::CreateSurfaceResult& outResult) { 551 args.parentHandle = parentHandle; 552 return mFlinger->createLayer(args, outResult); 553 } 554 mirrorLayer(const LayerCreationArgs & args,const sp<IBinder> & mirrorFromHandle,gui::CreateSurfaceResult & outResult)555 auto mirrorLayer(const LayerCreationArgs& args, const sp<IBinder>& mirrorFromHandle, 556 gui::CreateSurfaceResult& outResult) { 557 return mFlinger->mirrorLayer(args, mirrorFromHandle, outResult); 558 } 559 updateLayerMetadataSnapshot()560 void updateLayerMetadataSnapshot() { mFlinger->updateLayerMetadataSnapshot(); } 561 getDynamicDisplayInfoFromToken(const sp<IBinder> & displayToken,ui::DynamicDisplayInfo * dynamicDisplayInfo)562 void getDynamicDisplayInfoFromToken(const sp<IBinder>& displayToken, 563 ui::DynamicDisplayInfo* dynamicDisplayInfo) { 564 mFlinger->getDynamicDisplayInfoFromToken(displayToken, dynamicDisplayInfo); 565 } 566 createVirtualDisplayDevice(const sp<IBinder> displayToken,VirtualDisplayId displayId,float requestedRefreshRate)567 sp<DisplayDevice> createVirtualDisplayDevice(const sp<IBinder> displayToken, 568 VirtualDisplayId displayId, 569 float requestedRefreshRate) { 570 constexpr ui::Size kResolution = {1080, 1920}; 571 auto compositionDisplay = compositionengine::impl:: 572 createDisplay(mFlinger->getCompositionEngine(), 573 compositionengine::DisplayCreationArgsBuilder() 574 .setId(displayId) 575 .setPixels(kResolution) 576 .setPowerAdvisor(&mPowerAdvisor) 577 .build()); 578 DisplayDeviceCreationArgs creationArgs(mFlinger, mFlinger->getHwComposer(), displayToken, 579 compositionDisplay); 580 creationArgs.requestedRefreshRate = Fps::fromValue(requestedRefreshRate); 581 creationArgs.nativeWindow = sp<mock::NativeWindow>::make(); 582 return sp<DisplayDevice>::make(creationArgs); 583 } 584 getDisplayStats(const sp<IBinder> & displayToken,DisplayStatInfo * outInfo)585 status_t getDisplayStats(const sp<IBinder>& displayToken, DisplayStatInfo* outInfo) { 586 return mFlinger->getDisplayStats(displayToken, outInfo); 587 } 588 589 /* ------------------------------------------------------------------------ 590 * Read-only access to private data to assert post-conditions. 591 */ 592 getVisibleRegionsDirty()593 const auto& getVisibleRegionsDirty() const { return mFlinger->mVisibleRegionsDirty; } getHwComposer()594 auto& getHwComposer() const { 595 return static_cast<impl::HWComposer&>(mFlinger->getHwComposer()); 596 } getCompositionEngine()597 auto& getCompositionEngine() const { return mFlinger->getCompositionEngine(); } 598 getFrameTracer()599 mock::FrameTracer* getFrameTracer() const { 600 return static_cast<mock::FrameTracer*>(mFlinger->mFrameTracer.get()); 601 } 602 603 /* ------------------------------------------------------------------------ 604 * Read-write access to private data to set up preconditions and assert 605 * post-conditions. 606 */ 607 displays()608 const auto& displays() const { return mFlinger->mDisplays; } physicalDisplays()609 const auto& physicalDisplays() const { return mFlinger->mPhysicalDisplays; } currentState()610 const auto& currentState() const { return mFlinger->mCurrentState; } drawingState()611 const auto& drawingState() const { return mFlinger->mDrawingState; } transactionFlags()612 const auto& transactionFlags() const { return mFlinger->mTransactionFlags; } 613 hwcPhysicalDisplayIdMap()614 const auto& hwcPhysicalDisplayIdMap() const { return getHwComposer().mPhysicalDisplayIdMap; } hwcDisplayData()615 const auto& hwcDisplayData() const { return getHwComposer().mDisplayData; } 616 mutableSupportsWideColor()617 auto& mutableSupportsWideColor() { return mFlinger->mSupportsWideColor; } 618 mutableCurrentState()619 auto& mutableCurrentState() { return mFlinger->mCurrentState; } mutableDisplayColorSetting()620 auto& mutableDisplayColorSetting() { return mFlinger->mDisplayColorSetting; } mutableDisplays()621 auto& mutableDisplays() { return mFlinger->mDisplays; } mutablePhysicalDisplays()622 auto& mutablePhysicalDisplays() { return mFlinger->mPhysicalDisplays; } mutableDrawingState()623 auto& mutableDrawingState() { return mFlinger->mDrawingState; } mutableGeometryDirty()624 auto& mutableGeometryDirty() { return mFlinger->mGeometryDirty; } mutableVisibleRegionsDirty()625 auto& mutableVisibleRegionsDirty() { return mFlinger->mVisibleRegionsDirty; } mutableMainThreadId()626 auto& mutableMainThreadId() { return mFlinger->mMainThreadId; } mutablePendingHotplugEvents()627 auto& mutablePendingHotplugEvents() { return mFlinger->mPendingHotplugEvents; } mutableTexturePool()628 auto& mutableTexturePool() { return mFlinger->mTexturePool; } mutableTransactionFlags()629 auto& mutableTransactionFlags() { return mFlinger->mTransactionFlags; } mutableDebugDisableHWC()630 auto& mutableDebugDisableHWC() { return mFlinger->mDebugDisableHWC; } mutableMaxRenderTargetSize()631 auto& mutableMaxRenderTargetSize() { return mFlinger->mMaxRenderTargetSize; } 632 mutableHwcDisplayData()633 auto& mutableHwcDisplayData() { return getHwComposer().mDisplayData; } mutableHwcPhysicalDisplayIdMap()634 auto& mutableHwcPhysicalDisplayIdMap() { return getHwComposer().mPhysicalDisplayIdMap; } mutablePrimaryHwcDisplayId()635 auto& mutablePrimaryHwcDisplayId() { return getHwComposer().mPrimaryHwcDisplayId; } mutableActiveDisplayId()636 auto& mutableActiveDisplayId() { return mFlinger->mActiveDisplayId; } mutablePreviouslyComposedLayers()637 auto& mutablePreviouslyComposedLayers() { return mFlinger->mPreviouslyComposedLayers; } 638 mutableActiveDisplayRotationFlags()639 auto& mutableActiveDisplayRotationFlags() { 640 return SurfaceFlinger::sActiveDisplayRotationFlags; 641 } 642 fromHandle(const sp<IBinder> & handle)643 auto fromHandle(const sp<IBinder>& handle) { return LayerHandle::getLayer(handle); } 644 ~TestableSurfaceFlinger()645 ~TestableSurfaceFlinger() { 646 // All these pointer and container clears help ensure that GMock does 647 // not report a leaked object, since the SurfaceFlinger instance may 648 // still be referenced by something despite our best efforts to destroy 649 // it after each test is done. 650 mutableDisplays().clear(); 651 mutableCurrentState().displays.clear(); 652 mutableDrawingState().displays.clear(); 653 mFlinger->mScheduler.reset(); 654 mFlinger->mCompositionEngine->setHwComposer(std::unique_ptr<HWComposer>()); 655 mFlinger->mRenderEngine = std::unique_ptr<renderengine::RenderEngine>(); 656 mFlinger->mCompositionEngine->setRenderEngine(mFlinger->mRenderEngine.get()); 657 } 658 659 /* ------------------------------------------------------------------------ 660 * Wrapper classes for Read-write access to private data to set up 661 * preconditions and assert post-conditions. 662 */ 663 struct HWC2Display : public HWC2::impl::Display { HWC2DisplayHWC2Display664 HWC2Display( 665 Hwc2::Composer& composer, 666 const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability>& 667 capabilities, 668 hal::HWDisplayId id, hal::DisplayType type) 669 : HWC2::impl::Display(composer, capabilities, id, type) {} ~HWC2DisplayHWC2Display670 ~HWC2Display() { 671 // Prevents a call to disable vsyncs. 672 mType = hal::DisplayType::INVALID; 673 } 674 mutableIsConnectedHWC2Display675 auto& mutableIsConnected() { return this->mIsConnected; } mutableLayersHWC2Display676 auto& mutableLayers() { return this->mLayers; } 677 }; 678 679 class FakeHwcDisplayInjector { 680 public: 681 static constexpr hal::HWDisplayId DEFAULT_HWC_DISPLAY_ID = 1000; 682 static constexpr ui::Size DEFAULT_RESOLUTION{1920, 1280}; 683 static constexpr int32_t DEFAULT_VSYNC_PERIOD = 16'666'667; 684 static constexpr int32_t DEFAULT_CONFIG_GROUP = 7; 685 static constexpr int32_t DEFAULT_DPI = 320; 686 static constexpr hal::HWConfigId DEFAULT_ACTIVE_CONFIG = 0; 687 static constexpr hal::PowerMode DEFAULT_POWER_MODE = hal::PowerMode::ON; 688 FakeHwcDisplayInjector(HalDisplayId displayId,hal::DisplayType hwcDisplayType,bool isPrimary)689 FakeHwcDisplayInjector(HalDisplayId displayId, hal::DisplayType hwcDisplayType, 690 bool isPrimary) 691 : mDisplayId(displayId), mHwcDisplayType(hwcDisplayType), mIsPrimary(isPrimary) {} 692 setHwcDisplayId(hal::HWDisplayId displayId)693 auto& setHwcDisplayId(hal::HWDisplayId displayId) { 694 mHwcDisplayId = displayId; 695 return *this; 696 } 697 setResolution(ui::Size resolution)698 auto& setResolution(ui::Size resolution) { 699 mResolution = resolution; 700 return *this; 701 } 702 setVsyncPeriod(nsecs_t vsyncPeriod)703 auto& setVsyncPeriod(nsecs_t vsyncPeriod) { 704 mVsyncPeriod = vsyncPeriod; 705 return *this; 706 } 707 setDpiX(int32_t dpi)708 auto& setDpiX(int32_t dpi) { 709 mDpiX = dpi; 710 return *this; 711 } 712 setDpiY(int32_t dpi)713 auto& setDpiY(int32_t dpi) { 714 mDpiY = dpi; 715 return *this; 716 } 717 setActiveConfig(hal::HWConfigId config)718 auto& setActiveConfig(hal::HWConfigId config) { 719 mActiveConfig = config; 720 return *this; 721 } 722 setCapabilities(const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability> * capabilities)723 auto& setCapabilities( 724 const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability>* 725 capabilities) { 726 mCapabilities = capabilities; 727 return *this; 728 } 729 setPowerMode(std::optional<hal::PowerMode> mode)730 auto& setPowerMode(std::optional<hal::PowerMode> mode) { 731 mPowerMode = mode; 732 return *this; 733 } 734 inject(TestableSurfaceFlinger * flinger,Hwc2::mock::Composer * composer)735 void inject(TestableSurfaceFlinger* flinger, Hwc2::mock::Composer* composer) { 736 using ::testing::_; 737 using ::testing::DoAll; 738 using ::testing::Return; 739 using ::testing::SetArgPointee; 740 741 static const std::unordered_set< 742 aidl::android::hardware::graphics::composer3::Capability> 743 defaultCapabilities; 744 if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities; 745 746 // Caution - Make sure that any values passed by reference here do 747 // not refer to an instance owned by FakeHwcDisplayInjector. This 748 // class has temporary lifetime, while the constructed HWC2::Display 749 // is much longer lived. 750 auto display = std::make_unique<HWC2Display>(*composer, *mCapabilities, mHwcDisplayId, 751 mHwcDisplayType); 752 display->mutableIsConnected() = true; 753 754 if (mPowerMode) { 755 display->setPowerMode(*mPowerMode); 756 } 757 758 flinger->mutableHwcDisplayData()[mDisplayId].hwcDisplay = std::move(display); 759 760 EXPECT_CALL(*composer, getDisplayConfigs(mHwcDisplayId, _)) 761 .WillRepeatedly( 762 DoAll(SetArgPointee<1>(std::vector<hal::HWConfigId>{mActiveConfig}), 763 Return(hal::Error::NONE))); 764 EXPECT_CALL(*composer, 765 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::WIDTH, _)) 766 .WillRepeatedly(DoAll(SetArgPointee<3>(mResolution.getWidth()), 767 Return(hal::Error::NONE))); 768 769 EXPECT_CALL(*composer, 770 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::HEIGHT, 771 _)) 772 .WillRepeatedly(DoAll(SetArgPointee<3>(mResolution.getHeight()), 773 Return(hal::Error::NONE))); 774 775 EXPECT_CALL(*composer, 776 getDisplayAttribute(mHwcDisplayId, mActiveConfig, 777 hal::Attribute::VSYNC_PERIOD, _)) 778 .WillRepeatedly(DoAll(SetArgPointee<3>(static_cast<int32_t>(mVsyncPeriod)), 779 Return(hal::Error::NONE))); 780 781 EXPECT_CALL(*composer, 782 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::DPI_X, _)) 783 .WillRepeatedly(DoAll(SetArgPointee<3>(mDpiX), Return(hal::Error::NONE))); 784 785 EXPECT_CALL(*composer, 786 getDisplayAttribute(mHwcDisplayId, mActiveConfig, hal::Attribute::DPI_Y, _)) 787 .WillRepeatedly(DoAll(SetArgPointee<3>(mDpiY), Return(hal::Error::NONE))); 788 789 EXPECT_CALL(*composer, 790 getDisplayAttribute(mHwcDisplayId, mActiveConfig, 791 hal::Attribute::CONFIG_GROUP, _)) 792 .WillRepeatedly( 793 DoAll(SetArgPointee<3>(mConfigGroup), Return(hal::Error::NONE))); 794 795 if (mHwcDisplayType == hal::DisplayType::PHYSICAL) { 796 const auto physicalId = PhysicalDisplayId::tryCast(mDisplayId); 797 LOG_ALWAYS_FATAL_IF(!physicalId); 798 flinger->mutableHwcPhysicalDisplayIdMap().emplace(mHwcDisplayId, *physicalId); 799 if (mIsPrimary) { 800 flinger->mutablePrimaryHwcDisplayId() = mHwcDisplayId; 801 } else { 802 // If there is an external HWC display, there should always be a primary ID 803 // as well. Set it to some arbitrary value. 804 auto& primaryId = flinger->mutablePrimaryHwcDisplayId(); 805 if (!primaryId) primaryId = mHwcDisplayId - 1; 806 } 807 } 808 } 809 810 private: 811 const HalDisplayId mDisplayId; 812 const hal::DisplayType mHwcDisplayType; 813 const bool mIsPrimary; 814 815 hal::HWDisplayId mHwcDisplayId = DEFAULT_HWC_DISPLAY_ID; 816 ui::Size mResolution = DEFAULT_RESOLUTION; 817 nsecs_t mVsyncPeriod = DEFAULT_VSYNC_PERIOD; 818 int32_t mDpiX = DEFAULT_DPI; 819 int32_t mDpiY = DEFAULT_DPI; 820 int32_t mConfigGroup = DEFAULT_CONFIG_GROUP; 821 hal::HWConfigId mActiveConfig = DEFAULT_ACTIVE_CONFIG; 822 std::optional<hal::PowerMode> mPowerMode = DEFAULT_POWER_MODE; 823 const std::unordered_set<aidl::android::hardware::graphics::composer3::Capability>* 824 mCapabilities = nullptr; 825 }; 826 827 class FakeDisplayDeviceInjector { 828 public: FakeDisplayDeviceInjector(TestableSurfaceFlinger & flinger,std::shared_ptr<compositionengine::Display> display,std::optional<ui::DisplayConnectionType> connectionType,std::optional<hal::HWDisplayId> hwcDisplayId,bool isPrimary)829 FakeDisplayDeviceInjector(TestableSurfaceFlinger& flinger, 830 std::shared_ptr<compositionengine::Display> display, 831 std::optional<ui::DisplayConnectionType> connectionType, 832 std::optional<hal::HWDisplayId> hwcDisplayId, bool isPrimary) 833 : mFlinger(flinger), 834 mCreationArgs(flinger.mFlinger, flinger.mFlinger->getHwComposer(), mDisplayToken, 835 display), 836 mConnectionType(connectionType), 837 mHwcDisplayId(hwcDisplayId) { 838 mCreationArgs.isPrimary = isPrimary; 839 mCreationArgs.initialPowerMode = hal::PowerMode::ON; 840 } 841 token()842 sp<IBinder> token() const { return mDisplayToken; } 843 physicalDisplay()844 auto physicalDisplay() const { 845 return ftl::Optional(mCreationArgs.compositionDisplay->getDisplayId()) 846 .and_then(&PhysicalDisplayId::tryCast) 847 .and_then(display::getPhysicalDisplay(mFlinger.physicalDisplays())); 848 } 849 mutableDrawingDisplayState()850 DisplayDeviceState& mutableDrawingDisplayState() { 851 return mFlinger.mutableDrawingState().displays.editValueFor(mDisplayToken); 852 } 853 mutableCurrentDisplayState()854 DisplayDeviceState& mutableCurrentDisplayState() { 855 return mFlinger.mutableCurrentState().displays.editValueFor(mDisplayToken); 856 } 857 getDrawingDisplayState()858 const auto& getDrawingDisplayState() { 859 return mFlinger.mutableDrawingState().displays.valueFor(mDisplayToken); 860 } 861 getCurrentDisplayState()862 const auto& getCurrentDisplayState() { 863 return mFlinger.mutableCurrentState().displays.valueFor(mDisplayToken); 864 } 865 mutableDisplayDevice()866 const sp<DisplayDevice>& mutableDisplayDevice() { 867 return mFlinger.mutableDisplays().get(mDisplayToken)->get(); 868 } 869 setDisplayModes(DisplayModes modes,DisplayModeId activeModeId)870 auto& setDisplayModes(DisplayModes modes, DisplayModeId activeModeId) { 871 mDisplayModes = std::move(modes); 872 mCreationArgs.activeModeId = activeModeId; 873 mCreationArgs.refreshRateSelector = nullptr; 874 return *this; 875 } 876 setRefreshRateSelector(RefreshRateSelectorPtr selectorPtr)877 auto& setRefreshRateSelector(RefreshRateSelectorPtr selectorPtr) { 878 mDisplayModes = selectorPtr->displayModes(); 879 mCreationArgs.activeModeId = selectorPtr->getActiveMode().modePtr->getId(); 880 mCreationArgs.refreshRateSelector = std::move(selectorPtr); 881 return *this; 882 } 883 setNativeWindow(const sp<ANativeWindow> & nativeWindow)884 auto& setNativeWindow(const sp<ANativeWindow>& nativeWindow) { 885 mCreationArgs.nativeWindow = nativeWindow; 886 return *this; 887 } 888 setDisplaySurface(const sp<compositionengine::DisplaySurface> & displaySurface)889 auto& setDisplaySurface(const sp<compositionengine::DisplaySurface>& displaySurface) { 890 mCreationArgs.displaySurface = displaySurface; 891 return *this; 892 } 893 setSecure(bool secure)894 auto& setSecure(bool secure) { 895 mCreationArgs.isSecure = secure; 896 return *this; 897 } 898 setPowerMode(std::optional<hal::PowerMode> mode)899 auto& setPowerMode(std::optional<hal::PowerMode> mode) { 900 mCreationArgs.initialPowerMode = mode; 901 return *this; 902 } 903 setHwcColorModes(const std::unordered_map<ui::ColorMode,std::vector<ui::RenderIntent>> hwcColorModes)904 auto& setHwcColorModes( 905 const std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>> 906 hwcColorModes) { 907 mCreationArgs.hwcColorModes = hwcColorModes; 908 return *this; 909 } 910 setHasWideColorGamut(bool hasWideColorGamut)911 auto& setHasWideColorGamut(bool hasWideColorGamut) { 912 mCreationArgs.hasWideColorGamut = hasWideColorGamut; 913 return *this; 914 } 915 setPhysicalOrientation(ui::Rotation orientation)916 auto& setPhysicalOrientation(ui::Rotation orientation) { 917 mCreationArgs.physicalOrientation = orientation; 918 return *this; 919 } 920 skipRegisterDisplay()921 auto& skipRegisterDisplay() { 922 mRegisterDisplay = false; 923 return *this; 924 } 925 inject()926 sp<DisplayDevice> inject() NO_THREAD_SAFETY_ANALYSIS { 927 const auto displayId = mCreationArgs.compositionDisplay->getDisplayId(); 928 929 auto& modes = mDisplayModes; 930 auto& activeModeId = mCreationArgs.activeModeId; 931 932 if (displayId && !mCreationArgs.refreshRateSelector) { 933 if (const auto physicalId = PhysicalDisplayId::tryCast(*displayId)) { 934 if (modes.empty()) { 935 constexpr DisplayModeId kModeId{0}; 936 DisplayModePtr mode = 937 DisplayMode::Builder(FakeHwcDisplayInjector::DEFAULT_ACTIVE_CONFIG) 938 .setId(kModeId) 939 .setPhysicalDisplayId(*physicalId) 940 .setResolution(FakeHwcDisplayInjector::DEFAULT_RESOLUTION) 941 .setVsyncPeriod( 942 FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD) 943 .setDpiX(FakeHwcDisplayInjector::DEFAULT_DPI) 944 .setDpiY(FakeHwcDisplayInjector::DEFAULT_DPI) 945 .setGroup(FakeHwcDisplayInjector::DEFAULT_CONFIG_GROUP) 946 .build(); 947 948 modes = ftl::init::map(kModeId, std::move(mode)); 949 activeModeId = kModeId; 950 } 951 952 mCreationArgs.refreshRateSelector = 953 std::make_shared<scheduler::RefreshRateSelector>(modes, activeModeId); 954 } 955 } 956 957 sp<DisplayDevice> display = sp<DisplayDevice>::make(mCreationArgs); 958 mFlinger.mutableDisplays().emplace_or_replace(mDisplayToken, display); 959 960 DisplayDeviceState state; 961 state.isSecure = mCreationArgs.isSecure; 962 963 if (mConnectionType) { 964 LOG_ALWAYS_FATAL_IF(!displayId); 965 const auto physicalIdOpt = PhysicalDisplayId::tryCast(*displayId); 966 LOG_ALWAYS_FATAL_IF(!physicalIdOpt); 967 const auto physicalId = *physicalIdOpt; 968 969 if (mCreationArgs.isPrimary) { 970 mFlinger.mutableActiveDisplayId() = physicalId; 971 } 972 973 LOG_ALWAYS_FATAL_IF(!mHwcDisplayId); 974 975 const auto activeMode = modes.get(activeModeId); 976 LOG_ALWAYS_FATAL_IF(!activeMode); 977 const auto fps = activeMode->get()->getFps(); 978 979 state.physical = {.id = physicalId, 980 .hwcDisplayId = *mHwcDisplayId, 981 .activeMode = activeMode->get()}; 982 983 mFlinger.mutablePhysicalDisplays().emplace_or_replace(physicalId, mDisplayToken, 984 physicalId, *mConnectionType, 985 std::move(modes), 986 ui::ColorModes(), 987 std::nullopt); 988 989 if (mFlinger.scheduler() && mRegisterDisplay) { 990 mFlinger.scheduler()->registerDisplay(physicalId, 991 display->holdRefreshRateSelector()); 992 } 993 994 display->setActiveMode(activeModeId, fps, fps); 995 } 996 997 mFlinger.mutableCurrentState().displays.add(mDisplayToken, state); 998 mFlinger.mutableDrawingState().displays.add(mDisplayToken, state); 999 1000 return display; 1001 } 1002 1003 private: 1004 TestableSurfaceFlinger& mFlinger; 1005 sp<BBinder> mDisplayToken = sp<BBinder>::make(); 1006 DisplayDeviceCreationArgs mCreationArgs; 1007 DisplayModes mDisplayModes; 1008 bool mRegisterDisplay = true; 1009 const std::optional<ui::DisplayConnectionType> mConnectionType; 1010 const std::optional<hal::HWDisplayId> mHwcDisplayId; 1011 }; 1012 1013 private: 1014 template <typename T> makeMock(bool useNiceMock)1015 static std::unique_ptr<T> makeMock(bool useNiceMock) { 1016 return useNiceMock ? std::make_unique<testing::NiceMock<T>>() : std::make_unique<T>(); 1017 } 1018 1019 template <typename T> makeSharedMock(bool useNiceMock)1020 static std::shared_ptr<T> makeSharedMock(bool useNiceMock) { 1021 return useNiceMock ? std::make_shared<testing::NiceMock<T>>() : std::make_shared<T>(); 1022 } 1023 1024 static constexpr VsyncId kVsyncId{123}; 1025 1026 surfaceflinger::test::Factory mFactory; 1027 sp<SurfaceFlinger> mFlinger; 1028 scheduler::mock::SchedulerCallback mSchedulerCallback; 1029 scheduler::mock::NoOpSchedulerCallback mNoOpSchedulerCallback; 1030 std::unique_ptr<frametimeline::impl::TokenManager> mTokenManager; 1031 scheduler::TestableScheduler* mScheduler = nullptr; 1032 Hwc2::mock::PowerAdvisor mPowerAdvisor; 1033 }; 1034 1035 } // namespace android 1036