| 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 |  | 
| Lloyd Pique | 08c6622 | 2018-10-09 11:53:39 -0700 | [diff] [blame] | 220 | auto& setCapabilities(const std::unordered_set<HWC2::Capability>* capabilities) { | 
|  | 221 | mCapabilities = capabilities; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 222 | return *this; | 
|  | 223 | } | 
|  | 224 |  | 
| Lloyd Pique | 71230d5 | 2018-10-10 10:58:36 -0700 | [diff] [blame] | 225 | auto& setPowerAdvisor(Hwc2::PowerAdvisor* powerAdvisor) { | 
|  | 226 | mPowerAdvisor = powerAdvisor; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 227 | return *this; | 
|  | 228 | } | 
|  | 229 |  | 
|  | 230 | void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) { | 
| Lloyd Pique | 71230d5 | 2018-10-10 10:58:36 -0700 | [diff] [blame] | 231 | static FakePowerAdvisor defaultPowerAdvisor; | 
|  | 232 | if (mPowerAdvisor == nullptr) mPowerAdvisor = &defaultPowerAdvisor; | 
| Lloyd Pique | 08c6622 | 2018-10-09 11:53:39 -0700 | [diff] [blame] | 233 | static const std::unordered_set<HWC2::Capability> defaultCapabilities; | 
|  | 234 | if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities; | 
|  | 235 |  | 
|  | 236 | // Caution - Make sure that any values passed by reference here do | 
|  | 237 | // not refer to an instance owned by FakeHwcDisplayInjector. This | 
|  | 238 | // class has temporary lifetime, while the constructed HWC2::Display | 
|  | 239 | // is much longer lived. | 
| Lloyd Pique | 71230d5 | 2018-10-10 10:58:36 -0700 | [diff] [blame] | 240 | auto display = std::make_unique<HWC2Display>(*composer, *mPowerAdvisor, *mCapabilities, | 
| Michael Wright | 1509a23 | 2018-06-21 02:50:34 +0100 | [diff] [blame] | 241 | mHwcDisplayId, mHwcDisplayType); | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 242 |  | 
|  | 243 | auto config = HWC2::Display::Config::Builder(*display, mActiveConfig); | 
|  | 244 | config.setWidth(mWidth); | 
|  | 245 | config.setHeight(mHeight); | 
|  | 246 | config.setVsyncPeriod(mRefreshRate); | 
|  | 247 | config.setDpiX(mDpiX); | 
|  | 248 | config.setDpiY(mDpiY); | 
|  | 249 | display->mutableConfigs().emplace(mActiveConfig, config.build()); | 
|  | 250 | display->mutableIsConnected() = true; | 
|  | 251 |  | 
|  | 252 | ASSERT_TRUE(flinger->mutableHwcDisplayData().size() > static_cast<size_t>(mType)); | 
|  | 253 | flinger->mutableHwcDisplayData()[mType].reset(); | 
|  | 254 | flinger->mutableHwcDisplayData()[mType].hwcDisplay = display.get(); | 
|  | 255 | flinger->mutableHwcDisplaySlots().emplace(mHwcDisplayId, mType); | 
|  | 256 |  | 
|  | 257 | flinger->mFakeHwcDisplays.push_back(std::move(display)); | 
|  | 258 | } | 
|  | 259 |  | 
|  | 260 | private: | 
|  | 261 | DisplayDevice::DisplayType mType; | 
|  | 262 | HWC2::DisplayType mHwcDisplayType; | 
|  | 263 | hwc2_display_t mHwcDisplayId = DEFAULT_HWC_DISPLAY_ID; | 
|  | 264 | int32_t mWidth = DEFAULT_WIDTH; | 
|  | 265 | int32_t mHeight = DEFAULT_HEIGHT; | 
|  | 266 | int32_t mRefreshRate = DEFAULT_REFRESH_RATE; | 
|  | 267 | int32_t mDpiX = DEFAULT_DPI; | 
|  | 268 | int32_t mDpiY = DEFAULT_DPI; | 
|  | 269 | int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG; | 
| Lloyd Pique | 08c6622 | 2018-10-09 11:53:39 -0700 | [diff] [blame] | 270 | const std::unordered_set<HWC2::Capability>* mCapabilities = nullptr; | 
| Lloyd Pique | 71230d5 | 2018-10-10 10:58:36 -0700 | [diff] [blame] | 271 | Hwc2::PowerAdvisor* mPowerAdvisor = nullptr; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 272 | }; | 
|  | 273 |  | 
|  | 274 | class FakeDisplayDeviceInjector { | 
|  | 275 | public: | 
|  | 276 | FakeDisplayDeviceInjector(TestableSurfaceFlinger& flinger, DisplayDevice::DisplayType type, | 
|  | 277 | int hwcId) | 
|  | 278 | : mFlinger(flinger), mType(type), mHwcId(hwcId) {} | 
|  | 279 |  | 
|  | 280 | sp<IBinder> token() const { return mDisplayToken; } | 
|  | 281 |  | 
|  | 282 | DisplayDeviceState& mutableDrawingDisplayState() { | 
|  | 283 | return mFlinger.mutableDrawingState().displays.editValueFor(mDisplayToken); | 
|  | 284 | } | 
|  | 285 |  | 
|  | 286 | DisplayDeviceState& mutableCurrentDisplayState() { | 
|  | 287 | return mFlinger.mutableCurrentState().displays.editValueFor(mDisplayToken); | 
|  | 288 | } | 
|  | 289 |  | 
| Lloyd Pique | 9d9cf40 | 2018-02-16 17:47:13 -0800 | [diff] [blame] | 290 | const auto& getDrawingDisplayState() { | 
|  | 291 | return mFlinger.mutableDrawingState().displays.valueFor(mDisplayToken); | 
|  | 292 | } | 
|  | 293 |  | 
|  | 294 | const auto& getCurrentDisplayState() { | 
|  | 295 | return mFlinger.mutableCurrentState().displays.valueFor(mDisplayToken); | 
|  | 296 | } | 
|  | 297 |  | 
|  | 298 | auto& mutableDisplayDevice() { return mFlinger.mutableDisplays().valueFor(mDisplayToken); } | 
|  | 299 |  | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 300 | auto& setNativeWindow(const sp<ANativeWindow>& nativeWindow) { | 
|  | 301 | mNativeWindow = nativeWindow; | 
|  | 302 | return *this; | 
|  | 303 | } | 
|  | 304 |  | 
|  | 305 | auto& setDisplaySurface(const sp<DisplaySurface>& displaySurface) { | 
|  | 306 | mDisplaySurface = displaySurface; | 
|  | 307 | return *this; | 
|  | 308 | } | 
|  | 309 |  | 
|  | 310 | auto& setRenderSurface(std::unique_ptr<RE::Surface> renderSurface) { | 
|  | 311 | mRenderSurface = std::move(renderSurface); | 
|  | 312 | return *this; | 
|  | 313 | } | 
|  | 314 |  | 
|  | 315 | auto& setSecure(bool secure) { | 
|  | 316 | mSecure = secure; | 
|  | 317 | return *this; | 
|  | 318 | } | 
|  | 319 |  | 
|  | 320 | sp<DisplayDevice> inject() { | 
| Peiyong Lin | d6fa4a7 | 2018-04-17 15:09:44 -0700 | [diff] [blame] | 321 | std::unordered_map<ui::ColorMode, std::vector<ui::RenderIntent>> hdrAndRenderIntents; | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 322 | sp<DisplayDevice> device = | 
|  | 323 | new DisplayDevice(mFlinger.mFlinger.get(), mType, mHwcId, mSecure, mDisplayToken, | 
|  | 324 | mNativeWindow, mDisplaySurface, std::move(mRenderSurface), 0, | 
| Peiyong Lin | d6fa4a7 | 2018-04-17 15:09:44 -0700 | [diff] [blame] | 325 | 0, false, HdrCapabilities(), 0, hdrAndRenderIntents, | 
|  | 326 | HWC_POWER_MODE_NORMAL); | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 327 | mFlinger.mutableDisplays().add(mDisplayToken, device); | 
|  | 328 |  | 
|  | 329 | DisplayDeviceState state(mType, mSecure); | 
|  | 330 | mFlinger.mutableCurrentState().displays.add(mDisplayToken, state); | 
|  | 331 | mFlinger.mutableDrawingState().displays.add(mDisplayToken, state); | 
|  | 332 |  | 
| Lloyd Pique | 9d9cf40 | 2018-02-16 17:47:13 -0800 | [diff] [blame] | 333 | if (mType >= DisplayDevice::DISPLAY_PRIMARY && mType < DisplayDevice::DISPLAY_VIRTUAL) { | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 334 | mFlinger.mutableBuiltinDisplays()[mType] = mDisplayToken; | 
|  | 335 | } | 
|  | 336 |  | 
|  | 337 | return device; | 
|  | 338 | } | 
|  | 339 |  | 
|  | 340 | private: | 
|  | 341 | TestableSurfaceFlinger& mFlinger; | 
|  | 342 | sp<BBinder> mDisplayToken = new BBinder(); | 
|  | 343 | DisplayDevice::DisplayType mType; | 
|  | 344 | int mHwcId; | 
|  | 345 | sp<ANativeWindow> mNativeWindow; | 
|  | 346 | sp<DisplaySurface> mDisplaySurface; | 
|  | 347 | std::unique_ptr<RE::Surface> mRenderSurface; | 
|  | 348 | bool mSecure = false; | 
|  | 349 | }; | 
|  | 350 |  | 
| Lloyd Pique | 2d3ee6d | 2018-01-17 13:42:24 -0800 | [diff] [blame] | 351 | sp<SurfaceFlinger> mFlinger = new SurfaceFlinger(SurfaceFlinger::SkipInitialization); | 
| Lloyd Pique | fc12f56 | 2018-01-22 18:44:59 -0800 | [diff] [blame] | 352 |  | 
|  | 353 | // We need to keep a reference to these so they are properly destroyed. | 
|  | 354 | std::vector<std::unique_ptr<HWC2Display>> mFakeHwcDisplays; | 
| Lloyd Pique | f58625d | 2017-12-19 13:22:33 -0800 | [diff] [blame] | 355 | }; | 
|  | 356 |  | 
|  | 357 | } // namespace android |