| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 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 "DisplayDevice.h" | 
 | 20 | #include "SurfaceFlinger.h" | 
 | 21 |  | 
 | 22 | namespace android { | 
 | 23 |  | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 24 | class EventThread; | 
 | 25 |  | 
 | 26 | namespace RE { | 
 | 27 | class RenderEngine; | 
 | 28 | } | 
 | 29 |  | 
 | 30 | namespace Hwc2 { | 
 | 31 | class Composer; | 
 | 32 | } | 
 | 33 |  | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 34 | class TestableSurfaceFlinger { | 
 | 35 | public: | 
 | 36 |     // Extend this as needed for accessing SurfaceFlinger private (and public) | 
 | 37 |     // functions. | 
 | 38 |  | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 39 |     void setupRenderEngine(std::unique_ptr<RE::RenderEngine> renderEngine) { | 
 | 40 |         mFlinger->getBE().mRenderEngine = std::move(renderEngine); | 
 | 41 |     } | 
 | 42 |  | 
 | 43 |     void setupComposer(std::unique_ptr<Hwc2::Composer> composer) { | 
 | 44 |         mFlinger->getBE().mHwc.reset(new HWComposer(std::move(composer))); | 
 | 45 |     } | 
 | 46 |  | 
| Lloyd Pique | 5b36f3f | 2018-01-17 11:57:07 -0800 | [diff] [blame] | 47 |     using CreateBufferQueueFunction = SurfaceFlinger::CreateBufferQueueFunction; | 
| Lloyd Pique | 5b36f3f | 2018-01-17 11:57:07 -0800 | [diff] [blame] | 48 |     void setCreateBufferQueueFunction(CreateBufferQueueFunction f) { | 
 | 49 |         mFlinger->mCreateBufferQueue = f; | 
 | 50 |     } | 
 | 51 |  | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 52 |     using CreateNativeWindowSurfaceFunction = SurfaceFlinger::CreateNativeWindowSurfaceFunction; | 
 | 53 |     void setCreateNativeWindowSurface(CreateNativeWindowSurfaceFunction f) { | 
 | 54 |         mFlinger->mCreateNativeWindowSurface = f; | 
 | 55 |     } | 
 | 56 |  | 
 | 57 |     using HotplugEvent = SurfaceFlinger::HotplugEvent; | 
 | 58 |  | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 59 |     /* ------------------------------------------------------------------------ | 
 | 60 |      * Forwarding for functions being tested | 
 | 61 |      */ | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 62 |  | 
| Lloyd Pique | a482f99 | 2018-01-22 19:00:34 -0800 | [diff] [blame] | 63 |     auto createDisplay(const String8& displayName, bool secure) { | 
 | 64 |         return mFlinger->createDisplay(displayName, secure); | 
 | 65 |     } | 
 | 66 |  | 
 | 67 |     auto destroyDisplay(const sp<IBinder>& display) { return mFlinger->destroyDisplay(display); } | 
 | 68 |  | 
| Lloyd Pique | d6fbb8a | 2018-01-22 19:08:36 -0800 | [diff] [blame] | 69 |     auto resetDisplayState() { return mFlinger->resetDisplayState(); } | 
 | 70 |  | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 71 |     auto setupNewDisplayDeviceInternal(const wp<IBinder>& display, int hwcId, | 
 | 72 |                                        const DisplayDeviceState& state, | 
 | 73 |                                        const sp<DisplaySurface>& dispSurface, | 
 | 74 |                                        const sp<IGraphicBufferProducer>& producer) { | 
 | 75 |         return mFlinger->setupNewDisplayDeviceInternal(display, hwcId, state, dispSurface, | 
 | 76 |                                                        producer); | 
 | 77 |     } | 
 | 78 |  | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 79 |     auto handleTransactionLocked(uint32_t transactionFlags) { | 
 | 80 |         return mFlinger->handleTransactionLocked(transactionFlags); | 
 | 81 |     } | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 82 |  | 
| Lloyd Pique | 6cf1103 | 2018-01-22 18:57:44 -0800 | [diff] [blame] | 83 |     auto onHotplugReceived(int32_t sequenceId, hwc2_display_t display, | 
 | 84 |                            HWC2::Connection connection) { | 
 | 85 |         return mFlinger->onHotplugReceived(sequenceId, display, connection); | 
 | 86 |     } | 
 | 87 |  | 
| Lloyd Pique | 9d9cf40 | 2018-02-16 17:47:13 -0800 | [diff] [blame] | 88 |     auto setDisplayStateLocked(const DisplayState& s) { return mFlinger->setDisplayStateLocked(s); } | 
 | 89 |  | 
| Lloyd Pique | 86016da | 2018-03-01 16:09:38 -0800 | [diff] [blame] | 90 |     auto onInitializeDisplays() { return mFlinger->onInitializeDisplays(); } | 
 | 91 |  | 
| Lloyd Pique | 7d4aa6c | 2018-03-01 16:36:35 -0800 | [diff] [blame] | 92 |     auto setPowerModeInternal(const sp<DisplayDevice>& hw, int mode, bool stateLockHeld = false) { | 
 | 93 |         return mFlinger->setPowerModeInternal(hw, mode, stateLockHeld); | 
 | 94 |     } | 
 | 95 |  | 
| Lloyd Pique | 86016da | 2018-03-01 16:09:38 -0800 | [diff] [blame] | 96 |     /* ------------------------------------------------------------------------ | 
 | 97 |      * Read-only access to private data to assert post-conditions. | 
 | 98 |      */ | 
 | 99 |  | 
 | 100 |     const auto& getAnimFrameTracker() const { return mFlinger->mAnimFrameTracker; } | 
| Lloyd Pique | 7d4aa6c | 2018-03-01 16:36:35 -0800 | [diff] [blame] | 101 |     const auto& getHasPoweredOff() const { return mFlinger->mHasPoweredOff; } | 
 | 102 |     const auto& getHWVsyncAvailable() const { return mFlinger->mHWVsyncAvailable; } | 
 | 103 |     const auto& getVisibleRegionsDirty() const { return mFlinger->mVisibleRegionsDirty; } | 
 | 104 |  | 
| Lloyd Pique | 86016da | 2018-03-01 16:09:38 -0800 | [diff] [blame] | 105 |     const auto& getCompositorTiming() const { return mFlinger->getBE().mCompositorTiming; } | 
 | 106 |  | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 107 |     /* ------------------------------------------------------------------------ | 
 | 108 |      * Read-write access to private data to set up preconditions and assert | 
 | 109 |      * post-conditions. | 
 | 110 |      */ | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 111 |  | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 112 |     auto& mutableHasWideColorDisplay() { return SurfaceFlinger::hasWideColorDisplay; } | 
 | 113 |  | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 114 |     auto& mutableBuiltinDisplays() { return mFlinger->mBuiltinDisplays; } | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 115 |     auto& mutableCurrentState() { return mFlinger->mCurrentState; } | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 116 |     auto& mutableDisplays() { return mFlinger->mDisplays; } | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 117 |     auto& mutableDisplayColorSetting() { return mFlinger->mDisplayColorSetting; } | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 118 |     auto& mutableDrawingState() { return mFlinger->mDrawingState; } | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 119 |     auto& mutableEventControlThread() { return mFlinger->mEventControlThread; } | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 120 |     auto& mutableEventQueue() { return mFlinger->mEventQueue; } | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 121 |     auto& mutableEventThread() { return mFlinger->mEventThread; } | 
| Lloyd Pique | d6fbb8a | 2018-01-22 19:08:36 -0800 | [diff] [blame] | 122 |     auto& mutableHWVsyncAvailable() { return mFlinger->mHWVsyncAvailable; } | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 123 |     auto& mutableInterceptor() { return mFlinger->mInterceptor; } | 
| Lloyd Pique | 6cf1103 | 2018-01-22 18:57:44 -0800 | [diff] [blame] | 124 |     auto& mutableMainThreadId() { return mFlinger->mMainThreadId; } | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 125 |     auto& mutablePendingHotplugEvents() { return mFlinger->mPendingHotplugEvents; } | 
| Lloyd Pique | d6fbb8a | 2018-01-22 19:08:36 -0800 | [diff] [blame] | 126 |     auto& mutablePrimaryHWVsyncEnabled() { return mFlinger->mPrimaryHWVsyncEnabled; } | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 127 |     auto& mutableTransactionFlags() { return mFlinger->mTransactionFlags; } | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 128 |     auto& mutableUseHwcVirtualDisplays() { return mFlinger->mUseHwcVirtualDisplays; } | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 129 |  | 
| Lloyd Pique | 6cf1103 | 2018-01-22 18:57:44 -0800 | [diff] [blame] | 130 |     auto& mutableComposerSequenceId() { return mFlinger->getBE().mComposerSequenceId; } | 
| Lloyd Pique | bc79209 | 2018-01-17 11:52:30 -0800 | [diff] [blame] | 131 |     auto& mutableHwcDisplayData() { return mFlinger->getBE().mHwc->mDisplayData; } | 
 | 132 |     auto& mutableHwcDisplaySlots() { return mFlinger->getBE().mHwc->mHwcDisplaySlots; } | 
 | 133 |  | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 134 |     ~TestableSurfaceFlinger() { | 
 | 135 |         // All these pointer and container clears help ensure that GMock does | 
 | 136 |         // not report a leaked object, since the SurfaceFlinger instance may | 
 | 137 |         // still be referenced by something despite our best efforts to destroy | 
 | 138 |         // it after each test is done. | 
 | 139 |         mutableDisplays().clear(); | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 140 |         mutableEventControlThread().reset(); | 
 | 141 |         mutableEventQueue().reset(); | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 142 |         mutableEventThread().reset(); | 
| Lloyd Pique | 1fa4d46 | 2018-01-22 18:03:16 -0800 | [diff] [blame] | 143 |         mutableInterceptor().reset(); | 
| Lloyd Pique | e39cad2 | 2017-12-20 17:01:29 -0800 | [diff] [blame] | 144 |         mFlinger->getBE().mHwc.reset(); | 
 | 145 |         mFlinger->getBE().mRenderEngine.reset(); | 
 | 146 |     } | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 147 |  | 
| Lloyd Pique | bc79209 | 2018-01-17 11:52:30 -0800 | [diff] [blame] | 148 |     /* ------------------------------------------------------------------------ | 
 | 149 |      * Wrapper classes for Read-write access to private data to set up | 
 | 150 |      * preconditions and assert post-conditions. | 
 | 151 |      */ | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 152 |     class FakePowerAdvisor : public Hwc2::PowerAdvisor { | 
 | 153 |     public: | 
 | 154 |         FakePowerAdvisor() = default; | 
 | 155 |         ~FakePowerAdvisor() override = default; | 
 | 156 |         void setExpensiveRenderingExpected(hwc2_display_t, bool) override { } | 
 | 157 |     }; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 158 |  | 
| Lloyd Pique | bc79209 | 2018-01-17 11:52:30 -0800 | [diff] [blame] | 159 |     struct HWC2Display : public HWC2::Display { | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 160 |         HWC2Display(Hwc2::Composer& composer, Hwc2::PowerAdvisor& advisor, | 
| Lloyd Pique | bc79209 | 2018-01-17 11:52:30 -0800 | [diff] [blame] | 161 |                     const std::unordered_set<HWC2::Capability>& capabilities, hwc2_display_t id, | 
 | 162 |                     HWC2::DisplayType type) | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 163 |               : HWC2::Display(composer, advisor, capabilities, id, type) {} | 
| Lloyd Pique | bc79209 | 2018-01-17 11:52:30 -0800 | [diff] [blame] | 164 |         ~HWC2Display() { | 
 | 165 |             // Prevents a call to disable vsyncs. | 
 | 166 |             mType = HWC2::DisplayType::Invalid; | 
 | 167 |         } | 
 | 168 |  | 
 | 169 |         auto& mutableIsConnected() { return this->mIsConnected; } | 
 | 170 |         auto& mutableConfigs() { return this->mConfigs; } | 
 | 171 |     }; | 
 | 172 |  | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 173 |     class FakeHwcDisplayInjector { | 
 | 174 |     public: | 
 | 175 |         static constexpr hwc2_display_t DEFAULT_HWC_DISPLAY_ID = 1000; | 
 | 176 |         static constexpr int32_t DEFAULT_WIDTH = 1920; | 
 | 177 |         static constexpr int32_t DEFAULT_HEIGHT = 1280; | 
 | 178 |         static constexpr int32_t DEFAULT_REFRESH_RATE = 16'666'666; | 
 | 179 |         static constexpr int32_t DEFAULT_DPI = 320; | 
 | 180 |         static constexpr int32_t DEFAULT_ACTIVE_CONFIG = 0; | 
 | 181 |  | 
 | 182 |         FakeHwcDisplayInjector(DisplayDevice::DisplayType type, HWC2::DisplayType hwcDisplayType) | 
 | 183 |               : mType(type), mHwcDisplayType(hwcDisplayType) {} | 
 | 184 |  | 
 | 185 |         auto& setHwcDisplayId(hwc2_display_t displayId) { | 
 | 186 |             mHwcDisplayId = displayId; | 
 | 187 |             return *this; | 
 | 188 |         } | 
 | 189 |  | 
 | 190 |         auto& setWidth(int32_t width) { | 
 | 191 |             mWidth = width; | 
 | 192 |             return *this; | 
 | 193 |         } | 
 | 194 |  | 
 | 195 |         auto& setHeight(int32_t height) { | 
 | 196 |             mHeight = height; | 
 | 197 |             return *this; | 
 | 198 |         } | 
 | 199 |  | 
 | 200 |         auto& setRefreshRate(int32_t refreshRate) { | 
 | 201 |             mRefreshRate = refreshRate; | 
 | 202 |             return *this; | 
 | 203 |         } | 
 | 204 |  | 
 | 205 |         auto& setDpiX(int32_t dpi) { | 
 | 206 |             mDpiX = dpi; | 
 | 207 |             return *this; | 
 | 208 |         } | 
 | 209 |  | 
 | 210 |         auto& setDpiY(int32_t dpi) { | 
 | 211 |             mDpiY = dpi; | 
 | 212 |             return *this; | 
 | 213 |         } | 
 | 214 |  | 
 | 215 |         auto& setActiveConfig(int32_t config) { | 
 | 216 |             mActiveConfig = config; | 
 | 217 |             return *this; | 
 | 218 |         } | 
 | 219 |  | 
 | 220 |         auto& addCapability(HWC2::Capability cap) { | 
 | 221 |             mCapabilities.emplace(cap); | 
 | 222 |             return *this; | 
 | 223 |         } | 
 | 224 |  | 
 | 225 |         void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) { | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 226 |             auto display = std::make_unique<HWC2Display>(*composer, mPowerAdvisor, mCapabilities, | 
 | 227 |                                                          mHwcDisplayId, mHwcDisplayType); | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 228 |  | 
 | 229 |             auto config = HWC2::Display::Config::Builder(*display, mActiveConfig); | 
 | 230 |             config.setWidth(mWidth); | 
 | 231 |             config.setHeight(mHeight); | 
 | 232 |             config.setVsyncPeriod(mRefreshRate); | 
 | 233 |             config.setDpiX(mDpiX); | 
 | 234 |             config.setDpiY(mDpiY); | 
 | 235 |             display->mutableConfigs().emplace(mActiveConfig, config.build()); | 
 | 236 |             display->mutableIsConnected() = true; | 
 | 237 |  | 
 | 238 |             ASSERT_TRUE(flinger->mutableHwcDisplayData().size() > static_cast<size_t>(mType)); | 
 | 239 |             flinger->mutableHwcDisplayData()[mType].reset(); | 
 | 240 |             flinger->mutableHwcDisplayData()[mType].hwcDisplay = display.get(); | 
 | 241 |             flinger->mutableHwcDisplaySlots().emplace(mHwcDisplayId, mType); | 
 | 242 |  | 
 | 243 |             flinger->mFakeHwcDisplays.push_back(std::move(display)); | 
 | 244 |         } | 
 | 245 |  | 
 | 246 |     private: | 
 | 247 |         DisplayDevice::DisplayType mType; | 
 | 248 |         HWC2::DisplayType mHwcDisplayType; | 
 | 249 |         hwc2_display_t mHwcDisplayId = DEFAULT_HWC_DISPLAY_ID; | 
 | 250 |         int32_t mWidth = DEFAULT_WIDTH; | 
 | 251 |         int32_t mHeight = DEFAULT_HEIGHT; | 
 | 252 |         int32_t mRefreshRate = DEFAULT_REFRESH_RATE; | 
 | 253 |         int32_t mDpiX = DEFAULT_DPI; | 
 | 254 |         int32_t mDpiY = DEFAULT_DPI; | 
 | 255 |         int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG; | 
 | 256 |         std::unordered_set<HWC2::Capability> mCapabilities; | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 257 |         FakePowerAdvisor mPowerAdvisor; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 258 |     }; | 
 | 259 |  | 
 | 260 |     class FakeDisplayDeviceInjector { | 
 | 261 |     public: | 
 | 262 |         FakeDisplayDeviceInjector(TestableSurfaceFlinger& flinger, DisplayDevice::DisplayType type, | 
 | 263 |                                   int hwcId) | 
 | 264 |               : mFlinger(flinger), mType(type), mHwcId(hwcId) {} | 
 | 265 |  | 
 | 266 |         sp<IBinder> token() const { return mDisplayToken; } | 
 | 267 |  | 
 | 268 |         DisplayDeviceState& mutableDrawingDisplayState() { | 
 | 269 |             return mFlinger.mutableDrawingState().displays.editValueFor(mDisplayToken); | 
 | 270 |         } | 
 | 271 |  | 
 | 272 |         DisplayDeviceState& mutableCurrentDisplayState() { | 
 | 273 |             return mFlinger.mutableCurrentState().displays.editValueFor(mDisplayToken); | 
 | 274 |         } | 
 | 275 |  | 
| Lloyd Pique | 9d9cf40 | 2018-02-16 17:47:13 -0800 | [diff] [blame] | 276 |         const auto& getDrawingDisplayState() { | 
 | 277 |             return mFlinger.mutableDrawingState().displays.valueFor(mDisplayToken); | 
 | 278 |         } | 
 | 279 |  | 
 | 280 |         const auto& getCurrentDisplayState() { | 
 | 281 |             return mFlinger.mutableCurrentState().displays.valueFor(mDisplayToken); | 
 | 282 |         } | 
 | 283 |  | 
 | 284 |         auto& mutableDisplayDevice() { return mFlinger.mutableDisplays().valueFor(mDisplayToken); } | 
 | 285 |  | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 286 |         auto& setNativeWindow(const sp<ANativeWindow>& nativeWindow) { | 
 | 287 |             mNativeWindow = nativeWindow; | 
 | 288 |             return *this; | 
 | 289 |         } | 
 | 290 |  | 
 | 291 |         auto& setDisplaySurface(const sp<DisplaySurface>& displaySurface) { | 
 | 292 |             mDisplaySurface = displaySurface; | 
 | 293 |             return *this; | 
 | 294 |         } | 
 | 295 |  | 
 | 296 |         auto& setRenderSurface(std::unique_ptr<RE::Surface> renderSurface) { | 
 | 297 |             mRenderSurface = std::move(renderSurface); | 
 | 298 |             return *this; | 
 | 299 |         } | 
 | 300 |  | 
 | 301 |         auto& setSecure(bool secure) { | 
 | 302 |             mSecure = secure; | 
 | 303 |             return *this; | 
 | 304 |         } | 
 | 305 |  | 
 | 306 |         sp<DisplayDevice> inject() { | 
| Peiyong Lin | d6fa4a7 | 2018-04-17 15:09:44 -0700 | [diff] [blame] | 307 |             std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>> hdrAndRenderIntents; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 308 |             sp<DisplayDevice> device = | 
 | 309 |                     new DisplayDevice(mFlinger.mFlinger.get(), mType, mHwcId, mSecure, mDisplayToken, | 
 | 310 |                                       mNativeWindow, mDisplaySurface, std::move(mRenderSurface), 0, | 
| Peiyong Lin | d6fa4a7 | 2018-04-17 15:09:44 -0700 | [diff] [blame] | 311 |                                       0, false, HdrCapabilities(), 0, hdrAndRenderIntents, | 
 | 312 |                                       HWC_POWER_MODE_NORMAL); | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 313 |             mFlinger.mutableDisplays().add(mDisplayToken, device); | 
 | 314 |  | 
 | 315 |             DisplayDeviceState state(mType, mSecure); | 
 | 316 |             mFlinger.mutableCurrentState().displays.add(mDisplayToken, state); | 
 | 317 |             mFlinger.mutableDrawingState().displays.add(mDisplayToken, state); | 
 | 318 |  | 
| Lloyd Pique | 9d9cf40 | 2018-02-16 17:47:13 -0800 | [diff] [blame] | 319 |             if (mType >= DisplayDevice::DISPLAY_PRIMARY && mType < DisplayDevice::DISPLAY_VIRTUAL) { | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 320 |                 mFlinger.mutableBuiltinDisplays()[mType] = mDisplayToken; | 
 | 321 |             } | 
 | 322 |  | 
 | 323 |             return device; | 
 | 324 |         } | 
 | 325 |  | 
 | 326 |     private: | 
 | 327 |         TestableSurfaceFlinger& mFlinger; | 
 | 328 |         sp<BBinder> mDisplayToken = new BBinder(); | 
 | 329 |         DisplayDevice::DisplayType mType; | 
 | 330 |         int mHwcId; | 
 | 331 |         sp<ANativeWindow> mNativeWindow; | 
 | 332 |         sp<DisplaySurface> mDisplaySurface; | 
 | 333 |         std::unique_ptr<RE::Surface> mRenderSurface; | 
 | 334 |         bool mSecure = false; | 
 | 335 |     }; | 
 | 336 |  | 
| Lloyd Pique | 2d3ee6d | 2018-01-17 13:42:24 -0800 | [diff] [blame] | 337 |     sp<SurfaceFlinger> mFlinger = new SurfaceFlinger(SurfaceFlinger::SkipInitialization); | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 338 |  | 
 | 339 |     // We need to keep a reference to these so they are properly destroyed. | 
 | 340 |     std::vector<std::unique_ptr<HWC2Display>> mFakeHwcDisplays; | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 341 | }; | 
 | 342 |  | 
 | 343 | } // namespace android |