1501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu/*
2501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * Copyright 2015 The Android Open Source Project
3501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *
4501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
5501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * you may not use this file except in compliance with the License.
6501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * You may obtain a copy of the License at
7501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *
8501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
9501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *
10501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * Unless required by applicable law or agreed to in writing, software
11501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
12501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * See the License for the specific language governing permissions and
14501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * limitations under the License.
15501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu */
16501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
17501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include "hwc2on1adapter/HWC2On1Adapter.h"
18501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
19501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu//#define LOG_NDEBUG 0
20501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
21501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#undef LOG_TAG
22501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#define LOG_TAG "HWC2On1Adapter"
23501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#define ATRACE_TAG ATRACE_TAG_GRAPHICS
24501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
25501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
26501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <inttypes.h>
27501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
28501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <chrono>
29501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <cstdlib>
30501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <sstream>
31501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
32501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <hardware/hwcomposer.h>
33501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <log/log.h>
34501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <utils/Trace.h>
35501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
36501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuusing namespace std::chrono_literals;
37501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
38501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic uint8_t getMinorVersion(struct hwc_composer_device_1* device)
39501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu{
40501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto version = device->common.version & HARDWARE_API_VERSION_2_MAJ_MIN_MASK;
41501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return (version >> 16) & 0xF;
42501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
43501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
44501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wutemplate <typename PFN, typename T>
45501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic hwc2_function_pointer_t asFP(T function)
46501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu{
47501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    static_assert(std::is_same<PFN, T>::value, "Incompatible function pointer");
48501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return reinterpret_cast<hwc2_function_pointer_t>(function);
49501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
50501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
51501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuusing namespace HWC2;
52501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
53501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr Attribute ColorMode = static_cast<Attribute>(6);
54501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
55501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wunamespace android {
56501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
57501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuclass HWC2On1Adapter::Callbacks : public hwc_procs_t {
58501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    public:
59501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        explicit Callbacks(HWC2On1Adapter& adapter) : mAdapter(adapter) {
60501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            invalidate = &invalidateHook;
61501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            vsync = &vsyncHook;
62501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hotplug = &hotplugHook;
63501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
64501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
65501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        static void invalidateHook(const hwc_procs_t* procs) {
66501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto callbacks = static_cast<const Callbacks*>(procs);
67501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            callbacks->mAdapter.hwc1Invalidate();
68501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
69501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
70501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        static void vsyncHook(const hwc_procs_t* procs, int display,
71501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                int64_t timestamp) {
72501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto callbacks = static_cast<const Callbacks*>(procs);
73501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            callbacks->mAdapter.hwc1Vsync(display, timestamp);
74501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
75501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
76501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        static void hotplugHook(const hwc_procs_t* procs, int display,
77501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                int connected) {
78501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto callbacks = static_cast<const Callbacks*>(procs);
79501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            callbacks->mAdapter.hwc1Hotplug(display, connected);
80501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
81501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
82501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    private:
83501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        HWC2On1Adapter& mAdapter;
84501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu};
85501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
86501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic int closeHook(hw_device_t* /*device*/)
87501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu{
88501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Do nothing, since the real work is done in the class destructor, but we
89501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // need to provide a valid function pointer for hwc2_close to call
90501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return 0;
91501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
92501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
93501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuHWC2On1Adapter::HWC2On1Adapter(hwc_composer_device_1_t* hwc1Device)
94501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu  : mDumpString(),
95501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Device(hwc1Device),
96501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1MinorVersion(getMinorVersion(hwc1Device)),
97501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1SupportsVirtualDisplays(false),
98501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1SupportsBackgroundColor(false),
99501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Callbacks(std::make_unique<Callbacks>(*this)),
100501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mCapabilities(),
101501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mLayers(),
102501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1VirtualDisplay(),
103501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mStateMutex(),
104501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mCallbacks(),
105501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHasPendingInvalidate(false),
106501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mPendingVsyncs(),
107501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mPendingHotplugs(),
108501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplays(),
109501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1DisplayMap()
110501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu{
111501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    common.close = closeHook;
112501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    getCapabilities = getCapabilitiesHook;
113501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    getFunction = getFunctionHook;
114501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    populateCapabilities();
115501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    populatePrimary();
116501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Device->registerProcs(mHwc1Device,
117501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            static_cast<const hwc_procs_t*>(mHwc1Callbacks.get()));
118501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
119501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
120501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuHWC2On1Adapter::~HWC2On1Adapter() {
121501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc_close_1(mHwc1Device);
122501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
123501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
124501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::doGetCapabilities(uint32_t* outCount,
125501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t* outCapabilities) {
126501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (outCapabilities == nullptr) {
127501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outCount = mCapabilities.size();
128501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
129501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
130501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
131501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto capabilityIter = mCapabilities.cbegin();
132501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t written = 0; written < *outCount; ++written) {
133501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (capabilityIter == mCapabilities.cend()) {
134501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return;
135501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
136501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        outCapabilities[written] = static_cast<int32_t>(*capabilityIter);
137501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ++capabilityIter;
138501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
139501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
140501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
141501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuhwc2_function_pointer_t HWC2On1Adapter::doGetFunction(
142501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        FunctionDescriptor descriptor) {
143501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (descriptor) {
144501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Device functions
145501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::CreateVirtualDisplay:
146501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
147501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    createVirtualDisplayHook);
148501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::DestroyVirtualDisplay:
149501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
150501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    destroyVirtualDisplayHook);
151501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::Dump:
152501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_DUMP>(dumpHook);
153501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetMaxVirtualDisplayCount:
154501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
155501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    getMaxVirtualDisplayCountHook);
156501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::RegisterCallback:
157501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_REGISTER_CALLBACK>(registerCallbackHook);
158501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
159501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Display functions
160501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::AcceptDisplayChanges:
161501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
162501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::acceptChanges),
163501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::acceptChanges>);
164501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::CreateLayer:
165501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_CREATE_LAYER>(
166501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::createLayer),
167501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::createLayer, hwc2_layer_t*>);
168501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::DestroyLayer:
169501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_DESTROY_LAYER>(
170501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::destroyLayer),
171501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::destroyLayer, hwc2_layer_t>);
172501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetActiveConfig:
173501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_ACTIVE_CONFIG>(
174501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getActiveConfig),
175501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getActiveConfig, hwc2_config_t*>);
176501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetChangedCompositionTypes:
177501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
178501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getChangedCompositionTypes),
179501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getChangedCompositionTypes, uint32_t*,
180501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    hwc2_layer_t*, int32_t*>);
181501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetColorModes:
182501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_COLOR_MODES>(
183501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getColorModes),
184501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getColorModes, uint32_t*, int32_t*>);
185501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetDisplayAttribute:
186501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
187501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    getDisplayAttributeHook);
188501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetDisplayConfigs:
189501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_DISPLAY_CONFIGS>(
190501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getConfigs),
191501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getConfigs, uint32_t*, hwc2_config_t*>);
192501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetDisplayName:
193501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_DISPLAY_NAME>(
194501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getName),
195501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getName, uint32_t*, char*>);
196501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetDisplayRequests:
197501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_DISPLAY_REQUESTS>(
198501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getRequests),
199501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getRequests, int32_t*, uint32_t*, hwc2_layer_t*,
200501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    int32_t*>);
201501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetDisplayType:
202501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_DISPLAY_TYPE>(
203501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getType),
204501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getType, int32_t*>);
205501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetDozeSupport:
206501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_DOZE_SUPPORT>(
207501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getDozeSupport),
208501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getDozeSupport, int32_t*>);
209501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetHdrCapabilities:
210501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_HDR_CAPABILITIES>(
211501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getHdrCapabilities),
212501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getHdrCapabilities, uint32_t*, int32_t*, float*,
213501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    float*, float*>);
214501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetReleaseFences:
215501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_RELEASE_FENCES>(
216501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getReleaseFences),
217501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getReleaseFences, uint32_t*, hwc2_layer_t*,
218501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    int32_t*>);
219501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::PresentDisplay:
220501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_PRESENT_DISPLAY>(
221501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::present),
222501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::present, int32_t*>);
223501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetActiveConfig:
224501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_ACTIVE_CONFIG>(
225501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::setActiveConfig),
226501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::setActiveConfig, hwc2_config_t>);
227501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetClientTarget:
228501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_CLIENT_TARGET>(
229501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::setClientTarget),
230501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::setClientTarget, buffer_handle_t, int32_t,
231501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    int32_t, hwc_region_t>);
232501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetColorMode:
233501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_COLOR_MODE>(setColorModeHook);
234501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetColorTransform:
235501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_COLOR_TRANSFORM>(setColorTransformHook);
236501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetOutputBuffer:
237501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_OUTPUT_BUFFER>(
238501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::setOutputBuffer),
239501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::setOutputBuffer, buffer_handle_t, int32_t>);
240501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetPowerMode:
241501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_POWER_MODE>(setPowerModeHook);
242501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetVsyncEnabled:
243501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_VSYNC_ENABLED>(setVsyncEnabledHook);
244501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::ValidateDisplay:
245501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_VALIDATE_DISPLAY>(
246501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::validate),
247501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::validate, uint32_t*, uint32_t*>);
248501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::GetClientTargetSupport:
249501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
250501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    displayHook<decltype(&Display::getClientTargetSupport),
251501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Display::getClientTargetSupport, uint32_t, uint32_t,
252501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                                                      int32_t, int32_t>);
253501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
254501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Layer functions
255501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetCursorPosition:
256501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_CURSOR_POSITION>(
257501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setCursorPosition),
258501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setCursorPosition, int32_t, int32_t>);
259501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerBuffer:
260501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_BUFFER>(
261501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setBuffer), &Layer::setBuffer,
262501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    buffer_handle_t, int32_t>);
263501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerSurfaceDamage:
264501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
265501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setSurfaceDamage),
266501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setSurfaceDamage, hwc_region_t>);
267501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
268501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Layer state functions
269501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerBlendMode:
270501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_BLEND_MODE>(
271501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    setLayerBlendModeHook);
272501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerColor:
273501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_COLOR>(
274501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setColor), &Layer::setColor,
275501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    hwc_color_t>);
276501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerCompositionType:
277501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
278501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    setLayerCompositionTypeHook);
279501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerDataspace:
280501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_DATASPACE>(setLayerDataspaceHook);
281501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerDisplayFrame:
282501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
283501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setDisplayFrame),
284501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setDisplayFrame, hwc_rect_t>);
285501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerPlaneAlpha:
286501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
287501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setPlaneAlpha),
288501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setPlaneAlpha, float>);
289501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerSidebandStream:
290501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_SIDEBAND_STREAM>(
291501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setSidebandStream),
292501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setSidebandStream, const native_handle_t*>);
293501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerSourceCrop:
294501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
295501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setSourceCrop),
296501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setSourceCrop, hwc_frect_t>);
297501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerTransform:
298501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_TRANSFORM>(setLayerTransformHook);
299501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerVisibleRegion:
300501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
301501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    layerHook<decltype(&Layer::setVisibleRegion),
302501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    &Layer::setVisibleRegion, hwc_region_t>);
303501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case FunctionDescriptor::SetLayerZOrder:
304501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return asFP<HWC2_PFN_SET_LAYER_Z_ORDER>(setLayerZOrderHook);
305501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
306501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default:
307501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE("doGetFunction: Unknown function descriptor: %d (%s)",
308501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    static_cast<int32_t>(descriptor),
309501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    to_string(descriptor).c_str());
310501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return nullptr;
311501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
312501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
313501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
314501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu// Device functions
315501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
316501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::createVirtualDisplay(uint32_t width,
317501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t height, hwc2_display_t* outDisplay) {
318501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
319501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
320501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1VirtualDisplay) {
321501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // We have already allocated our only HWC1 virtual display
322501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("createVirtualDisplay: HWC1 virtual display already allocated");
323501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::NoResources;
324501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
325501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
326501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1VirtualDisplay = std::make_shared<HWC2On1Adapter::Display>(*this,
327501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            HWC2::DisplayType::Virtual);
328501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1VirtualDisplay->populateConfigs(width, height);
329501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto displayId = mHwc1VirtualDisplay->getId();
330501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1DisplayMap[HWC_DISPLAY_VIRTUAL] = displayId;
331501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1VirtualDisplay->setHwc1Id(HWC_DISPLAY_VIRTUAL);
332501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplays.emplace(displayId, mHwc1VirtualDisplay);
333501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outDisplay = displayId;
334501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
335501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
336501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
337501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
338501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::destroyVirtualDisplay(hwc2_display_t displayId) {
339501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
340501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
341501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mHwc1VirtualDisplay || (mHwc1VirtualDisplay->getId() != displayId)) {
342501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadDisplay;
343501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
344501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
345501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1VirtualDisplay.reset();
346501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1DisplayMap.erase(HWC_DISPLAY_VIRTUAL);
347501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplays.erase(displayId);
348501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
349501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
350501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
351501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
352501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::dump(uint32_t* outSize, char* outBuffer) {
353501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (outBuffer != nullptr) {
354501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto copiedBytes = mDumpString.copy(outBuffer, *outSize);
355501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outSize = static_cast<uint32_t>(copiedBytes);
356501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
357501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
358501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
359501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
360501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
361501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "-- HWC2On1Adapter --\n";
362501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
363501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "Adapting to a HWC 1." << static_cast<int>(mHwc1MinorVersion) <<
364501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            " device\n";
365501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
366501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Attempt to acquire the lock for 1 second, but proceed without the lock
367501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // after that, so we can still get some information if we're deadlocked
368501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex,
369501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            std::defer_lock);
370501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    lock.try_lock_for(1s);
371501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
372501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mCapabilities.empty()) {
373501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "Capabilities: None\n";
374501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
375501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "Capabilities:\n";
376501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto capability : mCapabilities) {
377501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << "  " << to_string(capability) << '\n';
378501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
379501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
380501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
381501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "Displays:\n";
382501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& element : mDisplays) {
383501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const auto& display = element.second;
384501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << display->dump();
385501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
386501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << '\n';
387501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
388501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Release the lock before calling into HWC1, and since we no longer require
389501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // mutual exclusion to access mCapabilities or mDisplays
390501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    lock.unlock();
391501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
392501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1Device->dump) {
393501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "HWC1 dump:\n";
394501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::vector<char> hwc1Dump(4096);
395501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Call with size - 1 to preserve a null character at the end
396501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1Device->dump(mHwc1Device, hwc1Dump.data(),
397501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<int>(hwc1Dump.size() - 1));
398501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << hwc1Dump.data();
399501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
400501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
401501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDumpString = output.str();
402501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outSize = static_cast<uint32_t>(mDumpString.size());
403501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
404501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
405501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuuint32_t HWC2On1Adapter::getMaxVirtualDisplayCount() {
406501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mHwc1SupportsVirtualDisplays ? 1 : 0;
407501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
408501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
409501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic bool isValid(Callback descriptor) {
410501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (descriptor) {
411501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Callback::Hotplug: // Fall-through
412501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Callback::Refresh: // Fall-through
413501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Callback::Vsync: return true;
414501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default: return false;
415501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
416501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
417501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
418501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::registerCallback(Callback descriptor,
419501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer) {
420501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!isValid(descriptor)) {
421501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadParameter;
422501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
423501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
424501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("registerCallback(%s, %p, %p)", to_string(descriptor).c_str(),
425501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            callbackData, pointer);
426501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
427501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
428501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
429501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (pointer != nullptr) {
430501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mCallbacks[descriptor] = {callbackData, pointer};
431501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
432501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGI("unregisterCallback(%s)", to_string(descriptor).c_str());
433501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mCallbacks.erase(descriptor);
434501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
435501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
436501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
437501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool hasPendingInvalidate = false;
438501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::vector<hwc2_display_t> displayIds;
439501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::vector<std::pair<hwc2_display_t, int64_t>> pendingVsyncs;
440501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::vector<std::pair<hwc2_display_t, int>> pendingHotplugs;
441501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
442501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (descriptor == Callback::Refresh) {
443501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hasPendingInvalidate = mHasPendingInvalidate;
444501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (hasPendingInvalidate) {
445501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            for (auto& displayPair : mDisplays) {
446501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                displayIds.emplace_back(displayPair.first);
447501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
448501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
449501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHasPendingInvalidate = false;
450501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else if (descriptor == Callback::Vsync) {
451501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto pending : mPendingVsyncs) {
452501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto hwc1DisplayId = pending.first;
453501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
454501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ALOGE("hwc1Vsync: Couldn't find display for HWC1 id %d",
455501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                        hwc1DisplayId);
456501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                continue;
457501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
458501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto displayId = mHwc1DisplayMap[hwc1DisplayId];
459501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto timestamp = pending.second;
460501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            pendingVsyncs.emplace_back(displayId, timestamp);
461501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
462501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mPendingVsyncs.clear();
463501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else if (descriptor == Callback::Hotplug) {
464501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Hotplug the primary display
465501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        pendingHotplugs.emplace_back(mHwc1DisplayMap[HWC_DISPLAY_PRIMARY],
466501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<int32_t>(Connection::Connected));
467501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
468501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto pending : mPendingHotplugs) {
469501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto hwc1DisplayId = pending.first;
470501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
471501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ALOGE("hwc1Hotplug: Couldn't find display for HWC1 id %d",
472501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                        hwc1DisplayId);
473501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                continue;
474501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
475501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto displayId = mHwc1DisplayMap[hwc1DisplayId];
476501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto connected = pending.second;
477501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            pendingHotplugs.emplace_back(displayId, connected);
478501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
479501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
480501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
481501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Call pending callbacks without the state lock held
482501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    lock.unlock();
483501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
484501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hasPendingInvalidate) {
485501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto refresh = reinterpret_cast<HWC2_PFN_REFRESH>(pointer);
486501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto displayId : displayIds) {
487501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            refresh(callbackData, displayId);
488501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
489501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
490501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!pendingVsyncs.empty()) {
491501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto vsync = reinterpret_cast<HWC2_PFN_VSYNC>(pointer);
492501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto& pendingVsync : pendingVsyncs) {
493501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            vsync(callbackData, pendingVsync.first, pendingVsync.second);
494501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
495501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
496501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!pendingHotplugs.empty()) {
497501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
498501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto& pendingHotplug : pendingHotplugs) {
499501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hotplug(callbackData, pendingHotplug.first, pendingHotplug.second);
500501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
501501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
502501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
503501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
504501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
505501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu// Display functions
506501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
507501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::atomic<hwc2_display_t> HWC2On1Adapter::Display::sNextId(1);
508501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
509501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuHWC2On1Adapter::Display::Display(HWC2On1Adapter& device, HWC2::DisplayType type)
510501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu  : mId(sNextId++),
511501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDevice(device),
512501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mStateMutex(),
513501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents(nullptr),
514501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mRetireFence(),
515501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mChanges(),
516501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Id(-1),
517501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mConfigs(),
518501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mActiveConfig(nullptr),
519501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mActiveColorMode(static_cast<android_color_mode_t>(-1)),
520501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mName(),
521501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mType(type),
522501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mPowerMode(PowerMode::Off),
523501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mVsyncEnabled(Vsync::Invalid),
524501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mClientTarget(),
525501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mOutputBuffer(),
526501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHasColorTransform(false),
527501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mLayers(),
528501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1LayerMap(),
529501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mNumAvailableRects(0),
530501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mNextAvailableRect(nullptr),
531501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mGeometryChanged(false)
532501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    {}
533501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
534501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::acceptChanges() {
535501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
536501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
537501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mChanges) {
538501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("[%" PRIu64 "] acceptChanges failed, not validated", mId);
539501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::NotValidated;
540501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
541501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
542501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] acceptChanges", mId);
543501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
544501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto& change : mChanges->getTypeChanges()) {
545501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto layerId = change.first;
546501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto type = change.second;
547501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mDevice.mLayers.count(layerId) == 0) {
548501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // This should never happen but somehow does.
549501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGW("Cannot accept change for unknown layer (%" PRIu64 ")",
550501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layerId);
551501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
552501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
553501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto layer = mDevice.mLayers[layerId];
554501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        layer->setCompositionType(type);
555501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
556501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
557501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mChanges->clearTypeChanges();
558501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
559501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
560501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
561501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
562501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::createLayer(hwc2_layer_t* outLayerId) {
563501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
564501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
565501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto layer = *mLayers.emplace(std::make_shared<Layer>(*this));
566501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDevice.mLayers.emplace(std::make_pair(layer->getId(), layer));
567501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outLayerId = layer->getId();
568501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] created layer %" PRIu64, mId, *outLayerId);
569501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    markGeometryChanged();
570501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
571501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
572501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
573501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::destroyLayer(hwc2_layer_t layerId) {
574501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
575501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
576501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto mapLayer = mDevice.mLayers.find(layerId);
577501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mapLayer == mDevice.mLayers.end()) {
578501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("[%" PRIu64 "] destroyLayer(%" PRIu64 ") failed: no such layer",
579501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mId, layerId);
580501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadLayer;
581501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
582501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto layer = mapLayer->second;
583501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDevice.mLayers.erase(mapLayer);
584501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto zRange = mLayers.equal_range(layer);
585501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto current = zRange.first; current != zRange.second; ++current) {
586501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (**current == *layer) {
587501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            current = mLayers.erase(current);
588501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
589501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
590501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
591501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] destroyed layer %" PRIu64, mId, layerId);
592501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    markGeometryChanged();
593501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
594501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
595501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
596501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getActiveConfig(hwc2_config_t* outConfig) {
597501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
598501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
599501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mActiveConfig) {
600501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("[%" PRIu64 "] getActiveConfig --> %s", mId,
601501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                to_string(Error::BadConfig).c_str());
602501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadConfig;
603501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
604501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto configId = mActiveConfig->getId();
605501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] getActiveConfig --> %u", mId, configId);
606501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outConfig = configId;
607501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
608501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
609501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
610501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getAttribute(hwc2_config_t configId,
611501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        Attribute attribute, int32_t* outValue) {
612501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
613501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
614501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (configId > mConfigs.size() || !mConfigs[configId]->isOnDisplay(*this)) {
615501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("[%" PRIu64 "] getAttribute failed: bad config (%u)", mId,
616501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                configId);
617501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadConfig;
618501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
619501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outValue = mConfigs[configId]->getAttribute(attribute);
620501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] getAttribute(%u, %s) --> %d", mId, configId,
621501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            to_string(attribute).c_str(), *outValue);
622501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
623501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
624501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
625501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getChangedCompositionTypes(
626501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outTypes) {
627501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
628501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
629501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mChanges) {
630501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] getChangedCompositionTypes failed: not validated",
631501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mId);
632501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::NotValidated;
633501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
634501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
635501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if ((outLayers == nullptr) || (outTypes == nullptr)) {
636501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outNumElements = mChanges->getTypeChanges().size();
637501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
638501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
639501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
640501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint32_t numWritten = 0;
641501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& element : mChanges->getTypeChanges()) {
642501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (numWritten == *outNumElements) {
643501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
644501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
645501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto layerId = element.first;
646501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto intType = static_cast<int32_t>(element.second);
647501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Adding %" PRIu64 " %s", layerId,
648501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                to_string(element.second).c_str());
649501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        outLayers[numWritten] = layerId;
650501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        outTypes[numWritten] = intType;
651501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ++numWritten;
652501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
653501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumElements = numWritten;
654501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
655501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
656501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
657501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
658501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getColorModes(uint32_t* outNumModes,
659501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t* outModes) {
660501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
661501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
662501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!outModes) {
663501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outNumModes = mColorModes.size();
664501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
665501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
666501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint32_t numModes = std::min(*outNumModes,
667501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            static_cast<uint32_t>(mColorModes.size()));
668501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::copy_n(mColorModes.cbegin(), numModes, outModes);
669501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumModes = numModes;
670501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
671501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
672501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
673501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getConfigs(uint32_t* outNumConfigs,
674501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc2_config_t* outConfigs) {
675501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
676501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
677501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!outConfigs) {
678501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outNumConfigs = mConfigs.size();
679501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
680501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
681501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint32_t numWritten = 0;
682501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& config : mConfigs) {
683501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (numWritten == *outNumConfigs) {
684501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
685501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
686501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        outConfigs[numWritten] = config->getId();
687501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ++numWritten;
688501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
689501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumConfigs = numWritten;
690501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
691501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
692501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
693501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getDozeSupport(int32_t* outSupport) {
694501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
695501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
696501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDevice.mHwc1MinorVersion < 4 || mHwc1Id != 0) {
697501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outSupport = 0;
698501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
699501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outSupport = 1;
700501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
701501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
702501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
703501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
704501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getHdrCapabilities(uint32_t* outNumTypes,
705501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t* /*outTypes*/, float* /*outMaxLuminance*/,
706501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        float* /*outMaxAverageLuminance*/, float* /*outMinLuminance*/) {
707501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // This isn't supported on HWC1, so per the HWC2 header, return numTypes = 0
708501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumTypes = 0;
709501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
710501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
711501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
712501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getName(uint32_t* outSize, char* outName) {
713501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
714501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
715501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!outName) {
716501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outSize = mName.size();
717501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
718501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
719501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto numCopied = mName.copy(outName, *outSize);
720501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outSize = numCopied;
721501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
722501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
723501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
724501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getReleaseFences(uint32_t* outNumElements,
725501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc2_layer_t* outLayers, int32_t* outFences) {
726501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
727501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
728501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint32_t numWritten = 0;
729501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool outputsNonNull = (outLayers != nullptr) && (outFences != nullptr);
730501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& layer : mLayers) {
731501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (outputsNonNull && (numWritten == *outNumElements)) {
732501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
733501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
734501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
735501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto releaseFence = layer->getReleaseFence();
736501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (releaseFence != MiniFence::NO_FENCE) {
737501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (outputsNonNull) {
738501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                outLayers[numWritten] = layer->getId();
739501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                outFences[numWritten] = releaseFence->dup();
740501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
741501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ++numWritten;
742501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
743501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
744501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumElements = numWritten;
745501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
746501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
747501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
748501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
749501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getRequests(int32_t* outDisplayRequests,
750501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t* outNumElements, hwc2_layer_t* outLayers,
751501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t* outLayerRequests) {
752501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
753501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
754501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mChanges) {
755501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::NotValidated;
756501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
757501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
758501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (outLayers == nullptr || outLayerRequests == nullptr) {
759501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        *outNumElements = mChanges->getNumLayerRequests();
760501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
761501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
762501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
763501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Display requests (HWC2::DisplayRequest) are not supported by hwc1:
764501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // A hwc1 has always zero requests for the client.
765501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outDisplayRequests = 0;
766501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
767501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint32_t numWritten = 0;
768501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& request : mChanges->getLayerRequests()) {
769501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (numWritten == *outNumElements) {
770501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
771501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
772501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        outLayers[numWritten] = request.first;
773501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        outLayerRequests[numWritten] = static_cast<int32_t>(request.second);
774501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ++numWritten;
775501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
776501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
777501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
778501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
779501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
780501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getType(int32_t* outType) {
781501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
782501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
783501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outType = static_cast<int32_t>(mType);
784501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
785501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
786501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
787501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::present(int32_t* outRetireFence) {
788501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
789501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
790501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mChanges) {
791501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        Error error = mDevice.setAllDisplays();
792501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (error != Error::None) {
793501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE("[%" PRIu64 "] present: setAllDisplaysFailed (%s)", mId,
794501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    to_string(error).c_str());
795501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return error;
796501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
797501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
798501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
799501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outRetireFence = mRetireFence.get()->dup();
800501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] present returning retire fence %d", mId,
801501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            *outRetireFence);
802501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
803501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
804501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
805501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
806501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setActiveConfig(hwc2_config_t configId) {
807501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
808501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
809501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto config = getConfig(configId);
810501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!config) {
811501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadConfig;
812501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
813501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (config == mActiveConfig) {
814501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
815501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
816501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
817501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDevice.mHwc1MinorVersion >= 4) {
818501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t hwc1Id = 0;
819501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto error = config->getHwc1IdForColorMode(mActiveColorMode, &hwc1Id);
820501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (error != Error::None) {
821501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return error;
822501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
823501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
824501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int intError = mDevice.mHwc1Device->setActiveConfig(mDevice.mHwc1Device,
825501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mHwc1Id, static_cast<int>(hwc1Id));
826501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (intError != 0) {
827501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE("setActiveConfig: Failed to set active config on HWC1 (%d)",
828501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                intError);
829501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return Error::BadConfig;
830501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
831501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mActiveConfig = config;
832501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
833501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
834501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
835501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
836501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
837501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setClientTarget(buffer_handle_t target,
838501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t acquireFence, int32_t /*dataspace*/, hwc_region_t /*damage*/) {
839501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
840501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
841501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence);
842501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mClientTarget.setBuffer(target);
843501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mClientTarget.setFence(acquireFence);
844501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // dataspace and damage can't be used by HWC1, so ignore them
845501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
846501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
847501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
848501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setColorMode(android_color_mode_t mode) {
849501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock (mStateMutex);
850501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
851501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] setColorMode(%d)", mId, mode);
852501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
853501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mode == mActiveColorMode) {
854501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
855501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
856501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mColorModes.count(mode) == 0) {
857501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] Mode %d not found in mColorModes", mId, mode);
858501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::Unsupported;
859501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
860501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
861f579ea47aa9a742c21811fdaab303ad7176362eahuans    if (mDevice.mHwc1MinorVersion >= 4) {
862f579ea47aa9a742c21811fdaab303ad7176362eahuans        uint32_t hwc1Config = 0;
863f579ea47aa9a742c21811fdaab303ad7176362eahuans        auto error = mActiveConfig->getHwc1IdForColorMode(mode, &hwc1Config);
864f579ea47aa9a742c21811fdaab303ad7176362eahuans        if (error != Error::None) {
865f579ea47aa9a742c21811fdaab303ad7176362eahuans            return error;
866f579ea47aa9a742c21811fdaab303ad7176362eahuans        }
867501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
868f579ea47aa9a742c21811fdaab303ad7176362eahuans        ALOGV("[%" PRIu64 "] Setting HWC1 config %u", mId, hwc1Config);
869f579ea47aa9a742c21811fdaab303ad7176362eahuans        int intError =
870f579ea47aa9a742c21811fdaab303ad7176362eahuans            mDevice.mHwc1Device->setActiveConfig(mDevice.mHwc1Device, mHwc1Id, hwc1Config);
871f579ea47aa9a742c21811fdaab303ad7176362eahuans        if (intError != 0) {
872f579ea47aa9a742c21811fdaab303ad7176362eahuans            ALOGE("[%" PRIu64 "] Failed to set HWC1 config (%d)", mId, intError);
873f579ea47aa9a742c21811fdaab303ad7176362eahuans            return Error::Unsupported;
874f579ea47aa9a742c21811fdaab303ad7176362eahuans        }
875501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
876501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
877501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mActiveColorMode = mode;
878501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
879501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
880501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
881501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setColorTransform(android_color_transform_t hint) {
882501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
883501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
884501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("%" PRIu64 "] setColorTransform(%d)", mId,
885501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            static_cast<int32_t>(hint));
886501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHasColorTransform = (hint != HAL_COLOR_TRANSFORM_IDENTITY);
887501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
888501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
889501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
890501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setOutputBuffer(buffer_handle_t buffer,
891501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t releaseFence) {
892501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
893501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
894501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] setOutputBuffer(%p, %d)", mId, buffer, releaseFence);
895501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mOutputBuffer.setBuffer(buffer);
896501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mOutputBuffer.setFence(releaseFence);
897501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
898501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
899501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
900501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic bool isValid(PowerMode mode) {
901501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (mode) {
902501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::Off: // Fall-through
903501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::DozeSuspend: // Fall-through
904501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::Doze: // Fall-through
905501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::On: return true;
906501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
907501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
908501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
909501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic int getHwc1PowerMode(PowerMode mode) {
910501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (mode) {
911501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::Off: return HWC_POWER_MODE_OFF;
912501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::DozeSuspend: return HWC_POWER_MODE_DOZE_SUSPEND;
913501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::Doze: return HWC_POWER_MODE_DOZE;
914501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case PowerMode::On: return HWC_POWER_MODE_NORMAL;
915501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
916501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
917501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
918501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setPowerMode(PowerMode mode) {
919501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!isValid(mode)) {
920501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadParameter;
921501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
922501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mode == mPowerMode) {
923501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
924501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
925501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
926501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
927501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
928501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    int error = 0;
929501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDevice.mHwc1MinorVersion < 4) {
930501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        error = mDevice.mHwc1Device->blank(mDevice.mHwc1Device, mHwc1Id,
931501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mode == PowerMode::Off);
932501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
933501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        error = mDevice.mHwc1Device->setPowerMode(mDevice.mHwc1Device,
934501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mHwc1Id, getHwc1PowerMode(mode));
935501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
936501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGE_IF(error != 0, "setPowerMode: Failed to set power mode on HWC1 (%d)",
937501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            error);
938501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
939501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] setPowerMode(%s)", mId, to_string(mode).c_str());
940501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mPowerMode = mode;
941501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
942501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
943501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
944501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic bool isValid(Vsync enable) {
945501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (enable) {
946501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Vsync::Enable: // Fall-through
947501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Vsync::Disable: return true;
948501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Vsync::Invalid: return false;
949501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
950501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
951501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
952501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::setVsyncEnabled(Vsync enable) {
953501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!isValid(enable)) {
954501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadParameter;
955501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
956501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (enable == mVsyncEnabled) {
957501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
958501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
959501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
960501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
961501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
962501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    int error = mDevice.mHwc1Device->eventControl(mDevice.mHwc1Device,
963501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mHwc1Id, HWC_EVENT_VSYNC, enable == Vsync::Enable);
964501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGE_IF(error != 0, "setVsyncEnabled: Failed to set vsync on HWC1 (%d)",
965501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            error);
966501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
967501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mVsyncEnabled = enable;
968501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
969501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
970501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
971501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::validate(uint32_t* outNumTypes,
972501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t* outNumRequests) {
973501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
974501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
975501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mChanges) {
976501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (!mDevice.prepareAllDisplays()) {
977501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return Error::BadDisplay;
978501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
979501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
980501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("Validate was called more than once!");
981501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
982501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
983501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumTypes = mChanges->getNumTypes();
984501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    *outNumRequests = mChanges->getNumLayerRequests();
985501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] validate --> %u types, %u requests", mId, *outNumTypes,
986501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            *outNumRequests);
987501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto request : mChanges->getTypeChanges()) {
988501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Layer %" PRIu64 " --> %s", request.first,
989501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                to_string(request.second).c_str());
990501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
991501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return *outNumTypes > 0 ? Error::HasChanges : Error::None;
992501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
993501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
994501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::updateLayerZ(hwc2_layer_t layerId, uint32_t z) {
995501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
996501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
997501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto mapLayer = mDevice.mLayers.find(layerId);
998501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mapLayer == mDevice.mLayers.end()) {
999501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] updateLayerZ failed to find layer", mId);
1000501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadLayer;
1001501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1002501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1003501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto layer = mapLayer->second;
1004501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto zRange = mLayers.equal_range(layer);
1005501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool layerOnDisplay = false;
1006501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto current = zRange.first; current != zRange.second; ++current) {
1007501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (**current == *layer) {
1008501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if ((*current)->getZ() == z) {
1009501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                // Don't change anything if the Z hasn't changed
1010501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                return Error::None;
1011501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1012501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            current = mLayers.erase(current);
1013501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            layerOnDisplay = true;
1014501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1015501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1016501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1017501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1018501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!layerOnDisplay) {
1019501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] updateLayerZ failed to find layer on display",
1020501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mId);
1021501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadLayer;
1022501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1023501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1024501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    layer->setZ(z);
1025501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mLayers.emplace(std::move(layer));
1026501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    markGeometryChanged();
1027501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1028501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1029501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1030501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1031501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::getClientTargetSupport(uint32_t width, uint32_t height,
1032501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                                      int32_t format, int32_t dataspace){
1033501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mActiveConfig == nullptr) {
1034501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::Unsupported;
1035501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1036501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1037501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (width == mActiveConfig->getAttribute(Attribute::Width) &&
1038501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            height == mActiveConfig->getAttribute(Attribute::Height) &&
1039501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            format == HAL_PIXEL_FORMAT_RGBA_8888 &&
1040501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            dataspace == HAL_DATASPACE_UNKNOWN) {
1041501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
1042501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1043501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1044501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::Unsupported;
1045501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1046501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1047501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr uint32_t ATTRIBUTES_WITH_COLOR[] = {
1048501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_VSYNC_PERIOD,
1049501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_WIDTH,
1050501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_HEIGHT,
1051501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_DPI_X,
1052501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_DPI_Y,
1053501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_COLOR_TRANSFORM,
1054501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_NO_ATTRIBUTE,
1055501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu};
1056501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1057501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr uint32_t ATTRIBUTES_WITHOUT_COLOR[] = {
1058501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_VSYNC_PERIOD,
1059501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_WIDTH,
1060501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_HEIGHT,
1061501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_DPI_X,
1062501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_DPI_Y,
1063501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC_DISPLAY_NO_ATTRIBUTE,
1064501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu};
1065501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1066501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr size_t NUM_ATTRIBUTES_WITH_COLOR =
1067501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        sizeof(ATTRIBUTES_WITH_COLOR) / sizeof(uint32_t);
1068501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(sizeof(ATTRIBUTES_WITH_COLOR) > sizeof(ATTRIBUTES_WITHOUT_COLOR),
1069501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        "Attribute tables have unexpected sizes");
1070501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1071501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr uint32_t ATTRIBUTE_MAP_WITH_COLOR[] = {
1072501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    6, // HWC_DISPLAY_NO_ATTRIBUTE = 0
1073501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    0, // HWC_DISPLAY_VSYNC_PERIOD = 1,
1074501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    1, // HWC_DISPLAY_WIDTH = 2,
1075501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    2, // HWC_DISPLAY_HEIGHT = 3,
1076501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    3, // HWC_DISPLAY_DPI_X = 4,
1077501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    4, // HWC_DISPLAY_DPI_Y = 5,
1078501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    5, // HWC_DISPLAY_COLOR_TRANSFORM = 6,
1079501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu};
1080501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1081501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr uint32_t ATTRIBUTE_MAP_WITHOUT_COLOR[] = {
1082501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    5, // HWC_DISPLAY_NO_ATTRIBUTE = 0
1083501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    0, // HWC_DISPLAY_VSYNC_PERIOD = 1,
1084501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    1, // HWC_DISPLAY_WIDTH = 2,
1085501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    2, // HWC_DISPLAY_HEIGHT = 3,
1086501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    3, // HWC_DISPLAY_DPI_X = 4,
1087501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    4, // HWC_DISPLAY_DPI_Y = 5,
1088501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu};
1089501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1090501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wutemplate <uint32_t attribute>
1091501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic constexpr bool attributesMatch()
1092501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu{
1093501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool match = (attribute ==
1094501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ATTRIBUTES_WITH_COLOR[ATTRIBUTE_MAP_WITH_COLOR[attribute]]);
1095501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (attribute == HWC_DISPLAY_COLOR_TRANSFORM) {
1096501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return match;
1097501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1098501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1099501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return match && (attribute ==
1100501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ATTRIBUTES_WITHOUT_COLOR[ATTRIBUTE_MAP_WITHOUT_COLOR[attribute]]);
1101501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1102501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(attributesMatch<HWC_DISPLAY_VSYNC_PERIOD>(),
1103501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        "Tables out of sync");
1104501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(attributesMatch<HWC_DISPLAY_WIDTH>(), "Tables out of sync");
1105501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(attributesMatch<HWC_DISPLAY_HEIGHT>(), "Tables out of sync");
1106501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(attributesMatch<HWC_DISPLAY_DPI_X>(), "Tables out of sync");
1107501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(attributesMatch<HWC_DISPLAY_DPI_Y>(), "Tables out of sync");
1108501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic_assert(attributesMatch<HWC_DISPLAY_COLOR_TRANSFORM>(),
1109501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        "Tables out of sync");
1110501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1111501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::populateConfigs() {
1112501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1113501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1114501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("[%" PRIu64 "] populateConfigs", mId);
1115501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1116501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1Id == -1) {
1117501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("populateConfigs: HWC1 ID not set");
1118501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
1119501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1120501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1121501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const size_t MAX_NUM_CONFIGS = 128;
1122501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint32_t configs[MAX_NUM_CONFIGS] = {};
1123501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numConfigs = MAX_NUM_CONFIGS;
1124501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDevice.mHwc1Device->getDisplayConfigs(mDevice.mHwc1Device, mHwc1Id,
1125501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            configs, &numConfigs);
1126501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1127501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t c = 0; c < numConfigs; ++c) {
1128501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t hwc1ConfigId = configs[c];
1129501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto newConfig = std::make_shared<Config>(*this);
1130501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1131501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t values[NUM_ATTRIBUTES_WITH_COLOR] = {};
1132501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        bool hasColor = true;
1133501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto result = mDevice.mHwc1Device->getDisplayAttributes(
1134501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mDevice.mHwc1Device, mHwc1Id, hwc1ConfigId,
1135501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ATTRIBUTES_WITH_COLOR, values);
1136501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (result != 0) {
1137501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mDevice.mHwc1Device->getDisplayAttributes(mDevice.mHwc1Device,
1138501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    mHwc1Id, hwc1ConfigId, ATTRIBUTES_WITHOUT_COLOR, values);
1139501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hasColor = false;
1140501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1141501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1142501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto attributeMap = hasColor ?
1143501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ATTRIBUTE_MAP_WITH_COLOR : ATTRIBUTE_MAP_WITHOUT_COLOR;
1144501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1145501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        newConfig->setAttribute(Attribute::VsyncPeriod,
1146501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                values[attributeMap[HWC_DISPLAY_VSYNC_PERIOD]]);
1147501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        newConfig->setAttribute(Attribute::Width,
1148501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                values[attributeMap[HWC_DISPLAY_WIDTH]]);
1149501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        newConfig->setAttribute(Attribute::Height,
1150501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                values[attributeMap[HWC_DISPLAY_HEIGHT]]);
1151501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        newConfig->setAttribute(Attribute::DpiX,
1152501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                values[attributeMap[HWC_DISPLAY_DPI_X]]);
1153501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        newConfig->setAttribute(Attribute::DpiY,
1154501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                values[attributeMap[HWC_DISPLAY_DPI_Y]]);
1155501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (hasColor) {
1156501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // In HWC1, color modes are referred to as color transforms. To avoid confusion with
1157501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // the HWC2 concept of color transforms, we internally refer to them as color modes for
1158501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // both HWC1 and 2.
1159501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            newConfig->setAttribute(ColorMode,
1160501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    values[attributeMap[HWC_DISPLAY_COLOR_TRANSFORM]]);
1161501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1162501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1163501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // We can only do this after attempting to read the color mode
1164501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        newConfig->setHwc1Id(hwc1ConfigId);
1165501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1166501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (auto& existingConfig : mConfigs) {
1167501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (existingConfig->merge(*newConfig)) {
1168501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ALOGV("Merged config %d with existing config %u: %s",
1169501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                        hwc1ConfigId, existingConfig->getId(),
1170501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                        existingConfig->toString().c_str());
1171501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                newConfig.reset();
1172501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                break;
1173501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1174501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1175501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1176501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // If it wasn't merged with any existing config, add it to the end
1177501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (newConfig) {
1178501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            newConfig->setId(static_cast<hwc2_config_t>(mConfigs.size()));
1179501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("Found new config %u: %s", newConfig->getId(),
1180501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    newConfig->toString().c_str());
1181501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mConfigs.emplace_back(std::move(newConfig));
1182501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1183501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1184501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1185501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    initializeActiveConfig();
1186501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    populateColorModes();
1187501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1188501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1189501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::populateConfigs(uint32_t width, uint32_t height) {
1190501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1191501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1192501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mConfigs.emplace_back(std::make_shared<Config>(*this));
1193501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto& config = mConfigs[0];
1194501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1195501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    config->setAttribute(Attribute::Width, static_cast<int32_t>(width));
1196501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    config->setAttribute(Attribute::Height, static_cast<int32_t>(height));
1197501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    config->setHwc1Id(0);
1198501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    config->setId(0);
1199501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mActiveConfig = config;
1200501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1201501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1202501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::Display::prepare() {
1203501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1204501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1205501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Only prepare display contents for displays HWC1 knows about
1206501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1Id == -1) {
1207501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return true;
1208501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1209501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1210501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // It doesn't make sense to prepare a display for which there is no active
1211501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // config, so return early
1212501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mActiveConfig) {
1213501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] Attempted to prepare, but no config active", mId);
1214501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return false;
1215501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1216501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1217501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    allocateRequestedContents();
1218501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    assignHwc1LayerIds();
1219501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1220501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents->retireFenceFd = -1;
1221501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents->flags = 0;
1222501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mGeometryChanged) {
1223501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1RequestedContents->flags |= HWC_GEOMETRY_CHANGED;
1224501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1225501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents->outbuf = mOutputBuffer.getBuffer();
1226501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents->outbufAcquireFenceFd = mOutputBuffer.getFence();
1227501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1228501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // +1 is for framebuffer target layer.
1229501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents->numHwLayers = mLayers.size() + 1;
1230501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto& layer : mLayers) {
1231501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& hwc1Layer = mHwc1RequestedContents->hwLayers[layer->getHwc1Id()];
1232501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.releaseFenceFd = -1;
1233501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.acquireFenceFd = -1;
1234501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Applying states for layer %" PRIu64 " ", layer->getId());
1235501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        layer->applyState(hwc1Layer);
1236501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1237501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1238501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    prepareFramebufferTarget();
1239501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1240501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    resetGeometryMarker();
1241501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1242501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return true;
1243501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1244501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1245501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::generateChanges() {
1246501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1247501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1248501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mChanges.reset(new Changes);
1249501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1250501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numLayers = mHwc1RequestedContents->numHwLayers;
1251501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t hwc1Id = 0; hwc1Id < numLayers; ++hwc1Id) {
1252501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const auto& receivedLayer = mHwc1RequestedContents->hwLayers[hwc1Id];
1253501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mHwc1LayerMap.count(hwc1Id) == 0) {
1254501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE_IF(receivedLayer.compositionType != HWC_FRAMEBUFFER_TARGET,
1255501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    "generateChanges: HWC1 layer %zd doesn't have a"
1256501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    " matching HWC2 layer, and isn't the framebuffer target",
1257501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    hwc1Id);
1258501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
1259501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1260501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1261501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        Layer& layer = *mHwc1LayerMap[hwc1Id];
1262501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        updateTypeChanges(receivedLayer, layer);
1263501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        updateLayerRequests(receivedLayer, layer);
1264501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1265501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1266501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1267501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::Display::hasChanges() const {
1268501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1269501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mChanges != nullptr;
1270501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1271501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1272501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::set(hwc_display_contents_1& hwcContents) {
1273501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1274501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1275501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mChanges || (mChanges->getNumTypes() > 0)) {
1276501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] set failed: not validated", mId);
1277501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::NotValidated;
1278501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1279501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1280501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Set up the client/framebuffer target
1281501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto numLayers = hwcContents.numHwLayers;
1282501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1283501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Close acquire fences on FRAMEBUFFER layers, since they will not be used
1284501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // by HWC
1285501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t l = 0; l < numLayers - 1; ++l) {
1286501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& layer = hwcContents.hwLayers[l];
1287501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (layer.compositionType == HWC_FRAMEBUFFER) {
1288501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("Closing fence %d for layer %zd", layer.acquireFenceFd, l);
1289501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            close(layer.acquireFenceFd);
1290501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            layer.acquireFenceFd = -1;
1291501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1292501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1293501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1294501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto& clientTargetLayer = hwcContents.hwLayers[numLayers - 1];
1295501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (clientTargetLayer.compositionType == HWC_FRAMEBUFFER_TARGET) {
1296501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        clientTargetLayer.handle = mClientTarget.getBuffer();
1297501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        clientTargetLayer.acquireFenceFd = mClientTarget.getFence();
1298501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
1299501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("[%" PRIu64 "] set: last HWC layer wasn't FRAMEBUFFER_TARGET",
1300501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mId);
1301501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1302501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1303501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mChanges.reset();
1304501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1305501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1306501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1307501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1308501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::addRetireFence(int fenceFd) {
1309501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1310501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mRetireFence.add(fenceFd);
1311501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1312501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1313501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::addReleaseFences(
1314501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const hwc_display_contents_1_t& hwcContents) {
1315501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1316501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1317501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numLayers = hwcContents.numHwLayers;
1318501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t hwc1Id = 0; hwc1Id < numLayers; ++hwc1Id) {
1319501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const auto& receivedLayer = hwcContents.hwLayers[hwc1Id];
1320501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mHwc1LayerMap.count(hwc1Id) == 0) {
1321501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (receivedLayer.compositionType != HWC_FRAMEBUFFER_TARGET) {
1322501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ALOGE("addReleaseFences: HWC1 layer %zd doesn't have a"
1323501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                        " matching HWC2 layer, and isn't the framebuffer"
1324501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                        " target", hwc1Id);
1325501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1326501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // Close the framebuffer target release fence since we will use the
1327501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // display retire fence instead
1328501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (receivedLayer.releaseFenceFd != -1) {
1329501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                close(receivedLayer.releaseFenceFd);
1330501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1331501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
1332501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1333501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1334501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        Layer& layer = *mHwc1LayerMap[hwc1Id];
1335501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Adding release fence %d to layer %" PRIu64,
1336501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                receivedLayer.releaseFenceFd, layer.getId());
1337501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        layer.addReleaseFence(receivedLayer.releaseFenceFd);
1338501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1339501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1340501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1341501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::Display::hasColorTransform() const {
1342501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1343501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mHasColorTransform;
1344501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1345501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1346501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string hwc1CompositionString(int32_t type) {
1347501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (type) {
1348501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_FRAMEBUFFER: return "Framebuffer";
1349501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_OVERLAY: return "Overlay";
1350501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_BACKGROUND: return "Background";
1351501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_FRAMEBUFFER_TARGET: return "FramebufferTarget";
1352501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_SIDEBAND: return "Sideband";
1353501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_CURSOR_OVERLAY: return "CursorOverlay";
1354501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default:
1355501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return std::string("Unknown (") + std::to_string(type) + ")";
1356501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1357501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1358501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1359501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string hwc1TransformString(int32_t transform) {
1360501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (transform) {
1361501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case 0: return "None";
1362501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_FLIP_H: return "FlipH";
1363501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_FLIP_V: return "FlipV";
1364501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_ROT_90: return "Rotate90";
1365501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_ROT_180: return "Rotate180";
1366501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_ROT_270: return "Rotate270";
1367501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_FLIP_H_ROT_90: return "FlipHRotate90";
1368501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_TRANSFORM_FLIP_V_ROT_90: return "FlipVRotate90";
1369501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default:
1370501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return std::string("Unknown (") + std::to_string(transform) + ")";
1371501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1372501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1373501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1374501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string hwc1BlendModeString(int32_t mode) {
1375501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (mode) {
1376501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_BLENDING_NONE: return "None";
1377501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_BLENDING_PREMULT: return "Premultiplied";
1378501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_BLENDING_COVERAGE: return "Coverage";
1379501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default:
1380501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return std::string("Unknown (") + std::to_string(mode) + ")";
1381501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1382501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1383501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1384501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string rectString(hwc_rect_t rect) {
1385501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
1386501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "[" << rect.left << ", " << rect.top << ", ";
1387501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << rect.right << ", " << rect.bottom << "]";
1388501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
1389501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1390501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1391501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string approximateFloatString(float f) {
1392501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (static_cast<int32_t>(f) == f) {
1393501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return std::to_string(static_cast<int32_t>(f));
1394501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1395501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    int32_t truncated = static_cast<int32_t>(f * 10);
1396501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool approximate = (static_cast<float>(truncated) != f * 10);
1397501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const size_t BUFFER_SIZE = 32;
1398501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    char buffer[BUFFER_SIZE] = {};
1399501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto bytesWritten = snprintf(buffer, BUFFER_SIZE,
1400501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            "%s%.1f", approximate ? "~" : "", f);
1401501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return std::string(buffer, bytesWritten);
1402501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1403501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1404501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string frectString(hwc_frect_t frect) {
1405501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
1406501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "[" << approximateFloatString(frect.left) << ", ";
1407501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << approximateFloatString(frect.top) << ", ";
1408501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << approximateFloatString(frect.right) << ", ";
1409501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << approximateFloatString(frect.bottom) << "]";
1410501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
1411501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1412501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1413501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string colorString(hwc_color_t color) {
1414501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
1415501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "RGBA [";
1416501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << static_cast<int32_t>(color.r) << ", ";
1417501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << static_cast<int32_t>(color.g) << ", ";
1418501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << static_cast<int32_t>(color.b) << ", ";
1419501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << static_cast<int32_t>(color.a) << "]";
1420501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
1421501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1422501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1423501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string alphaString(float f) {
1424501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const size_t BUFFER_SIZE = 8;
1425501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    char buffer[BUFFER_SIZE] = {};
1426501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto bytesWritten = snprintf(buffer, BUFFER_SIZE, "%.3f", f);
1427501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return std::string(buffer, bytesWritten);
1428501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1429501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1430501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string to_string(const hwc_layer_1_t& hwcLayer,
1431501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t hwc1MinorVersion) {
1432501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const char* fill = "          ";
1433501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1434501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
1435501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1436501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "  Composition: " <<
1437501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1CompositionString(hwcLayer.compositionType);
1438501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1439501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwcLayer.compositionType == HWC_BACKGROUND) {
1440501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Color: " << colorString(hwcLayer.backgroundColor) << '\n';
1441501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else if (hwcLayer.compositionType == HWC_SIDEBAND) {
1442501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Stream: " << hwcLayer.sidebandStream << '\n';
1443501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
1444501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Buffer: " << hwcLayer.handle << "/" <<
1445501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                hwcLayer.acquireFenceFd << '\n';
1446501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1447501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1448501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << fill << "Display frame: " << rectString(hwcLayer.displayFrame) <<
1449501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            '\n';
1450501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1451501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << fill << "Source crop: ";
1452501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwc1MinorVersion >= 3) {
1453501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << frectString(hwcLayer.sourceCropf) << '\n';
1454501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
1455501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << rectString(hwcLayer.sourceCropi) << '\n';
1456501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1457501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1458501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << fill << "Transform: " << hwc1TransformString(hwcLayer.transform);
1459501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "  Blend mode: " << hwc1BlendModeString(hwcLayer.blending);
1460501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwcLayer.planeAlpha != 0xFF) {
1461501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Alpha: " << alphaString(hwcLayer.planeAlpha / 255.0f);
1462501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1463501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << '\n';
1464501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1465501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwcLayer.hints != 0) {
1466501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "Hints:";
1467501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if ((hwcLayer.hints & HWC_HINT_TRIPLE_BUFFER) != 0) {
1468501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << " TripleBuffer";
1469501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1470501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if ((hwcLayer.hints & HWC_HINT_CLEAR_FB) != 0) {
1471501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << " ClearFB";
1472501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1473501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << '\n';
1474501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1475501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1476501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwcLayer.flags != 0) {
1477501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "Flags:";
1478501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if ((hwcLayer.flags & HWC_SKIP_LAYER) != 0) {
1479501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << " SkipLayer";
1480501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1481501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if ((hwcLayer.flags & HWC_IS_CURSOR_LAYER) != 0) {
1482501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << " IsCursorLayer";
1483501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1484501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << '\n';
1485501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1486501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1487501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
1488501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1489501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1490501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string to_string(const hwc_display_contents_1_t& hwcContents,
1491501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t hwc1MinorVersion) {
1492501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const char* fill = "      ";
1493501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1494501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
1495501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << fill << "Geometry changed: " <<
1496501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ((hwcContents.flags & HWC_GEOMETRY_CHANGED) != 0 ? "Y\n" : "N\n");
1497501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1498501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << fill << hwcContents.numHwLayers << " Layer" <<
1499501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ((hwcContents.numHwLayers == 1) ? "\n" : "s\n");
1500501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t layer = 0; layer < hwcContents.numHwLayers; ++layer) {
1501501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "  Layer " << layer;
1502501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << to_string(hwcContents.hwLayers[layer], hwc1MinorVersion);
1503501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1504501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1505501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwcContents.outbuf != nullptr) {
1506501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "Output buffer: " << hwcContents.outbuf << "/" <<
1507501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                hwcContents.outbufAcquireFenceFd << '\n';
1508501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1509501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1510501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
1511501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1512501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1513501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::string HWC2On1Adapter::Display::dump() const {
1514501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_mutex> lock(mStateMutex);
1515501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1516501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
1517501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1518501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "  Display " << mId << ": ";
1519501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << to_string(mType) << "  ";
1520501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "HWC1 ID: " << mHwc1Id << "  ";
1521501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "Power mode: " << to_string(mPowerMode) << "  ";
1522501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "Vsync: " << to_string(mVsyncEnabled) << '\n';
1523501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1524501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "    Color modes [active]:";
1525501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& mode : mColorModes) {
1526501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mode == mActiveColorMode) {
1527501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << " [" << mode << ']';
1528501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        } else {
1529501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << " " << mode;
1530501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1531501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1532501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << '\n';
1533501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1534501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "    " << mConfigs.size() << " Config" <<
1535501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            (mConfigs.size() == 1 ? "" : "s") << " (* active)\n";
1536501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& config : mConfigs) {
1537501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << (config == mActiveConfig ? "    * " : "      ");
1538501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << config->toString(true) << '\n';
1539501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1540501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1541501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "    " << mLayers.size() << " Layer" <<
1542501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            (mLayers.size() == 1 ? "" : "s") << '\n';
1543501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& layer : mLayers) {
1544501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << layer->dump();
1545501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1546501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1547501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "    Client target: " << mClientTarget.getBuffer() << '\n';
1548501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1549501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mOutputBuffer.getBuffer() != nullptr) {
1550501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "    Output buffer: " << mOutputBuffer.getBuffer() << '\n';
1551501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1552501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1553501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1RequestedContents) {
1554501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "    Last requested HWC1 state\n";
1555501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << to_string(*mHwc1RequestedContents, mDevice.mHwc1MinorVersion);
1556501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1557501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1558501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
1559501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1560501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1561501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuhwc_rect_t* HWC2On1Adapter::Display::GetRects(size_t numRects) {
1562501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (numRects == 0) {
1563501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return nullptr;
1564501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1565501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1566501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (numRects > mNumAvailableRects) {
1567501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // This should NEVER happen since we calculated how many rects the
1568501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // display would need.
1569501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("Rect allocation failure! SF is likely to crash soon!");
1570501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return nullptr;
1571501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1572501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1573501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc_rect_t* rects = mNextAvailableRect;
1574501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mNextAvailableRect += numRects;
1575501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mNumAvailableRects -= numRects;
1576501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return rects;
1577501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1578501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1579501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuhwc_display_contents_1* HWC2On1Adapter::Display::getDisplayContents() {
1580501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mHwc1RequestedContents.get();
1581501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1582501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1583501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::Config::setAttribute(HWC2::Attribute attribute,
1584501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t value) {
1585501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mAttributes[attribute] = value;
1586501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1587501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1588501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuint32_t HWC2On1Adapter::Display::Config::getAttribute(Attribute attribute) const {
1589501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mAttributes.count(attribute) == 0) {
1590501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return -1;
1591501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1592501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mAttributes.at(attribute);
1593501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1594501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1595501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::Config::setHwc1Id(uint32_t id) {
1596501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    android_color_mode_t colorMode = static_cast<android_color_mode_t>(getAttribute(ColorMode));
1597501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Ids.emplace(colorMode, id);
1598501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1599501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1600501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::Display::Config::hasHwc1Id(uint32_t id) const {
1601501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& idPair : mHwc1Ids) {
1602501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (id == idPair.second) {
1603501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return true;
1604501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1605501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1606501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return false;
1607501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1608501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1609501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::Config::getColorModeForHwc1Id(
1610501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t id, android_color_mode_t* outMode) const {
1611501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& idPair : mHwc1Ids) {
1612501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (id == idPair.second) {
1613501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            *outMode = idPair.first;
1614501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return Error::None;
1615501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1616501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1617501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGE("Unable to find color mode for HWC ID %" PRIu32 " on config %u", id, mId);
1618501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::BadParameter;
1619501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1620501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1621501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Display::Config::getHwc1IdForColorMode(android_color_mode_t mode,
1622501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t* outId) const {
1623501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& idPair : mHwc1Ids) {
1624501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mode == idPair.first) {
1625501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            *outId = idPair.second;
1626501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return Error::None;
1627501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1628501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1629501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGE("Unable to find HWC1 ID for color mode %d on config %u", mode, mId);
1630501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::BadParameter;
1631501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1632501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1633501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::Display::Config::merge(const Config& other) {
1634501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto attributes = {HWC2::Attribute::Width, HWC2::Attribute::Height,
1635501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            HWC2::Attribute::VsyncPeriod, HWC2::Attribute::DpiX,
1636501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            HWC2::Attribute::DpiY};
1637501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto attribute : attributes) {
1638501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (getAttribute(attribute) != other.getAttribute(attribute)) {
1639501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return false;
1640501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1641501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1642501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    android_color_mode_t otherColorMode =
1643501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            static_cast<android_color_mode_t>(other.getAttribute(ColorMode));
1644501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1Ids.count(otherColorMode) != 0) {
1645501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("Attempted to merge two configs (%u and %u) which appear to be "
1646501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                "identical", mHwc1Ids.at(otherColorMode),
1647501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                other.mHwc1Ids.at(otherColorMode));
1648501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return false;
1649501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1650501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Ids.emplace(otherColorMode,
1651501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            other.mHwc1Ids.at(otherColorMode));
1652501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return true;
1653501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1654501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1655501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::set<android_color_mode_t> HWC2On1Adapter::Display::Config::getColorModes() const {
1656501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::set<android_color_mode_t> colorModes;
1657501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& idPair : mHwc1Ids) {
1658501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        colorModes.emplace(idPair.first);
1659501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1660501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return colorModes;
1661501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1662501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1663501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::string HWC2On1Adapter::Display::Config::toString(bool splitLine) const {
1664501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::string output;
1665501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1666501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const size_t BUFFER_SIZE = 100;
1667501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    char buffer[BUFFER_SIZE] = {};
1668501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto writtenBytes = snprintf(buffer, BUFFER_SIZE,
1669501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            "%u x %u", mAttributes.at(HWC2::Attribute::Width),
1670501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mAttributes.at(HWC2::Attribute::Height));
1671501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output.append(buffer, writtenBytes);
1672501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1673501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mAttributes.count(HWC2::Attribute::VsyncPeriod) != 0) {
1674501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::memset(buffer, 0, BUFFER_SIZE);
1675501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        writtenBytes = snprintf(buffer, BUFFER_SIZE, " @ %.1f Hz",
1676501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                1e9 / mAttributes.at(HWC2::Attribute::VsyncPeriod));
1677501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output.append(buffer, writtenBytes);
1678501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1679501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1680501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mAttributes.count(HWC2::Attribute::DpiX) != 0 &&
1681501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mAttributes.at(HWC2::Attribute::DpiX) != -1) {
1682501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::memset(buffer, 0, BUFFER_SIZE);
1683501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        writtenBytes = snprintf(buffer, BUFFER_SIZE,
1684501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ", DPI: %.1f x %.1f",
1685501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mAttributes.at(HWC2::Attribute::DpiX) / 1000.0f,
1686501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mAttributes.at(HWC2::Attribute::DpiY) / 1000.0f);
1687501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output.append(buffer, writtenBytes);
1688501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1689501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1690501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::memset(buffer, 0, BUFFER_SIZE);
1691501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (splitLine) {
1692501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        writtenBytes = snprintf(buffer, BUFFER_SIZE,
1693501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                "\n        HWC1 ID/Color transform:");
1694501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
1695501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        writtenBytes = snprintf(buffer, BUFFER_SIZE,
1696501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ", HWC1 ID/Color transform:");
1697501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1698501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output.append(buffer, writtenBytes);
1699501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1700501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1701501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& id : mHwc1Ids) {
1702501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        android_color_mode_t colorMode = id.first;
1703501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t hwc1Id = id.second;
1704501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::memset(buffer, 0, BUFFER_SIZE);
1705501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (colorMode == mDisplay.mActiveColorMode) {
1706501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            writtenBytes = snprintf(buffer, BUFFER_SIZE, " [%u/%d]", hwc1Id,
1707501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    colorMode);
1708501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        } else {
1709501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            writtenBytes = snprintf(buffer, BUFFER_SIZE, " %u/%d", hwc1Id,
1710501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    colorMode);
1711501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1712501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output.append(buffer, writtenBytes);
1713501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1714501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1715501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output;
1716501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1717501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1718501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::shared_ptr<const HWC2On1Adapter::Display::Config>
1719501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        HWC2On1Adapter::Display::getConfig(hwc2_config_t configId) const {
1720501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (configId > mConfigs.size() || !mConfigs[configId]->isOnDisplay(*this)) {
1721501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return nullptr;
1722501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1723501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mConfigs[configId];
1724501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1725501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1726501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::populateColorModes() {
1727501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mColorModes = mConfigs[0]->getColorModes();
1728501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& config : mConfigs) {
1729501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::set<android_color_mode_t> intersection;
1730501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto configModes = config->getColorModes();
1731501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::set_intersection(mColorModes.cbegin(), mColorModes.cend(),
1732501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                configModes.cbegin(), configModes.cend(),
1733501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                std::inserter(intersection, intersection.begin()));
1734501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::swap(intersection, mColorModes);
1735501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1736501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1737501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1738501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::initializeActiveConfig() {
1739501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDevice.mHwc1Device->getActiveConfig == nullptr) {
1740501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("getActiveConfig is null, choosing config 0");
1741501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mActiveConfig = mConfigs[0];
1742501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mActiveColorMode = HAL_COLOR_MODE_NATIVE;
1743501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
1744501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1745501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1746501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto activeConfig = mDevice.mHwc1Device->getActiveConfig(
1747501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mDevice.mHwc1Device, mHwc1Id);
1748501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1749501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Some devices startup without an activeConfig:
1750501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // We need to set one ourselves.
1751501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (activeConfig == HWC_ERROR) {
1752501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("There is no active configuration: Picking the first one: 0.");
1753501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const int defaultIndex = 0;
1754501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mDevice.mHwc1Device->setActiveConfig(mDevice.mHwc1Device, mHwc1Id, defaultIndex);
1755501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        activeConfig = defaultIndex;
1756501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1757501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1758501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& config : mConfigs) {
1759501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (config->hasHwc1Id(activeConfig)) {
1760501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE("Setting active config to %d for HWC1 config %u", config->getId(), activeConfig);
1761501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mActiveConfig = config;
1762501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (config->getColorModeForHwc1Id(activeConfig, &mActiveColorMode) != Error::None) {
1763501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                // This should never happen since we checked for the config's presence before
1764501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                // setting it as active.
1765501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                ALOGE("Unable to find color mode for active HWC1 config %d", config->getId());
1766501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mActiveColorMode = HAL_COLOR_MODE_NATIVE;
1767501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1768501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1769501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
1770501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1771501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!mActiveConfig) {
1772501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Unable to find active HWC1 config %u, defaulting to "
1773501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                "config 0", activeConfig);
1774501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mActiveConfig = mConfigs[0];
1775501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mActiveColorMode = HAL_COLOR_MODE_NATIVE;
1776501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1777501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1778501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1779501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1780501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1781501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1782501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1783501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::allocateRequestedContents() {
1784501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // What needs to be allocated:
1785501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // 1 hwc_display_contents_1_t
1786501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // 1 hwc_layer_1_t for each layer
1787501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // 1 hwc_rect_t for each layer's surfaceDamage
1788501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // 1 hwc_rect_t for each layer's visibleRegion
1789501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // 1 hwc_layer_1_t for the framebuffer
1790501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // 1 hwc_rect_t for the framebuffer's visibleRegion
1791501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1792501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Count # of surfaceDamage
1793501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numSurfaceDamages = 0;
1794501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& layer : mLayers) {
1795501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        numSurfaceDamages += layer->getNumSurfaceDamages();
1796501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1797501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1798501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Count # of visibleRegions (start at 1 for mandatory framebuffer target
1799501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // region)
1800501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numVisibleRegion = 1;
1801501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& layer : mLayers) {
1802501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        numVisibleRegion += layer->getNumVisibleRegions();
1803501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1804501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1805501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numRects = numVisibleRegion + numSurfaceDamages;
1806501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto numLayers = mLayers.size() + 1;
1807501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t size = sizeof(hwc_display_contents_1_t) +
1808501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            sizeof(hwc_layer_1_t) * numLayers +
1809501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            sizeof(hwc_rect_t) * numRects;
1810501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto contents = static_cast<hwc_display_contents_1_t*>(std::calloc(size, 1));
1811501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1RequestedContents.reset(contents);
1812501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mNextAvailableRect = reinterpret_cast<hwc_rect_t*>(&contents->hwLayers[numLayers]);
1813501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mNumAvailableRects = numRects;
1814501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1815501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1816501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::assignHwc1LayerIds() {
1817501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1LayerMap.clear();
1818501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t nextHwc1Id = 0;
1819501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto& layer : mLayers) {
1820501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1LayerMap[nextHwc1Id] = layer;
1821501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        layer->setHwc1Id(nextHwc1Id++);
1822501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1823501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1824501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1825501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::updateTypeChanges(const hwc_layer_1_t& hwc1Layer,
1826501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const Layer& layer) {
1827501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto layerId = layer.getId();
1828501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (hwc1Layer.compositionType) {
1829501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_FRAMEBUFFER:
1830501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (layer.getCompositionType() != Composition::Client) {
1831501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mChanges->addTypeChange(layerId, Composition::Client);
1832501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1833501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1834501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_OVERLAY:
1835501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (layer.getCompositionType() != Composition::Device) {
1836501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mChanges->addTypeChange(layerId, Composition::Device);
1837501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
1838501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1839501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_BACKGROUND:
1840501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE_IF(layer.getCompositionType() != Composition::SolidColor,
1841501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    "updateTypeChanges: HWC1 requested BACKGROUND, but HWC2"
1842501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    " wasn't expecting SolidColor");
1843501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1844501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_FRAMEBUFFER_TARGET:
1845501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // Do nothing, since it shouldn't be modified by HWC1
1846501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1847501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_SIDEBAND:
1848501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE_IF(layer.getCompositionType() != Composition::Sideband,
1849501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    "updateTypeChanges: HWC1 requested SIDEBAND, but HWC2"
1850501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    " wasn't expecting Sideband");
1851501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1852501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case HWC_CURSOR_OVERLAY:
1853501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE_IF(layer.getCompositionType() != Composition::Cursor,
1854501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    "updateTypeChanges: HWC1 requested CURSOR_OVERLAY, but"
1855501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    " HWC2 wasn't expecting Cursor");
1856501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
1857501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1858501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1859501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1860501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::updateLayerRequests(
1861501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const hwc_layer_1_t& hwc1Layer, const Layer& layer) {
1862501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if ((hwc1Layer.hints & HWC_HINT_CLEAR_FB) != 0) {
1863501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mChanges->addLayerRequest(layer.getId(),
1864501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                LayerRequest::ClearClientTarget);
1865501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1866501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1867501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1868501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Display::prepareFramebufferTarget() {
1869501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // We check that mActiveConfig is valid in Display::prepare
1870501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    int32_t width = mActiveConfig->getAttribute(Attribute::Width);
1871501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    int32_t height = mActiveConfig->getAttribute(Attribute::Height);
1872501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1873501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto& hwc1Target = mHwc1RequestedContents->hwLayers[mLayers.size()];
1874501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.compositionType = HWC_FRAMEBUFFER_TARGET;
1875501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.releaseFenceFd = -1;
1876501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.hints = 0;
1877501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.flags = 0;
1878501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.transform = 0;
1879501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.blending = HWC_BLENDING_PREMULT;
1880501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDevice.getHwc1MinorVersion() < 3) {
1881501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Target.sourceCropi = {0, 0, width, height};
1882501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
1883501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Target.sourceCropf = {0.0f, 0.0f, static_cast<float>(width),
1884501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<float>(height)};
1885501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1886501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.displayFrame = {0, 0, width, height};
1887501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.planeAlpha = 255;
1888501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1889501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.visibleRegionScreen.numRects = 1;
1890501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc_rect_t* rects = GetRects(1);
1891501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    rects[0].left = 0;
1892501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    rects[0].top = 0;
1893501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    rects[0].right = width;
1894501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    rects[0].bottom = height;
1895501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.visibleRegionScreen.rects = rects;
1896501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1897501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // We will set this to the correct value in set
1898501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Target.acquireFenceFd = -1;
1899501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1900501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1901501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu// Layer functions
1902501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1903501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::atomic<hwc2_layer_t> HWC2On1Adapter::Layer::sNextId(1);
1904501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1905501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuHWC2On1Adapter::Layer::Layer(Display& display)
1906501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu  : mId(sNextId++),
1907501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay(display),
1908501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mBuffer(),
1909501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mSurfaceDamage(),
1910501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mBlendMode(BlendMode::None),
1911501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mColor({0, 0, 0, 0}),
1912501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mCompositionType(Composition::Invalid),
1913501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplayFrame({0, 0, -1, -1}),
1914501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mPlaneAlpha(0.0f),
1915501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mSidebandStream(nullptr),
1916501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mSourceCrop({0.0f, 0.0f, -1.0f, -1.0f}),
1917501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mTransform(Transform::None),
1918501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mVisibleRegion(),
1919501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mZ(0),
1920501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mReleaseFence(),
1921501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Id(0),
1922501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHasUnsupportedPlaneAlpha(false) {}
1923501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1924501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::SortLayersByZ::operator()(
1925501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const std::shared_ptr<Layer>& lhs, const std::shared_ptr<Layer>& rhs) {
1926501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return lhs->getZ() < rhs->getZ();
1927501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1928501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1929501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setBuffer(buffer_handle_t buffer,
1930501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int32_t acquireFence) {
1931501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Setting acquireFence to %d for layer %" PRIu64, acquireFence, mId);
1932501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mBuffer.setBuffer(buffer);
1933501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mBuffer.setFence(acquireFence);
1934501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1935501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1936501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1937501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setCursorPosition(int32_t x, int32_t y) {
1938501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mCompositionType != Composition::Cursor) {
1939501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::BadLayer;
1940501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1941501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1942501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDisplay.hasChanges()) {
1943501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::NotValidated;
1944501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1945501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1946501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto displayId = mDisplay.getHwc1Id();
1947501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto hwc1Device = mDisplay.getDevice().getHwc1Device();
1948501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Device->setCursorPositionAsync(hwc1Device, displayId, x, y);
1949501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1950501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1951501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1952501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setSurfaceDamage(hwc_region_t damage) {
1953501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // HWC1 supports surface damage starting only with version 1.5.
1954501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mDisplay.getDevice().mHwc1MinorVersion < 5) {
1955501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return Error::None;
1956501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
1957501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mSurfaceDamage.resize(damage.numRects);
1958501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::copy_n(damage.rects, damage.numRects, mSurfaceDamage.begin());
1959501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1960501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1961501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1962501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu// Layer state functions
1963501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1964501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setBlendMode(BlendMode mode) {
1965501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mBlendMode = mode;
1966501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
1967501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1968501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1969501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1970501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setColor(hwc_color_t color) {
1971501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mColor = color;
1972501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
1973501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1974501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1975501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1976501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setCompositionType(Composition type) {
1977501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mCompositionType = type;
1978501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
1979501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1980501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1981501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1982501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setDataspace(android_dataspace_t) {
1983501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1984501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1985501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1986501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setDisplayFrame(hwc_rect_t frame) {
1987501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplayFrame = frame;
1988501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
1989501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1990501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1991501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1992501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setPlaneAlpha(float alpha) {
1993501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mPlaneAlpha = alpha;
1994501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
1995501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
1996501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
1997501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
1998501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setSidebandStream(const native_handle_t* stream) {
1999501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mSidebandStream = stream;
2000501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
2001501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
2002501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2003501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2004501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setSourceCrop(hwc_frect_t crop) {
2005501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mSourceCrop = crop;
2006501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
2007501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
2008501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2009501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2010501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setTransform(Transform transform) {
2011501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mTransform = transform;
2012501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplay.markGeometryChanged();
2013501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
2014501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2015501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2016501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic bool compareRects(const hwc_rect_t& rect1, const hwc_rect_t& rect2) {
2017501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return rect1.left == rect2.left &&
2018501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            rect1.right == rect2.right &&
2019501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            rect1.top == rect2.top &&
2020501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            rect1.bottom == rect2.bottom;
2021501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2022501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2023501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setVisibleRegion(hwc_region_t visible) {
2024501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if ((getNumVisibleRegions() != visible.numRects) ||
2025501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        !std::equal(mVisibleRegion.begin(), mVisibleRegion.end(), visible.rects,
2026501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    compareRects)) {
2027501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mVisibleRegion.resize(visible.numRects);
2028501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::copy_n(visible.rects, visible.numRects, mVisibleRegion.begin());
2029501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mDisplay.markGeometryChanged();
2030501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2031501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
2032501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2033501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2034501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::Layer::setZ(uint32_t z) {
2035501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mZ = z;
2036501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
2037501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2038501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2039501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::addReleaseFence(int fenceFd) {
2040501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("addReleaseFence %d to layer %" PRIu64, fenceFd, mId);
2041501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mReleaseFence.add(fenceFd);
2042501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2043501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2044501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuconst sp<MiniFence>& HWC2On1Adapter::Layer::getReleaseFence() const {
2045501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return mReleaseFence.get();
2046501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2047501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2048501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::applyState(hwc_layer_1_t& hwc1Layer) {
2049501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    applyCommonState(hwc1Layer);
2050501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    applyCompositionType(hwc1Layer);
2051501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (mCompositionType) {
2052501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::SolidColor : applySolidColorState(hwc1Layer); break;
2053501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::Sideband : applySidebandState(hwc1Layer); break;
2054501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default: applyBufferState(hwc1Layer); break;
2055501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2056501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2057501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2058501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic std::string regionStrings(const std::vector<hwc_rect_t>& visibleRegion,
2059501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        const std::vector<hwc_rect_t>& surfaceDamage) {
2060501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::string regions;
2061501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    regions += "        Visible Region";
2062501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    regions.resize(40, ' ');
2063501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    regions += "Surface Damage\n";
2064501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2065501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t numPrinted = 0;
2066501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t maxSize = std::max(visibleRegion.size(), surfaceDamage.size());
2067501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    while (numPrinted < maxSize) {
2068501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::string line("        ");
2069501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (visibleRegion.empty() && numPrinted == 0) {
2070501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            line += "None";
2071501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        } else if (numPrinted < visibleRegion.size()) {
2072501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            line += rectString(visibleRegion[numPrinted]);
2073501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2074501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        line.resize(40, ' ');
2075501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (surfaceDamage.empty() && numPrinted == 0) {
2076501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            line += "None";
2077501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        } else if (numPrinted < surfaceDamage.size()) {
2078501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            line += rectString(surfaceDamage[numPrinted]);
2079501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2080501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        line += '\n';
2081501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        regions += line;
2082501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ++numPrinted;
2083501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2084501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return regions;
2085501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2086501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2087501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::string HWC2On1Adapter::Layer::dump() const {
2088501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::stringstream output;
2089501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const char* fill = "      ";
2090501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2091501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << fill << to_string(mCompositionType);
2092501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << " Layer  HWC2/1: " << mId << "/" << mHwc1Id << "  ";
2093501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    output << "Z: " << mZ;
2094501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mCompositionType == HWC2::Composition::SolidColor) {
2095501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  " << colorString(mColor);
2096501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else if (mCompositionType == HWC2::Composition::Sideband) {
2097501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Handle: " << mSidebandStream << '\n';
2098501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
2099501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Buffer: " << mBuffer.getBuffer() << "/" <<
2100501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mBuffer.getFence() << '\n';
2101501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "  Display frame [LTRB]: " <<
2102501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                rectString(mDisplayFrame) << '\n';
2103501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "  Source crop: " <<
2104501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                frectString(mSourceCrop) << '\n';
2105501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << fill << "  Transform: " << to_string(mTransform);
2106501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << "  Blend mode: " << to_string(mBlendMode);
2107501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mPlaneAlpha != 1.0f) {
2108501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << "  Alpha: " <<
2109501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                alphaString(mPlaneAlpha) << '\n';
2110501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        } else {
2111501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            output << '\n';
2112501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2113501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        output << regionStrings(mVisibleRegion, mSurfaceDamage);
2114501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2115501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return output.str();
2116501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2117501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2118501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustatic int getHwc1Blending(HWC2::BlendMode blendMode) {
2119501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (blendMode) {
2120501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case BlendMode::Coverage: return HWC_BLENDING_COVERAGE;
2121501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case BlendMode::Premultiplied: return HWC_BLENDING_PREMULT;
2122501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default: return HWC_BLENDING_NONE;
2123501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2124501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2125501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2126501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::applyCommonState(hwc_layer_1_t& hwc1Layer) {
2127501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto minorVersion = mDisplay.getDevice().getHwc1MinorVersion();
2128501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.blending = getHwc1Blending(mBlendMode);
2129501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.displayFrame = mDisplayFrame;
2130501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2131501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto pendingAlpha = mPlaneAlpha;
2132501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (minorVersion < 2) {
2133501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHasUnsupportedPlaneAlpha = pendingAlpha < 1.0f;
2134501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
2135501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.planeAlpha =
2136501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<uint8_t>(255.0f * pendingAlpha + 0.5f);
2137501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2138501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2139501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (minorVersion < 3) {
2140501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto pending = mSourceCrop;
2141501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.sourceCropi.left =
2142501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<int32_t>(std::ceil(pending.left));
2143501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.sourceCropi.top =
2144501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<int32_t>(std::ceil(pending.top));
2145501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.sourceCropi.right =
2146501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<int32_t>(std::floor(pending.right));
2147501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.sourceCropi.bottom =
2148501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                static_cast<int32_t>(std::floor(pending.bottom));
2149501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
2150501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.sourceCropf = mSourceCrop;
2151501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2152501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2153501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.transform = static_cast<uint32_t>(mTransform);
2154501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2155501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto& hwc1VisibleRegion = hwc1Layer.visibleRegionScreen;
2156501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1VisibleRegion.numRects = mVisibleRegion.size();
2157501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc_rect_t* rects = mDisplay.GetRects(hwc1VisibleRegion.numRects);
2158501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1VisibleRegion.rects = rects;
2159501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t i = 0; i < mVisibleRegion.size(); i++) {
2160501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        rects[i] = mVisibleRegion[i];
2161501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2162501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2163501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2164501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::applySolidColorState(hwc_layer_1_t& hwc1Layer) {
2165501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // If the device does not support background color it is likely to make
2166501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // assumption regarding backgroundColor and handle (both fields occupy
2167501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // the same location in hwc_layer_1_t union).
2168501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // To not confuse these devices we don't set background color and we
2169501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // make sure handle is a null pointer.
2170501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hasUnsupportedBackgroundColor()) {
2171501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.handle = nullptr;
2172501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
2173501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.backgroundColor = mColor;
2174501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2175501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2176501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2177501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::applySidebandState(hwc_layer_1_t& hwc1Layer) {
2178501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.sidebandStream = mSidebandStream;
2179501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2180501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2181501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::applyBufferState(hwc_layer_1_t& hwc1Layer) {
2182501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.handle = mBuffer.getBuffer();
2183501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.acquireFenceFd = mBuffer.getFence();
2184501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2185501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2186501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::Layer::applyCompositionType(hwc_layer_1_t& hwc1Layer) {
2187501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // HWC1 never supports color transforms or dataspaces and only sometimes
2188501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // supports plane alpha (depending on the version). These require us to drop
2189501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // some or all layers to client composition.
2190501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHasUnsupportedPlaneAlpha || mDisplay.hasColorTransform() ||
2191501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hasUnsupportedBackgroundColor()) {
2192501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2193501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc1Layer.flags = HWC_SKIP_LAYER;
2194501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
2195501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2196501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2197501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc1Layer.flags = 0;
2198501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    switch (mCompositionType) {
2199501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::Client:
2200501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2201501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.flags |= HWC_SKIP_LAYER;
2202501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
2203501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::Device:
2204501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2205501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
2206501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::SolidColor:
2207501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // In theory the following line should work, but since the HWC1
2208501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // version of SurfaceFlinger never used HWC_BACKGROUND, HWC1
2209501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // devices may not work correctly. To be on the safe side, we
2210501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // fall back to client composition.
2211501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            //
2212501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            // hwc1Layer.compositionType = HWC_BACKGROUND;
2213501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2214501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.flags |= HWC_SKIP_LAYER;
2215501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
2216501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::Cursor:
2217501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2218501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (mDisplay.getDevice().getHwc1MinorVersion() >= 4) {
2219501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                hwc1Layer.hints |= HWC_IS_CURSOR_LAYER;
2220501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
2221501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
2222501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        case Composition::Sideband:
2223501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (mDisplay.getDevice().getHwc1MinorVersion() < 4) {
2224501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                hwc1Layer.compositionType = HWC_SIDEBAND;
2225501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            } else {
2226501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2227501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                hwc1Layer.flags |= HWC_SKIP_LAYER;
2228501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
2229501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
2230501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        default:
2231501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.compositionType = HWC_FRAMEBUFFER;
2232501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.flags |= HWC_SKIP_LAYER;
2233501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            break;
2234501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2235501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Layer %" PRIu64 " %s set to %d", mId,
2236501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            to_string(mCompositionType).c_str(),
2237501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc1Layer.compositionType);
2238501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV_IF(hwc1Layer.flags & HWC_SKIP_LAYER, "    and skipping");
2239501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2240501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2241501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu// Adapter helpers
2242501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2243501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::populateCapabilities() {
2244501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1MinorVersion >= 3U) {
2245501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int supportedTypes = 0;
2246501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto result = mHwc1Device->query(mHwc1Device,
2247501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                HWC_DISPLAY_TYPES_SUPPORTED, &supportedTypes);
2248501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if ((result == 0) && ((supportedTypes & HWC_DISPLAY_VIRTUAL_BIT) != 0)) {
2249501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGI("Found support for HWC virtual displays");
2250501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mHwc1SupportsVirtualDisplays = true;
2251501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2252501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2253501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1MinorVersion >= 4U) {
2254501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mCapabilities.insert(Capability::SidebandStream);
2255501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2256501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2257501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Check for HWC background color layer support.
2258501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1MinorVersion >= 1U) {
2259501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int backgroundColorSupported = 0;
2260501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto result = mHwc1Device->query(mHwc1Device,
2261501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                                         HWC_BACKGROUND_LAYER_SUPPORTED,
2262501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                                         &backgroundColorSupported);
2263501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if ((result == 0) && (backgroundColorSupported == 1)) {
2264501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("Found support for HWC background color");
2265501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mHwc1SupportsBackgroundColor = true;
2266501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2267501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2268501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2269501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Some devices might have HWC1 retire fences that accurately emulate
2270501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // HWC2 present fences when they are deferred, but it's not very reliable.
2271501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // To be safe, we indicate PresentFenceIsNotReliable for all HWC1 devices.
2272501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mCapabilities.insert(Capability::PresentFenceIsNotReliable);
2273501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2274501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2275501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuHWC2On1Adapter::Display* HWC2On1Adapter::getDisplay(hwc2_display_t id) {
2276501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2277501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2278501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto display = mDisplays.find(id);
2279501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (display == mDisplays.end()) {
2280501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return nullptr;
2281501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2282501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2283501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return display->second.get();
2284501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2285501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2286501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustd::tuple<HWC2On1Adapter::Layer*, Error> HWC2On1Adapter::getLayer(
2287501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc2_display_t displayId, hwc2_layer_t layerId) {
2288501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto display = getDisplay(displayId);
2289501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (!display) {
2290501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadDisplay);
2291501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2292501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2293501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto layerEntry = mLayers.find(layerId);
2294501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (layerEntry == mLayers.end()) {
2295501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadLayer);
2296501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2297501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2298501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto layer = layerEntry->second;
2299501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (layer->getDisplay().getId() != displayId) {
2300501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadLayer);
2301501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2302501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return std::make_tuple(layer.get(), Error::None);
2303501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2304501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2305501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::populatePrimary() {
2306501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2307501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2308501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical);
2309501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1DisplayMap[HWC_DISPLAY_PRIMARY] = display->getId();
2310501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    display->setHwc1Id(HWC_DISPLAY_PRIMARY);
2311501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    display->populateConfigs();
2312501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mDisplays.emplace(display->getId(), std::move(display));
2313501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2314501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2315501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wubool HWC2On1Adapter::prepareAllDisplays() {
2316501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ATRACE_CALL();
2317501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2318501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2319501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2320501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& displayPair : mDisplays) {
2321501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& display = displayPair.second;
2322501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (!display->prepare()) {
2323501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return false;
2324501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2325501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2326501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2327501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1DisplayMap.count(HWC_DISPLAY_PRIMARY) == 0) {
2328501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("prepareAllDisplays: Unable to find primary HWC1 display");
2329501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return false;
2330501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2331501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2332501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Build an array of hwc_display_contents_1 to call prepare() on HWC1.
2333501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Contents.clear();
2334501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2335501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Always push the primary display
2336501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto primaryDisplayId = mHwc1DisplayMap[HWC_DISPLAY_PRIMARY];
2337501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto& primaryDisplay = mDisplays[primaryDisplayId];
2338501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    mHwc1Contents.push_back(primaryDisplay->getDisplayContents());
2339501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2340501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Push the external display, if present
2341501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1DisplayMap.count(HWC_DISPLAY_EXTERNAL) != 0) {
2342501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto externalDisplayId = mHwc1DisplayMap[HWC_DISPLAY_EXTERNAL];
2343501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& externalDisplay = mDisplays[externalDisplayId];
2344501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1Contents.push_back(externalDisplay->getDisplayContents());
2345501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
2346501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Even if an external display isn't present, we still need to send
2347501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // at least two displays down to HWC1
2348501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1Contents.push_back(nullptr);
2349501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2350501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2351501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Push the hardware virtual display, if supported and present
2352501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1MinorVersion >= 3) {
2353501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mHwc1DisplayMap.count(HWC_DISPLAY_VIRTUAL) != 0) {
2354501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto virtualDisplayId = mHwc1DisplayMap[HWC_DISPLAY_VIRTUAL];
2355501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto& virtualDisplay = mDisplays[virtualDisplayId];
2356501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mHwc1Contents.push_back(virtualDisplay->getDisplayContents());
2357501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        } else {
2358501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            mHwc1Contents.push_back(nullptr);
2359501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2360501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2361501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2362501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto& displayContents : mHwc1Contents) {
2363501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (!displayContents) {
2364501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
2365501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2366501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2367501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Display %zd layers:", mHwc1Contents.size() - 1);
2368501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (size_t l = 0; l < displayContents->numHwLayers; ++l) {
2369501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            auto& layer = displayContents->hwLayers[l];
2370501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("  %zd: %d", l, layer.compositionType);
2371501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2372501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2373501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2374501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Calling HWC1 prepare");
2375501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    {
2376501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ATRACE_NAME("HWC1 prepare");
2377501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1Device->prepare(mHwc1Device, mHwc1Contents.size(),
2378501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mHwc1Contents.data());
2379501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2380501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2381501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t c = 0; c < mHwc1Contents.size(); ++c) {
2382501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& contents = mHwc1Contents[c];
2383501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (!contents) {
2384501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
2385501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2386501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("Display %zd layers:", c);
2387501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for (size_t l = 0; l < contents->numHwLayers; ++l) {
2388501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("  %zd: %d", l, contents->hwLayers[l].compositionType);
2389501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2390501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2391501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2392501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Return the received contents to their respective displays
2393501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t hwc1Id = 0; hwc1Id < mHwc1Contents.size(); ++hwc1Id) {
2394501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mHwc1Contents[hwc1Id] == nullptr) {
2395501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
2396501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2397501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2398501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto displayId = mHwc1DisplayMap[hwc1Id];
2399501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& display = mDisplays[displayId];
2400501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        display->generateChanges();
2401501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2402501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2403501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return true;
2404501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2405501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2406501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid dumpHWC1Message(hwc_composer_device_1* device, size_t numDisplays,
2407501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                     hwc_display_contents_1_t** displays) {
2408501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("*****************************");
2409501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    size_t displayId = 0;
2410501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    while (displayId < numDisplays) {
2411501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc_display_contents_1_t* display = displays[displayId];
2412501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2413501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("hwc_display_contents_1_t[%zu] @0x%p", displayId, display);
2414501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (display == nullptr) {
2415501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            displayId++;
2416501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
2417501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2418501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("  retirefd:0x%08x", display->retireFenceFd);
2419501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("  outbuf  :0x%p", display->outbuf);
2420501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("  outbuffd:0x%08x", display->outbufAcquireFenceFd);
2421501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("  flags   :0x%08x", display->flags);
2422501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        for(size_t layerId=0 ; layerId < display->numHwLayers ; layerId++) {
2423501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc_layer_1_t& layer = display->hwLayers[layerId];
2424501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("    Layer[%zu]:", layerId);
2425501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      composition        : 0x%08x", layer.compositionType);
2426501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      hints              : 0x%08x", layer.hints);
2427501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      flags              : 0x%08x", layer.flags);
2428501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      handle             : 0x%p", layer.handle);
2429501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      transform          : 0x%08x", layer.transform);
2430501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      blending           : 0x%08x", layer.blending);
2431501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      sourceCropf        : %f, %f, %f, %f",
2432501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.sourceCropf.left,
2433501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.sourceCropf.top,
2434501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.sourceCropf.right,
2435501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.sourceCropf.bottom);
2436501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      displayFrame       : %d, %d, %d, %d",
2437501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.displayFrame.left,
2438501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.displayFrame.left,
2439501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.displayFrame.left,
2440501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.displayFrame.left);
2441501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            hwc_region_t& visReg = layer.visibleRegionScreen;
2442501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      visibleRegionScreen: #0x%08zx[@0x%p]",
2443501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  visReg.numRects,
2444501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  visReg.rects);
2445501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            for (size_t visRegId=0; visRegId < visReg.numRects ; visRegId++) {
2446501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                if (layer.visibleRegionScreen.rects == nullptr) {
2447501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    ALOGV("        null");
2448501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                } else {
2449501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    ALOGV("        visibleRegionScreen[%zu] %d, %d, %d, %d",
2450501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          visRegId,
2451501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          visReg.rects[visRegId].left,
2452501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          visReg.rects[visRegId].top,
2453501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          visReg.rects[visRegId].right,
2454501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          visReg.rects[visRegId].bottom);
2455501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                }
2456501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
2457501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      acquireFenceFd     : 0x%08x", layer.acquireFenceFd);
2458501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      releaseFenceFd     : 0x%08x", layer.releaseFenceFd);
2459501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      planeAlpha         : 0x%08x", layer.planeAlpha);
2460501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            if (getMinorVersion(device) < 5)
2461501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu               continue;
2462501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGV("      surfaceDamage      : #0x%08zx[@0x%p]",
2463501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.surfaceDamage.numRects,
2464501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                  layer.surfaceDamage.rects);
2465501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            for (size_t sdId=0; sdId < layer.surfaceDamage.numRects ; sdId++) {
2466501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                if (layer.surfaceDamage.rects == nullptr) {
2467501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    ALOGV("      null");
2468501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                } else {
2469501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    ALOGV("      surfaceDamage[%zu] %d, %d, %d, %d",
2470501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          sdId,
2471501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          layer.surfaceDamage.rects[sdId].left,
2472501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          layer.surfaceDamage.rects[sdId].top,
2473501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          layer.surfaceDamage.rects[sdId].right,
2474501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                          layer.surfaceDamage.rects[sdId].bottom);
2475501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                }
2476501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            }
2477501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2478501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        displayId++;
2479501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2480501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("-----------------------------");
2481501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2482501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2483501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I WuError HWC2On1Adapter::setAllDisplays() {
2484501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ATRACE_CALL();
2485501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2486501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2487501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2488501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Make sure we're ready to validate
2489501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t hwc1Id = 0; hwc1Id < mHwc1Contents.size(); ++hwc1Id) {
2490501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mHwc1Contents[hwc1Id] == nullptr) {
2491501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
2492501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2493501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2494501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto displayId = mHwc1DisplayMap[hwc1Id];
2495501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& display = mDisplays[displayId];
2496501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        Error error = display->set(*mHwc1Contents[hwc1Id]);
2497501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (error != Error::None) {
2498501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGE("setAllDisplays: Failed to set display %zd: %s", hwc1Id,
2499501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    to_string(error).c_str());
2500501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return error;
2501501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2502501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2503501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2504501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Calling HWC1 set");
2505501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    {
2506501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ATRACE_NAME("HWC1 set");
2507501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        //dumpHWC1Message(mHwc1Device, mHwc1Contents.size(), mHwc1Contents.data());
2508501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1Device->set(mHwc1Device, mHwc1Contents.size(),
2509501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                mHwc1Contents.data());
2510501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2511501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2512501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Add retire and release fences
2513501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (size_t hwc1Id = 0; hwc1Id < mHwc1Contents.size(); ++hwc1Id) {
2514501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (mHwc1Contents[hwc1Id] == nullptr) {
2515501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            continue;
2516501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2517501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2518501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto displayId = mHwc1DisplayMap[hwc1Id];
2519501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto& display = mDisplays[displayId];
2520501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto retireFenceFd = mHwc1Contents[hwc1Id]->retireFenceFd;
2521501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGV("setAllDisplays: Adding retire fence %d to display %zd",
2522501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                retireFenceFd, hwc1Id);
2523501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        display->addRetireFence(mHwc1Contents[hwc1Id]->retireFenceFd);
2524501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        display->addReleaseFences(*mHwc1Contents[hwc1Id]);
2525501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2526501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2527501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    return Error::None;
2528501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2529501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2530501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::hwc1Invalidate() {
2531501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Received hwc1Invalidate");
2532501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2533501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2534501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2535501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // If the HWC2-side callback hasn't been registered yet, buffer this until
2536501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // it is registered.
2537501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mCallbacks.count(Callback::Refresh) == 0) {
2538501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHasPendingInvalidate = true;
2539501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
2540501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2541501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2542501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto& callbackInfo = mCallbacks[Callback::Refresh];
2543501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::vector<hwc2_display_t> displays;
2544501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (const auto& displayPair : mDisplays) {
2545501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        displays.emplace_back(displayPair.first);
2546501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2547501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2548501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Call back without the state lock held.
2549501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    lock.unlock();
2550501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2551501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto refresh = reinterpret_cast<HWC2_PFN_REFRESH>(callbackInfo.pointer);
2552501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    for (auto display : displays) {
2553501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        refresh(callbackInfo.data, display);
2554501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2555501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2556501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2557501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::hwc1Vsync(int hwc1DisplayId, int64_t timestamp) {
2558501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Received hwc1Vsync(%d, %" PRId64 ")", hwc1DisplayId, timestamp);
2559501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2560501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2561501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2562501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // If the HWC2-side callback hasn't been registered yet, buffer this until
2563501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // it is registered.
2564501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mCallbacks.count(Callback::Vsync) == 0) {
2565501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mPendingVsyncs.emplace_back(hwc1DisplayId, timestamp);
2566501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
2567501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2568501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2569501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
2570501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("hwc1Vsync: Couldn't find display for HWC1 id %d", hwc1DisplayId);
2571501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
2572501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2573501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2574501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto& callbackInfo = mCallbacks[Callback::Vsync];
2575501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto displayId = mHwc1DisplayMap[hwc1DisplayId];
2576501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2577501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Call back without the state lock held.
2578501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    lock.unlock();
2579501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2580501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto vsync = reinterpret_cast<HWC2_PFN_VSYNC>(callbackInfo.pointer);
2581501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    vsync(callbackInfo.data, displayId, timestamp);
2582501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2583501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2584501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuvoid HWC2On1Adapter::hwc1Hotplug(int hwc1DisplayId, int connected) {
2585501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    ALOGV("Received hwc1Hotplug(%d, %d)", hwc1DisplayId, connected);
2586501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2587501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (hwc1DisplayId != HWC_DISPLAY_EXTERNAL) {
2588501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        ALOGE("hwc1Hotplug: Received hotplug for non-external display");
2589501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
2590501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2591501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2592501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
2593501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2594501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // If the HWC2-side callback hasn't been registered yet, buffer this until
2595501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // it is registered
2596501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mCallbacks.count(Callback::Hotplug) == 0) {
2597501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mPendingHotplugs.emplace_back(hwc1DisplayId, connected);
2598501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        return;
2599501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2600501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2601501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc2_display_t displayId = UINT64_MAX;
2602501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
2603501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (connected == 0) {
2604501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGW("hwc1Hotplug: Received disconnect for unconnected display");
2605501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return;
2606501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2607501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2608501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Create a new display on connect
2609501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        auto display = std::make_shared<HWC2On1Adapter::Display>(*this,
2610501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                HWC2::DisplayType::Physical);
2611501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        display->setHwc1Id(HWC_DISPLAY_EXTERNAL);
2612501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        display->populateConfigs();
2613501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        displayId = display->getId();
2614501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1DisplayMap[HWC_DISPLAY_EXTERNAL] = displayId;
2615501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mDisplays.emplace(displayId, std::move(display));
2616501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    } else {
2617501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        if (connected != 0) {
2618501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            ALOGW("hwc1Hotplug: Received connect for previously connected "
2619501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu                    "display");
2620501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            return;
2621501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        }
2622501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2623501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        // Disconnect an existing display
2624501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        displayId = mHwc1DisplayMap[hwc1DisplayId];
2625501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mHwc1DisplayMap.erase(HWC_DISPLAY_EXTERNAL);
2626501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        mDisplays.erase(displayId);
2627501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    }
2628501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2629501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const auto& callbackInfo = mCallbacks[Callback::Hotplug];
2630501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2631501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    // Call back without the state lock held
2632501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    lock.unlock();
2633501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
2634501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(callbackInfo.pointer);
2635501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    auto hwc2Connected = (connected == 0) ?
2636501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu            HWC2::Connection::Disconnected : HWC2::Connection::Connected;
2637501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hotplug(callbackInfo.data, displayId, static_cast<int32_t>(hwc2Connected));
2638501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu}
2639501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu} // namespace android
2640