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