• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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