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