Home | History | Annotate | Download | only in hwc2on1adapter
      1 /*
      2  * Copyright 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "hwc2on1adapter/HWC2On1Adapter.h"
     18 
     19 //#define LOG_NDEBUG 0
     20 
     21 #undef LOG_TAG
     22 #define LOG_TAG "HWC2On1Adapter"
     23 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
     24 
     25 
     26 #include <inttypes.h>
     27 
     28 #include <chrono>
     29 #include <cstdlib>
     30 #include <sstream>
     31 
     32 #include <hardware/hwcomposer.h>
     33 #include <log/log.h>
     34 #include <utils/Trace.h>
     35 
     36 using namespace std::chrono_literals;
     37 
     38 static uint8_t getMinorVersion(struct hwc_composer_device_1* device)
     39 {
     40     auto version = device->common.version & HARDWARE_API_VERSION_2_MAJ_MIN_MASK;
     41     return (version >> 16) & 0xF;
     42 }
     43 
     44 template <typename PFN, typename T>
     45 static hwc2_function_pointer_t asFP(T function)
     46 {
     47     static_assert(std::is_same<PFN, T>::value, "Incompatible function pointer");
     48     return reinterpret_cast<hwc2_function_pointer_t>(function);
     49 }
     50 
     51 using namespace HWC2;
     52 
     53 static constexpr Attribute ColorMode = static_cast<Attribute>(6);
     54 
     55 namespace android {
     56 
     57 class HWC2On1Adapter::Callbacks : public hwc_procs_t {
     58     public:
     59         explicit Callbacks(HWC2On1Adapter& adapter) : mAdapter(adapter) {
     60             invalidate = &invalidateHook;
     61             vsync = &vsyncHook;
     62             hotplug = &hotplugHook;
     63         }
     64 
     65         static void invalidateHook(const hwc_procs_t* procs) {
     66             auto callbacks = static_cast<const Callbacks*>(procs);
     67             callbacks->mAdapter.hwc1Invalidate();
     68         }
     69 
     70         static void vsyncHook(const hwc_procs_t* procs, int display,
     71                 int64_t timestamp) {
     72             auto callbacks = static_cast<const Callbacks*>(procs);
     73             callbacks->mAdapter.hwc1Vsync(display, timestamp);
     74         }
     75 
     76         static void hotplugHook(const hwc_procs_t* procs, int display,
     77                 int connected) {
     78             auto callbacks = static_cast<const Callbacks*>(procs);
     79             callbacks->mAdapter.hwc1Hotplug(display, connected);
     80         }
     81 
     82     private:
     83         HWC2On1Adapter& mAdapter;
     84 };
     85 
     86 static int closeHook(hw_device_t* /*device*/)
     87 {
     88     // Do nothing, since the real work is done in the class destructor, but we
     89     // need to provide a valid function pointer for hwc2_close to call
     90     return 0;
     91 }
     92 
     93 HWC2On1Adapter::HWC2On1Adapter(hwc_composer_device_1_t* hwc1Device)
     94   : mDumpString(),
     95     mHwc1Device(hwc1Device),
     96     mHwc1MinorVersion(getMinorVersion(hwc1Device)),
     97     mHwc1SupportsVirtualDisplays(false),
     98     mHwc1SupportsBackgroundColor(false),
     99     mHwc1Callbacks(std::make_unique<Callbacks>(*this)),
    100     mCapabilities(),
    101     mLayers(),
    102     mHwc1VirtualDisplay(),
    103     mStateMutex(),
    104     mCallbacks(),
    105     mHasPendingInvalidate(false),
    106     mPendingVsyncs(),
    107     mPendingHotplugs(),
    108     mDisplays(),
    109     mHwc1DisplayMap()
    110 {
    111     common.close = closeHook;
    112     getCapabilities = getCapabilitiesHook;
    113     getFunction = getFunctionHook;
    114     populateCapabilities();
    115     populatePrimary();
    116     mHwc1Device->registerProcs(mHwc1Device,
    117             static_cast<const hwc_procs_t*>(mHwc1Callbacks.get()));
    118 }
    119 
    120 HWC2On1Adapter::~HWC2On1Adapter() {
    121     hwc_close_1(mHwc1Device);
    122 }
    123 
    124 void HWC2On1Adapter::doGetCapabilities(uint32_t* outCount,
    125         int32_t* outCapabilities) {
    126     if (outCapabilities == nullptr) {
    127         *outCount = mCapabilities.size();
    128         return;
    129     }
    130 
    131     auto capabilityIter = mCapabilities.cbegin();
    132     for (size_t written = 0; written < *outCount; ++written) {
    133         if (capabilityIter == mCapabilities.cend()) {
    134             return;
    135         }
    136         outCapabilities[written] = static_cast<int32_t>(*capabilityIter);
    137         ++capabilityIter;
    138     }
    139 }
    140 
    141 hwc2_function_pointer_t HWC2On1Adapter::doGetFunction(
    142         FunctionDescriptor descriptor) {
    143     switch (descriptor) {
    144         // Device functions
    145         case FunctionDescriptor::CreateVirtualDisplay:
    146             return asFP<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
    147                     createVirtualDisplayHook);
    148         case FunctionDescriptor::DestroyVirtualDisplay:
    149             return asFP<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
    150                     destroyVirtualDisplayHook);
    151         case FunctionDescriptor::Dump:
    152             return asFP<HWC2_PFN_DUMP>(dumpHook);
    153         case FunctionDescriptor::GetMaxVirtualDisplayCount:
    154             return asFP<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
    155                     getMaxVirtualDisplayCountHook);
    156         case FunctionDescriptor::RegisterCallback:
    157             return asFP<HWC2_PFN_REGISTER_CALLBACK>(registerCallbackHook);
    158 
    159         // Display functions
    160         case FunctionDescriptor::AcceptDisplayChanges:
    161             return asFP<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
    162                     displayHook<decltype(&Display::acceptChanges),
    163                     &Display::acceptChanges>);
    164         case FunctionDescriptor::CreateLayer:
    165             return asFP<HWC2_PFN_CREATE_LAYER>(
    166                     displayHook<decltype(&Display::createLayer),
    167                     &Display::createLayer, hwc2_layer_t*>);
    168         case FunctionDescriptor::DestroyLayer:
    169             return asFP<HWC2_PFN_DESTROY_LAYER>(
    170                     displayHook<decltype(&Display::destroyLayer),
    171                     &Display::destroyLayer, hwc2_layer_t>);
    172         case FunctionDescriptor::GetActiveConfig:
    173             return asFP<HWC2_PFN_GET_ACTIVE_CONFIG>(
    174                     displayHook<decltype(&Display::getActiveConfig),
    175                     &Display::getActiveConfig, hwc2_config_t*>);
    176         case FunctionDescriptor::GetChangedCompositionTypes:
    177             return asFP<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
    178                     displayHook<decltype(&Display::getChangedCompositionTypes),
    179                     &Display::getChangedCompositionTypes, uint32_t*,
    180                     hwc2_layer_t*, int32_t*>);
    181         case FunctionDescriptor::GetColorModes:
    182             return asFP<HWC2_PFN_GET_COLOR_MODES>(
    183                     displayHook<decltype(&Display::getColorModes),
    184                     &Display::getColorModes, uint32_t*, int32_t*>);
    185         case FunctionDescriptor::GetDisplayAttribute:
    186             return asFP<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
    187                     getDisplayAttributeHook);
    188         case FunctionDescriptor::GetDisplayConfigs:
    189             return asFP<HWC2_PFN_GET_DISPLAY_CONFIGS>(
    190                     displayHook<decltype(&Display::getConfigs),
    191                     &Display::getConfigs, uint32_t*, hwc2_config_t*>);
    192         case FunctionDescriptor::GetDisplayName:
    193             return asFP<HWC2_PFN_GET_DISPLAY_NAME>(
    194                     displayHook<decltype(&Display::getName),
    195                     &Display::getName, uint32_t*, char*>);
    196         case FunctionDescriptor::GetDisplayRequests:
    197             return asFP<HWC2_PFN_GET_DISPLAY_REQUESTS>(
    198                     displayHook<decltype(&Display::getRequests),
    199                     &Display::getRequests, int32_t*, uint32_t*, hwc2_layer_t*,
    200                     int32_t*>);
    201         case FunctionDescriptor::GetDisplayType:
    202             return asFP<HWC2_PFN_GET_DISPLAY_TYPE>(
    203                     displayHook<decltype(&Display::getType),
    204                     &Display::getType, int32_t*>);
    205         case FunctionDescriptor::GetDozeSupport:
    206             return asFP<HWC2_PFN_GET_DOZE_SUPPORT>(
    207                     displayHook<decltype(&Display::getDozeSupport),
    208                     &Display::getDozeSupport, int32_t*>);
    209         case FunctionDescriptor::GetHdrCapabilities:
    210             return asFP<HWC2_PFN_GET_HDR_CAPABILITIES>(
    211                     displayHook<decltype(&Display::getHdrCapabilities),
    212                     &Display::getHdrCapabilities, uint32_t*, int32_t*, float*,
    213                     float*, float*>);
    214         case FunctionDescriptor::GetReleaseFences:
    215             return asFP<HWC2_PFN_GET_RELEASE_FENCES>(
    216                     displayHook<decltype(&Display::getReleaseFences),
    217                     &Display::getReleaseFences, uint32_t*, hwc2_layer_t*,
    218                     int32_t*>);
    219         case FunctionDescriptor::PresentDisplay:
    220             return asFP<HWC2_PFN_PRESENT_DISPLAY>(
    221                     displayHook<decltype(&Display::present),
    222                     &Display::present, int32_t*>);
    223         case FunctionDescriptor::SetActiveConfig:
    224             return asFP<HWC2_PFN_SET_ACTIVE_CONFIG>(
    225                     displayHook<decltype(&Display::setActiveConfig),
    226                     &Display::setActiveConfig, hwc2_config_t>);
    227         case FunctionDescriptor::SetClientTarget:
    228             return asFP<HWC2_PFN_SET_CLIENT_TARGET>(
    229                     displayHook<decltype(&Display::setClientTarget),
    230                     &Display::setClientTarget, buffer_handle_t, int32_t,
    231                     int32_t, hwc_region_t>);
    232         case FunctionDescriptor::SetColorMode:
    233             return asFP<HWC2_PFN_SET_COLOR_MODE>(setColorModeHook);
    234         case FunctionDescriptor::SetColorTransform:
    235             return asFP<HWC2_PFN_SET_COLOR_TRANSFORM>(setColorTransformHook);
    236         case FunctionDescriptor::SetOutputBuffer:
    237             return asFP<HWC2_PFN_SET_OUTPUT_BUFFER>(
    238                     displayHook<decltype(&Display::setOutputBuffer),
    239                     &Display::setOutputBuffer, buffer_handle_t, int32_t>);
    240         case FunctionDescriptor::SetPowerMode:
    241             return asFP<HWC2_PFN_SET_POWER_MODE>(setPowerModeHook);
    242         case FunctionDescriptor::SetVsyncEnabled:
    243             return asFP<HWC2_PFN_SET_VSYNC_ENABLED>(setVsyncEnabledHook);
    244         case FunctionDescriptor::ValidateDisplay:
    245             return asFP<HWC2_PFN_VALIDATE_DISPLAY>(
    246                     displayHook<decltype(&Display::validate),
    247                     &Display::validate, uint32_t*, uint32_t*>);
    248         case FunctionDescriptor::GetClientTargetSupport:
    249             return asFP<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
    250                     displayHook<decltype(&Display::getClientTargetSupport),
    251                     &Display::getClientTargetSupport, uint32_t, uint32_t,
    252                                                       int32_t, int32_t>);
    253 
    254         // Layer functions
    255         case FunctionDescriptor::SetCursorPosition:
    256             return asFP<HWC2_PFN_SET_CURSOR_POSITION>(
    257                     layerHook<decltype(&Layer::setCursorPosition),
    258                     &Layer::setCursorPosition, int32_t, int32_t>);
    259         case FunctionDescriptor::SetLayerBuffer:
    260             return asFP<HWC2_PFN_SET_LAYER_BUFFER>(
    261                     layerHook<decltype(&Layer::setBuffer), &Layer::setBuffer,
    262                     buffer_handle_t, int32_t>);
    263         case FunctionDescriptor::SetLayerSurfaceDamage:
    264             return asFP<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
    265                     layerHook<decltype(&Layer::setSurfaceDamage),
    266                     &Layer::setSurfaceDamage, hwc_region_t>);
    267 
    268         // Layer state functions
    269         case FunctionDescriptor::SetLayerBlendMode:
    270             return asFP<HWC2_PFN_SET_LAYER_BLEND_MODE>(
    271                     setLayerBlendModeHook);
    272         case FunctionDescriptor::SetLayerColor:
    273             return asFP<HWC2_PFN_SET_LAYER_COLOR>(
    274                     layerHook<decltype(&Layer::setColor), &Layer::setColor,
    275                     hwc_color_t>);
    276         case FunctionDescriptor::SetLayerCompositionType:
    277             return asFP<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
    278                     setLayerCompositionTypeHook);
    279         case FunctionDescriptor::SetLayerDataspace:
    280             return asFP<HWC2_PFN_SET_LAYER_DATASPACE>(setLayerDataspaceHook);
    281         case FunctionDescriptor::SetLayerDisplayFrame:
    282             return asFP<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
    283                     layerHook<decltype(&Layer::setDisplayFrame),
    284                     &Layer::setDisplayFrame, hwc_rect_t>);
    285         case FunctionDescriptor::SetLayerPlaneAlpha:
    286             return asFP<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
    287                     layerHook<decltype(&Layer::setPlaneAlpha),
    288                     &Layer::setPlaneAlpha, float>);
    289         case FunctionDescriptor::SetLayerSidebandStream:
    290             return asFP<HWC2_PFN_SET_LAYER_SIDEBAND_STREAM>(
    291                     layerHook<decltype(&Layer::setSidebandStream),
    292                     &Layer::setSidebandStream, const native_handle_t*>);
    293         case FunctionDescriptor::SetLayerSourceCrop:
    294             return asFP<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
    295                     layerHook<decltype(&Layer::setSourceCrop),
    296                     &Layer::setSourceCrop, hwc_frect_t>);
    297         case FunctionDescriptor::SetLayerTransform:
    298             return asFP<HWC2_PFN_SET_LAYER_TRANSFORM>(setLayerTransformHook);
    299         case FunctionDescriptor::SetLayerVisibleRegion:
    300             return asFP<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
    301                     layerHook<decltype(&Layer::setVisibleRegion),
    302                     &Layer::setVisibleRegion, hwc_region_t>);
    303         case FunctionDescriptor::SetLayerZOrder:
    304             return asFP<HWC2_PFN_SET_LAYER_Z_ORDER>(setLayerZOrderHook);
    305 
    306         default:
    307             ALOGE("doGetFunction: Unknown function descriptor: %d (%s)",
    308                     static_cast<int32_t>(descriptor),
    309                     to_string(descriptor).c_str());
    310             return nullptr;
    311     }
    312 }
    313 
    314 // Device functions
    315 
    316 Error HWC2On1Adapter::createVirtualDisplay(uint32_t width,
    317         uint32_t height, hwc2_display_t* outDisplay) {
    318     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
    319 
    320     if (mHwc1VirtualDisplay) {
    321         // We have already allocated our only HWC1 virtual display
    322         ALOGE("createVirtualDisplay: HWC1 virtual display already allocated");
    323         return Error::NoResources;
    324     }
    325 
    326     mHwc1VirtualDisplay = std::make_shared<HWC2On1Adapter::Display>(*this,
    327             HWC2::DisplayType::Virtual);
    328     mHwc1VirtualDisplay->populateConfigs(width, height);
    329     const auto displayId = mHwc1VirtualDisplay->getId();
    330     mHwc1DisplayMap[HWC_DISPLAY_VIRTUAL] = displayId;
    331     mHwc1VirtualDisplay->setHwc1Id(HWC_DISPLAY_VIRTUAL);
    332     mDisplays.emplace(displayId, mHwc1VirtualDisplay);
    333     *outDisplay = displayId;
    334 
    335     return Error::None;
    336 }
    337 
    338 Error HWC2On1Adapter::destroyVirtualDisplay(hwc2_display_t displayId) {
    339     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
    340 
    341     if (!mHwc1VirtualDisplay || (mHwc1VirtualDisplay->getId() != displayId)) {
    342         return Error::BadDisplay;
    343     }
    344 
    345     mHwc1VirtualDisplay.reset();
    346     mHwc1DisplayMap.erase(HWC_DISPLAY_VIRTUAL);
    347     mDisplays.erase(displayId);
    348 
    349     return Error::None;
    350 }
    351 
    352 void HWC2On1Adapter::dump(uint32_t* outSize, char* outBuffer) {
    353     if (outBuffer != nullptr) {
    354         auto copiedBytes = mDumpString.copy(outBuffer, *outSize);
    355         *outSize = static_cast<uint32_t>(copiedBytes);
    356         return;
    357     }
    358 
    359     std::stringstream output;
    360 
    361     output << "-- HWC2On1Adapter --\n";
    362 
    363     output << "Adapting to a HWC 1." << static_cast<int>(mHwc1MinorVersion) <<
    364             " device\n";
    365 
    366     // Attempt to acquire the lock for 1 second, but proceed without the lock
    367     // after that, so we can still get some information if we're deadlocked
    368     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex,
    369             std::defer_lock);
    370     lock.try_lock_for(1s);
    371 
    372     if (mCapabilities.empty()) {
    373         output << "Capabilities: None\n";
    374     } else {
    375         output << "Capabilities:\n";
    376         for (auto capability : mCapabilities) {
    377             output << "  " << to_string(capability) << '\n';
    378         }
    379     }
    380 
    381     output << "Displays:\n";
    382     for (const auto& element : mDisplays) {
    383         const auto& display = element.second;
    384         output << display->dump();
    385     }
    386     output << '\n';
    387 
    388     // Release the lock before calling into HWC1, and since we no longer require
    389     // mutual exclusion to access mCapabilities or mDisplays
    390     lock.unlock();
    391 
    392     if (mHwc1Device->dump) {
    393         output << "HWC1 dump:\n";
    394         std::vector<char> hwc1Dump(4096);
    395         // Call with size - 1 to preserve a null character at the end
    396         mHwc1Device->dump(mHwc1Device, hwc1Dump.data(),
    397                 static_cast<int>(hwc1Dump.size() - 1));
    398         output << hwc1Dump.data();
    399     }
    400 
    401     mDumpString = output.str();
    402     *outSize = static_cast<uint32_t>(mDumpString.size());
    403 }
    404 
    405 uint32_t HWC2On1Adapter::getMaxVirtualDisplayCount() {
    406     return mHwc1SupportsVirtualDisplays ? 1 : 0;
    407 }
    408 
    409 static bool isValid(Callback descriptor) {
    410     switch (descriptor) {
    411         case Callback::Hotplug: // Fall-through
    412         case Callback::Refresh: // Fall-through
    413         case Callback::Vsync: return true;
    414         default: return false;
    415     }
    416 }
    417 
    418 Error HWC2On1Adapter::registerCallback(Callback descriptor,
    419         hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer) {
    420     if (!isValid(descriptor)) {
    421         return Error::BadParameter;
    422     }
    423 
    424     ALOGV("registerCallback(%s, %p, %p)", to_string(descriptor).c_str(),
    425             callbackData, pointer);
    426 
    427     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
    428 
    429     if (pointer != nullptr) {
    430         mCallbacks[descriptor] = {callbackData, pointer};
    431     } else {
    432         ALOGI("unregisterCallback(%s)", to_string(descriptor).c_str());
    433         mCallbacks.erase(descriptor);
    434         return Error::None;
    435     }
    436 
    437     bool hasPendingInvalidate = false;
    438     std::vector<hwc2_display_t> displayIds;
    439     std::vector<std::pair<hwc2_display_t, int64_t>> pendingVsyncs;
    440     std::vector<std::pair<hwc2_display_t, int>> pendingHotplugs;
    441 
    442     if (descriptor == Callback::Refresh) {
    443         hasPendingInvalidate = mHasPendingInvalidate;
    444         if (hasPendingInvalidate) {
    445             for (auto& displayPair : mDisplays) {
    446                 displayIds.emplace_back(displayPair.first);
    447             }
    448         }
    449         mHasPendingInvalidate = false;
    450     } else if (descriptor == Callback::Vsync) {
    451         for (auto pending : mPendingVsyncs) {
    452             auto hwc1DisplayId = pending.first;
    453             if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
    454                 ALOGE("hwc1Vsync: Couldn't find display for HWC1 id %d",
    455                         hwc1DisplayId);
    456                 continue;
    457             }
    458             auto displayId = mHwc1DisplayMap[hwc1DisplayId];
    459             auto timestamp = pending.second;
    460             pendingVsyncs.emplace_back(displayId, timestamp);
    461         }
    462         mPendingVsyncs.clear();
    463     } else if (descriptor == Callback::Hotplug) {
    464         // Hotplug the primary display
    465         pendingHotplugs.emplace_back(mHwc1DisplayMap[HWC_DISPLAY_PRIMARY],
    466                 static_cast<int32_t>(Connection::Connected));
    467 
    468         for (auto pending : mPendingHotplugs) {
    469             auto hwc1DisplayId = pending.first;
    470             if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
    471                 ALOGE("hwc1Hotplug: Couldn't find display for HWC1 id %d",
    472                         hwc1DisplayId);
    473                 continue;
    474             }
    475             auto displayId = mHwc1DisplayMap[hwc1DisplayId];
    476             auto connected = pending.second;
    477             pendingHotplugs.emplace_back(displayId, connected);
    478         }
    479     }
    480 
    481     // Call pending callbacks without the state lock held
    482     lock.unlock();
    483 
    484     if (hasPendingInvalidate) {
    485         auto refresh = reinterpret_cast<HWC2_PFN_REFRESH>(pointer);
    486         for (auto displayId : displayIds) {
    487             refresh(callbackData, displayId);
    488         }
    489     }
    490     if (!pendingVsyncs.empty()) {
    491         auto vsync = reinterpret_cast<HWC2_PFN_VSYNC>(pointer);
    492         for (auto& pendingVsync : pendingVsyncs) {
    493             vsync(callbackData, pendingVsync.first, pendingVsync.second);
    494         }
    495     }
    496     if (!pendingHotplugs.empty()) {
    497         auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
    498         for (auto& pendingHotplug : pendingHotplugs) {
    499             hotplug(callbackData, pendingHotplug.first, pendingHotplug.second);
    500         }
    501     }
    502     return Error::None;
    503 }
    504 
    505 // Display functions
    506 
    507 std::atomic<hwc2_display_t> HWC2On1Adapter::Display::sNextId(1);
    508 
    509 HWC2On1Adapter::Display::Display(HWC2On1Adapter& device, HWC2::DisplayType type)
    510   : mId(sNextId++),
    511     mDevice(device),
    512     mStateMutex(),
    513     mHwc1RequestedContents(nullptr),
    514     mRetireFence(),
    515     mChanges(),
    516     mHwc1Id(-1),
    517     mConfigs(),
    518     mActiveConfig(nullptr),
    519     mActiveColorMode(static_cast<android_color_mode_t>(-1)),
    520     mName(),
    521     mType(type),
    522     mPowerMode(PowerMode::Off),
    523     mVsyncEnabled(Vsync::Invalid),
    524     mClientTarget(),
    525     mOutputBuffer(),
    526     mHasColorTransform(false),
    527     mLayers(),
    528     mHwc1LayerMap(),
    529     mNumAvailableRects(0),
    530     mNextAvailableRect(nullptr),
    531     mGeometryChanged(false)
    532     {}
    533 
    534 Error HWC2On1Adapter::Display::acceptChanges() {
    535     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    536 
    537     if (!mChanges) {
    538         ALOGV("[%" PRIu64 "] acceptChanges failed, not validated", mId);
    539         return Error::NotValidated;
    540     }
    541 
    542     ALOGV("[%" PRIu64 "] acceptChanges", mId);
    543 
    544     for (auto& change : mChanges->getTypeChanges()) {
    545         auto layerId = change.first;
    546         auto type = change.second;
    547         if (mDevice.mLayers.count(layerId) == 0) {
    548             // This should never happen but somehow does.
    549             ALOGW("Cannot accept change for unknown layer (%" PRIu64 ")",
    550                   layerId);
    551             continue;
    552         }
    553         auto layer = mDevice.mLayers[layerId];
    554         layer->setCompositionType(type);
    555     }
    556 
    557     mChanges->clearTypeChanges();
    558 
    559     return Error::None;
    560 }
    561 
    562 Error HWC2On1Adapter::Display::createLayer(hwc2_layer_t* outLayerId) {
    563     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    564 
    565     auto layer = *mLayers.emplace(std::make_shared<Layer>(*this));
    566     mDevice.mLayers.emplace(std::make_pair(layer->getId(), layer));
    567     *outLayerId = layer->getId();
    568     ALOGV("[%" PRIu64 "] created layer %" PRIu64, mId, *outLayerId);
    569     markGeometryChanged();
    570     return Error::None;
    571 }
    572 
    573 Error HWC2On1Adapter::Display::destroyLayer(hwc2_layer_t layerId) {
    574     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    575 
    576     const auto mapLayer = mDevice.mLayers.find(layerId);
    577     if (mapLayer == mDevice.mLayers.end()) {
    578         ALOGV("[%" PRIu64 "] destroyLayer(%" PRIu64 ") failed: no such layer",
    579                 mId, layerId);
    580         return Error::BadLayer;
    581     }
    582     const auto layer = mapLayer->second;
    583     mDevice.mLayers.erase(mapLayer);
    584     const auto zRange = mLayers.equal_range(layer);
    585     for (auto current = zRange.first; current != zRange.second; ++current) {
    586         if (**current == *layer) {
    587             current = mLayers.erase(current);
    588             break;
    589         }
    590     }
    591     ALOGV("[%" PRIu64 "] destroyed layer %" PRIu64, mId, layerId);
    592     markGeometryChanged();
    593     return Error::None;
    594 }
    595 
    596 Error HWC2On1Adapter::Display::getActiveConfig(hwc2_config_t* outConfig) {
    597     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    598 
    599     if (!mActiveConfig) {
    600         ALOGV("[%" PRIu64 "] getActiveConfig --> %s", mId,
    601                 to_string(Error::BadConfig).c_str());
    602         return Error::BadConfig;
    603     }
    604     auto configId = mActiveConfig->getId();
    605     ALOGV("[%" PRIu64 "] getActiveConfig --> %u", mId, configId);
    606     *outConfig = configId;
    607     return Error::None;
    608 }
    609 
    610 Error HWC2On1Adapter::Display::getAttribute(hwc2_config_t configId,
    611         Attribute attribute, int32_t* outValue) {
    612     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    613 
    614     if (configId > mConfigs.size() || !mConfigs[configId]->isOnDisplay(*this)) {
    615         ALOGV("[%" PRIu64 "] getAttribute failed: bad config (%u)", mId,
    616                 configId);
    617         return Error::BadConfig;
    618     }
    619     *outValue = mConfigs[configId]->getAttribute(attribute);
    620     ALOGV("[%" PRIu64 "] getAttribute(%u, %s) --> %d", mId, configId,
    621             to_string(attribute).c_str(), *outValue);
    622     return Error::None;
    623 }
    624 
    625 Error HWC2On1Adapter::Display::getChangedCompositionTypes(
    626         uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outTypes) {
    627     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    628 
    629     if (!mChanges) {
    630         ALOGE("[%" PRIu64 "] getChangedCompositionTypes failed: not validated",
    631                 mId);
    632         return Error::NotValidated;
    633     }
    634 
    635     if ((outLayers == nullptr) || (outTypes == nullptr)) {
    636         *outNumElements = mChanges->getTypeChanges().size();
    637         return Error::None;
    638     }
    639 
    640     uint32_t numWritten = 0;
    641     for (const auto& element : mChanges->getTypeChanges()) {
    642         if (numWritten == *outNumElements) {
    643             break;
    644         }
    645         auto layerId = element.first;
    646         auto intType = static_cast<int32_t>(element.second);
    647         ALOGV("Adding %" PRIu64 " %s", layerId,
    648                 to_string(element.second).c_str());
    649         outLayers[numWritten] = layerId;
    650         outTypes[numWritten] = intType;
    651         ++numWritten;
    652     }
    653     *outNumElements = numWritten;
    654 
    655     return Error::None;
    656 }
    657 
    658 Error HWC2On1Adapter::Display::getColorModes(uint32_t* outNumModes,
    659         int32_t* outModes) {
    660     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    661 
    662     if (!outModes) {
    663         *outNumModes = mColorModes.size();
    664         return Error::None;
    665     }
    666     uint32_t numModes = std::min(*outNumModes,
    667             static_cast<uint32_t>(mColorModes.size()));
    668     std::copy_n(mColorModes.cbegin(), numModes, outModes);
    669     *outNumModes = numModes;
    670     return Error::None;
    671 }
    672 
    673 Error HWC2On1Adapter::Display::getConfigs(uint32_t* outNumConfigs,
    674         hwc2_config_t* outConfigs) {
    675     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    676 
    677     if (!outConfigs) {
    678         *outNumConfigs = mConfigs.size();
    679         return Error::None;
    680     }
    681     uint32_t numWritten = 0;
    682     for (const auto& config : mConfigs) {
    683         if (numWritten == *outNumConfigs) {
    684             break;
    685         }
    686         outConfigs[numWritten] = config->getId();
    687         ++numWritten;
    688     }
    689     *outNumConfigs = numWritten;
    690     return Error::None;
    691 }
    692 
    693 Error HWC2On1Adapter::Display::getDozeSupport(int32_t* outSupport) {
    694     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    695 
    696     if (mDevice.mHwc1MinorVersion < 4 || mHwc1Id != 0) {
    697         *outSupport = 0;
    698     } else {
    699         *outSupport = 1;
    700     }
    701     return Error::None;
    702 }
    703 
    704 Error HWC2On1Adapter::Display::getHdrCapabilities(uint32_t* outNumTypes,
    705         int32_t* /*outTypes*/, float* /*outMaxLuminance*/,
    706         float* /*outMaxAverageLuminance*/, float* /*outMinLuminance*/) {
    707     // This isn't supported on HWC1, so per the HWC2 header, return numTypes = 0
    708     *outNumTypes = 0;
    709     return Error::None;
    710 }
    711 
    712 Error HWC2On1Adapter::Display::getName(uint32_t* outSize, char* outName) {
    713     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    714 
    715     if (!outName) {
    716         *outSize = mName.size();
    717         return Error::None;
    718     }
    719     auto numCopied = mName.copy(outName, *outSize);
    720     *outSize = numCopied;
    721     return Error::None;
    722 }
    723 
    724 Error HWC2On1Adapter::Display::getReleaseFences(uint32_t* outNumElements,
    725         hwc2_layer_t* outLayers, int32_t* outFences) {
    726     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    727 
    728     uint32_t numWritten = 0;
    729     bool outputsNonNull = (outLayers != nullptr) && (outFences != nullptr);
    730     for (const auto& layer : mLayers) {
    731         if (outputsNonNull && (numWritten == *outNumElements)) {
    732             break;
    733         }
    734 
    735         auto releaseFence = layer->getReleaseFence();
    736         if (releaseFence != MiniFence::NO_FENCE) {
    737             if (outputsNonNull) {
    738                 outLayers[numWritten] = layer->getId();
    739                 outFences[numWritten] = releaseFence->dup();
    740             }
    741             ++numWritten;
    742         }
    743     }
    744     *outNumElements = numWritten;
    745 
    746     return Error::None;
    747 }
    748 
    749 Error HWC2On1Adapter::Display::getRequests(int32_t* outDisplayRequests,
    750         uint32_t* outNumElements, hwc2_layer_t* outLayers,
    751         int32_t* outLayerRequests) {
    752     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    753 
    754     if (!mChanges) {
    755         return Error::NotValidated;
    756     }
    757 
    758     if (outLayers == nullptr || outLayerRequests == nullptr) {
    759         *outNumElements = mChanges->getNumLayerRequests();
    760         return Error::None;
    761     }
    762 
    763     // Display requests (HWC2::DisplayRequest) are not supported by hwc1:
    764     // A hwc1 has always zero requests for the client.
    765     *outDisplayRequests = 0;
    766 
    767     uint32_t numWritten = 0;
    768     for (const auto& request : mChanges->getLayerRequests()) {
    769         if (numWritten == *outNumElements) {
    770             break;
    771         }
    772         outLayers[numWritten] = request.first;
    773         outLayerRequests[numWritten] = static_cast<int32_t>(request.second);
    774         ++numWritten;
    775     }
    776 
    777     return Error::None;
    778 }
    779 
    780 Error HWC2On1Adapter::Display::getType(int32_t* outType) {
    781     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    782 
    783     *outType = static_cast<int32_t>(mType);
    784     return Error::None;
    785 }
    786 
    787 Error HWC2On1Adapter::Display::present(int32_t* outRetireFence) {
    788     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    789 
    790     if (mChanges) {
    791         Error error = mDevice.setAllDisplays();
    792         if (error != Error::None) {
    793             ALOGE("[%" PRIu64 "] present: setAllDisplaysFailed (%s)", mId,
    794                     to_string(error).c_str());
    795             return error;
    796         }
    797     }
    798 
    799     *outRetireFence = mRetireFence.get()->dup();
    800     ALOGV("[%" PRIu64 "] present returning retire fence %d", mId,
    801             *outRetireFence);
    802 
    803     return Error::None;
    804 }
    805 
    806 Error HWC2On1Adapter::Display::setActiveConfig(hwc2_config_t configId) {
    807     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    808 
    809     auto config = getConfig(configId);
    810     if (!config) {
    811         return Error::BadConfig;
    812     }
    813     if (config == mActiveConfig) {
    814         return Error::None;
    815     }
    816 
    817     if (mDevice.mHwc1MinorVersion >= 4) {
    818         uint32_t hwc1Id = 0;
    819         auto error = config->getHwc1IdForColorMode(mActiveColorMode, &hwc1Id);
    820         if (error != Error::None) {
    821             return error;
    822         }
    823 
    824         int intError = mDevice.mHwc1Device->setActiveConfig(mDevice.mHwc1Device,
    825                 mHwc1Id, static_cast<int>(hwc1Id));
    826         if (intError != 0) {
    827             ALOGE("setActiveConfig: Failed to set active config on HWC1 (%d)",
    828                 intError);
    829             return Error::BadConfig;
    830         }
    831         mActiveConfig = config;
    832     }
    833 
    834     return Error::None;
    835 }
    836 
    837 Error HWC2On1Adapter::Display::setClientTarget(buffer_handle_t target,
    838         int32_t acquireFence, int32_t /*dataspace*/, hwc_region_t /*damage*/) {
    839     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    840 
    841     ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence);
    842     mClientTarget.setBuffer(target);
    843     mClientTarget.setFence(acquireFence);
    844     // dataspace and damage can't be used by HWC1, so ignore them
    845     return Error::None;
    846 }
    847 
    848 Error HWC2On1Adapter::Display::setColorMode(android_color_mode_t mode) {
    849     std::unique_lock<std::recursive_mutex> lock (mStateMutex);
    850 
    851     ALOGV("[%" PRIu64 "] setColorMode(%d)", mId, mode);
    852 
    853     if (mode == mActiveColorMode) {
    854         return Error::None;
    855     }
    856     if (mColorModes.count(mode) == 0) {
    857         ALOGE("[%" PRIu64 "] Mode %d not found in mColorModes", mId, mode);
    858         return Error::Unsupported;
    859     }
    860 
    861     if (mDevice.mHwc1MinorVersion >= 4) {
    862         uint32_t hwc1Config = 0;
    863         auto error = mActiveConfig->getHwc1IdForColorMode(mode, &hwc1Config);
    864         if (error != Error::None) {
    865             return error;
    866         }
    867 
    868         ALOGV("[%" PRIu64 "] Setting HWC1 config %u", mId, hwc1Config);
    869         int intError =
    870             mDevice.mHwc1Device->setActiveConfig(mDevice.mHwc1Device, mHwc1Id, hwc1Config);
    871         if (intError != 0) {
    872             ALOGE("[%" PRIu64 "] Failed to set HWC1 config (%d)", mId, intError);
    873             return Error::Unsupported;
    874         }
    875     }
    876 
    877     mActiveColorMode = mode;
    878     return Error::None;
    879 }
    880 
    881 Error HWC2On1Adapter::Display::setColorTransform(android_color_transform_t hint) {
    882     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    883 
    884     ALOGV("%" PRIu64 "] setColorTransform(%d)", mId,
    885             static_cast<int32_t>(hint));
    886     mHasColorTransform = (hint != HAL_COLOR_TRANSFORM_IDENTITY);
    887     return Error::None;
    888 }
    889 
    890 Error HWC2On1Adapter::Display::setOutputBuffer(buffer_handle_t buffer,
    891         int32_t releaseFence) {
    892     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    893 
    894     ALOGV("[%" PRIu64 "] setOutputBuffer(%p, %d)", mId, buffer, releaseFence);
    895     mOutputBuffer.setBuffer(buffer);
    896     mOutputBuffer.setFence(releaseFence);
    897     return Error::None;
    898 }
    899 
    900 static bool isValid(PowerMode mode) {
    901     switch (mode) {
    902         case PowerMode::Off: // Fall-through
    903         case PowerMode::DozeSuspend: // Fall-through
    904         case PowerMode::Doze: // Fall-through
    905         case PowerMode::On: return true;
    906     }
    907 }
    908 
    909 static int getHwc1PowerMode(PowerMode mode) {
    910     switch (mode) {
    911         case PowerMode::Off: return HWC_POWER_MODE_OFF;
    912         case PowerMode::DozeSuspend: return HWC_POWER_MODE_DOZE_SUSPEND;
    913         case PowerMode::Doze: return HWC_POWER_MODE_DOZE;
    914         case PowerMode::On: return HWC_POWER_MODE_NORMAL;
    915     }
    916 }
    917 
    918 Error HWC2On1Adapter::Display::setPowerMode(PowerMode mode) {
    919     if (!isValid(mode)) {
    920         return Error::BadParameter;
    921     }
    922     if (mode == mPowerMode) {
    923         return Error::None;
    924     }
    925 
    926     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    927 
    928     int error = 0;
    929     if (mDevice.mHwc1MinorVersion < 4) {
    930         error = mDevice.mHwc1Device->blank(mDevice.mHwc1Device, mHwc1Id,
    931                 mode == PowerMode::Off);
    932     } else {
    933         error = mDevice.mHwc1Device->setPowerMode(mDevice.mHwc1Device,
    934                 mHwc1Id, getHwc1PowerMode(mode));
    935     }
    936     ALOGE_IF(error != 0, "setPowerMode: Failed to set power mode on HWC1 (%d)",
    937             error);
    938 
    939     ALOGV("[%" PRIu64 "] setPowerMode(%s)", mId, to_string(mode).c_str());
    940     mPowerMode = mode;
    941     return Error::None;
    942 }
    943 
    944 static bool isValid(Vsync enable) {
    945     switch (enable) {
    946         case Vsync::Enable: // Fall-through
    947         case Vsync::Disable: return true;
    948         case Vsync::Invalid: return false;
    949     }
    950 }
    951 
    952 Error HWC2On1Adapter::Display::setVsyncEnabled(Vsync enable) {
    953     if (!isValid(enable)) {
    954         return Error::BadParameter;
    955     }
    956     if (enable == mVsyncEnabled) {
    957         return Error::None;
    958     }
    959 
    960     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    961 
    962     int error = mDevice.mHwc1Device->eventControl(mDevice.mHwc1Device,
    963             mHwc1Id, HWC_EVENT_VSYNC, enable == Vsync::Enable);
    964     ALOGE_IF(error != 0, "setVsyncEnabled: Failed to set vsync on HWC1 (%d)",
    965             error);
    966 
    967     mVsyncEnabled = enable;
    968     return Error::None;
    969 }
    970 
    971 Error HWC2On1Adapter::Display::validate(uint32_t* outNumTypes,
    972         uint32_t* outNumRequests) {
    973     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    974 
    975     if (!mChanges) {
    976         if (!mDevice.prepareAllDisplays()) {
    977             return Error::BadDisplay;
    978         }
    979     } else {
    980         ALOGE("Validate was called more than once!");
    981     }
    982 
    983     *outNumTypes = mChanges->getNumTypes();
    984     *outNumRequests = mChanges->getNumLayerRequests();
    985     ALOGV("[%" PRIu64 "] validate --> %u types, %u requests", mId, *outNumTypes,
    986             *outNumRequests);
    987     for (auto request : mChanges->getTypeChanges()) {
    988         ALOGV("Layer %" PRIu64 " --> %s", request.first,
    989                 to_string(request.second).c_str());
    990     }
    991     return *outNumTypes > 0 ? Error::HasChanges : Error::None;
    992 }
    993 
    994 Error HWC2On1Adapter::Display::updateLayerZ(hwc2_layer_t layerId, uint32_t z) {
    995     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
    996 
    997     const auto mapLayer = mDevice.mLayers.find(layerId);
    998     if (mapLayer == mDevice.mLayers.end()) {
    999         ALOGE("[%" PRIu64 "] updateLayerZ failed to find layer", mId);
   1000         return Error::BadLayer;
   1001     }
   1002 
   1003     const auto layer = mapLayer->second;
   1004     const auto zRange = mLayers.equal_range(layer);
   1005     bool layerOnDisplay = false;
   1006     for (auto current = zRange.first; current != zRange.second; ++current) {
   1007         if (**current == *layer) {
   1008             if ((*current)->getZ() == z) {
   1009                 // Don't change anything if the Z hasn't changed
   1010                 return Error::None;
   1011             }
   1012             current = mLayers.erase(current);
   1013             layerOnDisplay = true;
   1014             break;
   1015         }
   1016     }
   1017 
   1018     if (!layerOnDisplay) {
   1019         ALOGE("[%" PRIu64 "] updateLayerZ failed to find layer on display",
   1020                 mId);
   1021         return Error::BadLayer;
   1022     }
   1023 
   1024     layer->setZ(z);
   1025     mLayers.emplace(std::move(layer));
   1026     markGeometryChanged();
   1027 
   1028     return Error::None;
   1029 }
   1030 
   1031 Error HWC2On1Adapter::Display::getClientTargetSupport(uint32_t width, uint32_t height,
   1032                                       int32_t format, int32_t dataspace){
   1033     if (mActiveConfig == nullptr) {
   1034         return Error::Unsupported;
   1035     }
   1036 
   1037     if (width == mActiveConfig->getAttribute(Attribute::Width) &&
   1038             height == mActiveConfig->getAttribute(Attribute::Height) &&
   1039             format == HAL_PIXEL_FORMAT_RGBA_8888 &&
   1040             dataspace == HAL_DATASPACE_UNKNOWN) {
   1041         return Error::None;
   1042     }
   1043 
   1044     return Error::Unsupported;
   1045 }
   1046 
   1047 static constexpr uint32_t ATTRIBUTES_WITH_COLOR[] = {
   1048     HWC_DISPLAY_VSYNC_PERIOD,
   1049     HWC_DISPLAY_WIDTH,
   1050     HWC_DISPLAY_HEIGHT,
   1051     HWC_DISPLAY_DPI_X,
   1052     HWC_DISPLAY_DPI_Y,
   1053     HWC_DISPLAY_COLOR_TRANSFORM,
   1054     HWC_DISPLAY_NO_ATTRIBUTE,
   1055 };
   1056 
   1057 static constexpr uint32_t ATTRIBUTES_WITHOUT_COLOR[] = {
   1058     HWC_DISPLAY_VSYNC_PERIOD,
   1059     HWC_DISPLAY_WIDTH,
   1060     HWC_DISPLAY_HEIGHT,
   1061     HWC_DISPLAY_DPI_X,
   1062     HWC_DISPLAY_DPI_Y,
   1063     HWC_DISPLAY_NO_ATTRIBUTE,
   1064 };
   1065 
   1066 static constexpr size_t NUM_ATTRIBUTES_WITH_COLOR =
   1067         sizeof(ATTRIBUTES_WITH_COLOR) / sizeof(uint32_t);
   1068 static_assert(sizeof(ATTRIBUTES_WITH_COLOR) > sizeof(ATTRIBUTES_WITHOUT_COLOR),
   1069         "Attribute tables have unexpected sizes");
   1070 
   1071 static constexpr uint32_t ATTRIBUTE_MAP_WITH_COLOR[] = {
   1072     6, // HWC_DISPLAY_NO_ATTRIBUTE = 0
   1073     0, // HWC_DISPLAY_VSYNC_PERIOD = 1,
   1074     1, // HWC_DISPLAY_WIDTH = 2,
   1075     2, // HWC_DISPLAY_HEIGHT = 3,
   1076     3, // HWC_DISPLAY_DPI_X = 4,
   1077     4, // HWC_DISPLAY_DPI_Y = 5,
   1078     5, // HWC_DISPLAY_COLOR_TRANSFORM = 6,
   1079 };
   1080 
   1081 static constexpr uint32_t ATTRIBUTE_MAP_WITHOUT_COLOR[] = {
   1082     5, // HWC_DISPLAY_NO_ATTRIBUTE = 0
   1083     0, // HWC_DISPLAY_VSYNC_PERIOD = 1,
   1084     1, // HWC_DISPLAY_WIDTH = 2,
   1085     2, // HWC_DISPLAY_HEIGHT = 3,
   1086     3, // HWC_DISPLAY_DPI_X = 4,
   1087     4, // HWC_DISPLAY_DPI_Y = 5,
   1088 };
   1089 
   1090 template <uint32_t attribute>
   1091 static constexpr bool attributesMatch()
   1092 {
   1093     bool match = (attribute ==
   1094             ATTRIBUTES_WITH_COLOR[ATTRIBUTE_MAP_WITH_COLOR[attribute]]);
   1095     if (attribute == HWC_DISPLAY_COLOR_TRANSFORM) {
   1096         return match;
   1097     }
   1098 
   1099     return match && (attribute ==
   1100             ATTRIBUTES_WITHOUT_COLOR[ATTRIBUTE_MAP_WITHOUT_COLOR[attribute]]);
   1101 }
   1102 static_assert(attributesMatch<HWC_DISPLAY_VSYNC_PERIOD>(),
   1103         "Tables out of sync");
   1104 static_assert(attributesMatch<HWC_DISPLAY_WIDTH>(), "Tables out of sync");
   1105 static_assert(attributesMatch<HWC_DISPLAY_HEIGHT>(), "Tables out of sync");
   1106 static_assert(attributesMatch<HWC_DISPLAY_DPI_X>(), "Tables out of sync");
   1107 static_assert(attributesMatch<HWC_DISPLAY_DPI_Y>(), "Tables out of sync");
   1108 static_assert(attributesMatch<HWC_DISPLAY_COLOR_TRANSFORM>(),
   1109         "Tables out of sync");
   1110 
   1111 void HWC2On1Adapter::Display::populateConfigs() {
   1112     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1113 
   1114     ALOGV("[%" PRIu64 "] populateConfigs", mId);
   1115 
   1116     if (mHwc1Id == -1) {
   1117         ALOGE("populateConfigs: HWC1 ID not set");
   1118         return;
   1119     }
   1120 
   1121     const size_t MAX_NUM_CONFIGS = 128;
   1122     uint32_t configs[MAX_NUM_CONFIGS] = {};
   1123     size_t numConfigs = MAX_NUM_CONFIGS;
   1124     mDevice.mHwc1Device->getDisplayConfigs(mDevice.mHwc1Device, mHwc1Id,
   1125             configs, &numConfigs);
   1126 
   1127     for (size_t c = 0; c < numConfigs; ++c) {
   1128         uint32_t hwc1ConfigId = configs[c];
   1129         auto newConfig = std::make_shared<Config>(*this);
   1130 
   1131         int32_t values[NUM_ATTRIBUTES_WITH_COLOR] = {};
   1132         bool hasColor = true;
   1133         auto result = mDevice.mHwc1Device->getDisplayAttributes(
   1134                 mDevice.mHwc1Device, mHwc1Id, hwc1ConfigId,
   1135                 ATTRIBUTES_WITH_COLOR, values);
   1136         if (result != 0) {
   1137             mDevice.mHwc1Device->getDisplayAttributes(mDevice.mHwc1Device,
   1138                     mHwc1Id, hwc1ConfigId, ATTRIBUTES_WITHOUT_COLOR, values);
   1139             hasColor = false;
   1140         }
   1141 
   1142         auto attributeMap = hasColor ?
   1143                 ATTRIBUTE_MAP_WITH_COLOR : ATTRIBUTE_MAP_WITHOUT_COLOR;
   1144 
   1145         newConfig->setAttribute(Attribute::VsyncPeriod,
   1146                 values[attributeMap[HWC_DISPLAY_VSYNC_PERIOD]]);
   1147         newConfig->setAttribute(Attribute::Width,
   1148                 values[attributeMap[HWC_DISPLAY_WIDTH]]);
   1149         newConfig->setAttribute(Attribute::Height,
   1150                 values[attributeMap[HWC_DISPLAY_HEIGHT]]);
   1151         newConfig->setAttribute(Attribute::DpiX,
   1152                 values[attributeMap[HWC_DISPLAY_DPI_X]]);
   1153         newConfig->setAttribute(Attribute::DpiY,
   1154                 values[attributeMap[HWC_DISPLAY_DPI_Y]]);
   1155         if (hasColor) {
   1156             // In HWC1, color modes are referred to as color transforms. To avoid confusion with
   1157             // the HWC2 concept of color transforms, we internally refer to them as color modes for
   1158             // both HWC1 and 2.
   1159             newConfig->setAttribute(ColorMode,
   1160                     values[attributeMap[HWC_DISPLAY_COLOR_TRANSFORM]]);
   1161         }
   1162 
   1163         // We can only do this after attempting to read the color mode
   1164         newConfig->setHwc1Id(hwc1ConfigId);
   1165 
   1166         for (auto& existingConfig : mConfigs) {
   1167             if (existingConfig->merge(*newConfig)) {
   1168                 ALOGV("Merged config %d with existing config %u: %s",
   1169                         hwc1ConfigId, existingConfig->getId(),
   1170                         existingConfig->toString().c_str());
   1171                 newConfig.reset();
   1172                 break;
   1173             }
   1174         }
   1175 
   1176         // If it wasn't merged with any existing config, add it to the end
   1177         if (newConfig) {
   1178             newConfig->setId(static_cast<hwc2_config_t>(mConfigs.size()));
   1179             ALOGV("Found new config %u: %s", newConfig->getId(),
   1180                     newConfig->toString().c_str());
   1181             mConfigs.emplace_back(std::move(newConfig));
   1182         }
   1183     }
   1184 
   1185     initializeActiveConfig();
   1186     populateColorModes();
   1187 }
   1188 
   1189 void HWC2On1Adapter::Display::populateConfigs(uint32_t width, uint32_t height) {
   1190     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1191 
   1192     mConfigs.emplace_back(std::make_shared<Config>(*this));
   1193     auto& config = mConfigs[0];
   1194 
   1195     config->setAttribute(Attribute::Width, static_cast<int32_t>(width));
   1196     config->setAttribute(Attribute::Height, static_cast<int32_t>(height));
   1197     config->setHwc1Id(0);
   1198     config->setId(0);
   1199     mActiveConfig = config;
   1200 }
   1201 
   1202 bool HWC2On1Adapter::Display::prepare() {
   1203     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1204 
   1205     // Only prepare display contents for displays HWC1 knows about
   1206     if (mHwc1Id == -1) {
   1207         return true;
   1208     }
   1209 
   1210     // It doesn't make sense to prepare a display for which there is no active
   1211     // config, so return early
   1212     if (!mActiveConfig) {
   1213         ALOGE("[%" PRIu64 "] Attempted to prepare, but no config active", mId);
   1214         return false;
   1215     }
   1216 
   1217     allocateRequestedContents();
   1218     assignHwc1LayerIds();
   1219 
   1220     mHwc1RequestedContents->retireFenceFd = -1;
   1221     mHwc1RequestedContents->flags = 0;
   1222     if (mGeometryChanged) {
   1223         mHwc1RequestedContents->flags |= HWC_GEOMETRY_CHANGED;
   1224     }
   1225     mHwc1RequestedContents->outbuf = mOutputBuffer.getBuffer();
   1226     mHwc1RequestedContents->outbufAcquireFenceFd = mOutputBuffer.getFence();
   1227 
   1228     // +1 is for framebuffer target layer.
   1229     mHwc1RequestedContents->numHwLayers = mLayers.size() + 1;
   1230     for (auto& layer : mLayers) {
   1231         auto& hwc1Layer = mHwc1RequestedContents->hwLayers[layer->getHwc1Id()];
   1232         hwc1Layer.releaseFenceFd = -1;
   1233         hwc1Layer.acquireFenceFd = -1;
   1234         ALOGV("Applying states for layer %" PRIu64 " ", layer->getId());
   1235         layer->applyState(hwc1Layer);
   1236     }
   1237 
   1238     prepareFramebufferTarget();
   1239 
   1240     resetGeometryMarker();
   1241 
   1242     return true;
   1243 }
   1244 
   1245 void HWC2On1Adapter::Display::generateChanges() {
   1246     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1247 
   1248     mChanges.reset(new Changes);
   1249 
   1250     size_t numLayers = mHwc1RequestedContents->numHwLayers;
   1251     for (size_t hwc1Id = 0; hwc1Id < numLayers; ++hwc1Id) {
   1252         const auto& receivedLayer = mHwc1RequestedContents->hwLayers[hwc1Id];
   1253         if (mHwc1LayerMap.count(hwc1Id) == 0) {
   1254             ALOGE_IF(receivedLayer.compositionType != HWC_FRAMEBUFFER_TARGET,
   1255                     "generateChanges: HWC1 layer %zd doesn't have a"
   1256                     " matching HWC2 layer, and isn't the framebuffer target",
   1257                     hwc1Id);
   1258             continue;
   1259         }
   1260 
   1261         Layer& layer = *mHwc1LayerMap[hwc1Id];
   1262         updateTypeChanges(receivedLayer, layer);
   1263         updateLayerRequests(receivedLayer, layer);
   1264     }
   1265 }
   1266 
   1267 bool HWC2On1Adapter::Display::hasChanges() const {
   1268     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1269     return mChanges != nullptr;
   1270 }
   1271 
   1272 Error HWC2On1Adapter::Display::set(hwc_display_contents_1& hwcContents) {
   1273     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1274 
   1275     if (!mChanges || (mChanges->getNumTypes() > 0)) {
   1276         ALOGE("[%" PRIu64 "] set failed: not validated", mId);
   1277         return Error::NotValidated;
   1278     }
   1279 
   1280     // Set up the client/framebuffer target
   1281     auto numLayers = hwcContents.numHwLayers;
   1282 
   1283     // Close acquire fences on FRAMEBUFFER layers, since they will not be used
   1284     // by HWC
   1285     for (size_t l = 0; l < numLayers - 1; ++l) {
   1286         auto& layer = hwcContents.hwLayers[l];
   1287         if (layer.compositionType == HWC_FRAMEBUFFER) {
   1288             ALOGV("Closing fence %d for layer %zd", layer.acquireFenceFd, l);
   1289             close(layer.acquireFenceFd);
   1290             layer.acquireFenceFd = -1;
   1291         }
   1292     }
   1293 
   1294     auto& clientTargetLayer = hwcContents.hwLayers[numLayers - 1];
   1295     if (clientTargetLayer.compositionType == HWC_FRAMEBUFFER_TARGET) {
   1296         clientTargetLayer.handle = mClientTarget.getBuffer();
   1297         clientTargetLayer.acquireFenceFd = mClientTarget.getFence();
   1298     } else {
   1299         ALOGE("[%" PRIu64 "] set: last HWC layer wasn't FRAMEBUFFER_TARGET",
   1300                 mId);
   1301     }
   1302 
   1303     mChanges.reset();
   1304 
   1305     return Error::None;
   1306 }
   1307 
   1308 void HWC2On1Adapter::Display::addRetireFence(int fenceFd) {
   1309     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1310     mRetireFence.add(fenceFd);
   1311 }
   1312 
   1313 void HWC2On1Adapter::Display::addReleaseFences(
   1314         const hwc_display_contents_1_t& hwcContents) {
   1315     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1316 
   1317     size_t numLayers = hwcContents.numHwLayers;
   1318     for (size_t hwc1Id = 0; hwc1Id < numLayers; ++hwc1Id) {
   1319         const auto& receivedLayer = hwcContents.hwLayers[hwc1Id];
   1320         if (mHwc1LayerMap.count(hwc1Id) == 0) {
   1321             if (receivedLayer.compositionType != HWC_FRAMEBUFFER_TARGET) {
   1322                 ALOGE("addReleaseFences: HWC1 layer %zd doesn't have a"
   1323                         " matching HWC2 layer, and isn't the framebuffer"
   1324                         " target", hwc1Id);
   1325             }
   1326             // Close the framebuffer target release fence since we will use the
   1327             // display retire fence instead
   1328             if (receivedLayer.releaseFenceFd != -1) {
   1329                 close(receivedLayer.releaseFenceFd);
   1330             }
   1331             continue;
   1332         }
   1333 
   1334         Layer& layer = *mHwc1LayerMap[hwc1Id];
   1335         ALOGV("Adding release fence %d to layer %" PRIu64,
   1336                 receivedLayer.releaseFenceFd, layer.getId());
   1337         layer.addReleaseFence(receivedLayer.releaseFenceFd);
   1338     }
   1339 }
   1340 
   1341 bool HWC2On1Adapter::Display::hasColorTransform() const {
   1342     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1343     return mHasColorTransform;
   1344 }
   1345 
   1346 static std::string hwc1CompositionString(int32_t type) {
   1347     switch (type) {
   1348         case HWC_FRAMEBUFFER: return "Framebuffer";
   1349         case HWC_OVERLAY: return "Overlay";
   1350         case HWC_BACKGROUND: return "Background";
   1351         case HWC_FRAMEBUFFER_TARGET: return "FramebufferTarget";
   1352         case HWC_SIDEBAND: return "Sideband";
   1353         case HWC_CURSOR_OVERLAY: return "CursorOverlay";
   1354         default:
   1355             return std::string("Unknown (") + std::to_string(type) + ")";
   1356     }
   1357 }
   1358 
   1359 static std::string hwc1TransformString(int32_t transform) {
   1360     switch (transform) {
   1361         case 0: return "None";
   1362         case HWC_TRANSFORM_FLIP_H: return "FlipH";
   1363         case HWC_TRANSFORM_FLIP_V: return "FlipV";
   1364         case HWC_TRANSFORM_ROT_90: return "Rotate90";
   1365         case HWC_TRANSFORM_ROT_180: return "Rotate180";
   1366         case HWC_TRANSFORM_ROT_270: return "Rotate270";
   1367         case HWC_TRANSFORM_FLIP_H_ROT_90: return "FlipHRotate90";
   1368         case HWC_TRANSFORM_FLIP_V_ROT_90: return "FlipVRotate90";
   1369         default:
   1370             return std::string("Unknown (") + std::to_string(transform) + ")";
   1371     }
   1372 }
   1373 
   1374 static std::string hwc1BlendModeString(int32_t mode) {
   1375     switch (mode) {
   1376         case HWC_BLENDING_NONE: return "None";
   1377         case HWC_BLENDING_PREMULT: return "Premultiplied";
   1378         case HWC_BLENDING_COVERAGE: return "Coverage";
   1379         default:
   1380             return std::string("Unknown (") + std::to_string(mode) + ")";
   1381     }
   1382 }
   1383 
   1384 static std::string rectString(hwc_rect_t rect) {
   1385     std::stringstream output;
   1386     output << "[" << rect.left << ", " << rect.top << ", ";
   1387     output << rect.right << ", " << rect.bottom << "]";
   1388     return output.str();
   1389 }
   1390 
   1391 static std::string approximateFloatString(float f) {
   1392     if (static_cast<int32_t>(f) == f) {
   1393         return std::to_string(static_cast<int32_t>(f));
   1394     }
   1395     int32_t truncated = static_cast<int32_t>(f * 10);
   1396     bool approximate = (static_cast<float>(truncated) != f * 10);
   1397     const size_t BUFFER_SIZE = 32;
   1398     char buffer[BUFFER_SIZE] = {};
   1399     auto bytesWritten = snprintf(buffer, BUFFER_SIZE,
   1400             "%s%.1f", approximate ? "~" : "", f);
   1401     return std::string(buffer, bytesWritten);
   1402 }
   1403 
   1404 static std::string frectString(hwc_frect_t frect) {
   1405     std::stringstream output;
   1406     output << "[" << approximateFloatString(frect.left) << ", ";
   1407     output << approximateFloatString(frect.top) << ", ";
   1408     output << approximateFloatString(frect.right) << ", ";
   1409     output << approximateFloatString(frect.bottom) << "]";
   1410     return output.str();
   1411 }
   1412 
   1413 static std::string colorString(hwc_color_t color) {
   1414     std::stringstream output;
   1415     output << "RGBA [";
   1416     output << static_cast<int32_t>(color.r) << ", ";
   1417     output << static_cast<int32_t>(color.g) << ", ";
   1418     output << static_cast<int32_t>(color.b) << ", ";
   1419     output << static_cast<int32_t>(color.a) << "]";
   1420     return output.str();
   1421 }
   1422 
   1423 static std::string alphaString(float f) {
   1424     const size_t BUFFER_SIZE = 8;
   1425     char buffer[BUFFER_SIZE] = {};
   1426     auto bytesWritten = snprintf(buffer, BUFFER_SIZE, "%.3f", f);
   1427     return std::string(buffer, bytesWritten);
   1428 }
   1429 
   1430 static std::string to_string(const hwc_layer_1_t& hwcLayer,
   1431         int32_t hwc1MinorVersion) {
   1432     const char* fill = "          ";
   1433 
   1434     std::stringstream output;
   1435 
   1436     output << "  Composition: " <<
   1437             hwc1CompositionString(hwcLayer.compositionType);
   1438 
   1439     if (hwcLayer.compositionType == HWC_BACKGROUND) {
   1440         output << "  Color: " << colorString(hwcLayer.backgroundColor) << '\n';
   1441     } else if (hwcLayer.compositionType == HWC_SIDEBAND) {
   1442         output << "  Stream: " << hwcLayer.sidebandStream << '\n';
   1443     } else {
   1444         output << "  Buffer: " << hwcLayer.handle << "/" <<
   1445                 hwcLayer.acquireFenceFd << '\n';
   1446     }
   1447 
   1448     output << fill << "Display frame: " << rectString(hwcLayer.displayFrame) <<
   1449             '\n';
   1450 
   1451     output << fill << "Source crop: ";
   1452     if (hwc1MinorVersion >= 3) {
   1453         output << frectString(hwcLayer.sourceCropf) << '\n';
   1454     } else {
   1455         output << rectString(hwcLayer.sourceCropi) << '\n';
   1456     }
   1457 
   1458     output << fill << "Transform: " << hwc1TransformString(hwcLayer.transform);
   1459     output << "  Blend mode: " << hwc1BlendModeString(hwcLayer.blending);
   1460     if (hwcLayer.planeAlpha != 0xFF) {
   1461         output << "  Alpha: " << alphaString(hwcLayer.planeAlpha / 255.0f);
   1462     }
   1463     output << '\n';
   1464 
   1465     if (hwcLayer.hints != 0) {
   1466         output << fill << "Hints:";
   1467         if ((hwcLayer.hints & HWC_HINT_TRIPLE_BUFFER) != 0) {
   1468             output << " TripleBuffer";
   1469         }
   1470         if ((hwcLayer.hints & HWC_HINT_CLEAR_FB) != 0) {
   1471             output << " ClearFB";
   1472         }
   1473         output << '\n';
   1474     }
   1475 
   1476     if (hwcLayer.flags != 0) {
   1477         output << fill << "Flags:";
   1478         if ((hwcLayer.flags & HWC_SKIP_LAYER) != 0) {
   1479             output << " SkipLayer";
   1480         }
   1481         if ((hwcLayer.flags & HWC_IS_CURSOR_LAYER) != 0) {
   1482             output << " IsCursorLayer";
   1483         }
   1484         output << '\n';
   1485     }
   1486 
   1487     return output.str();
   1488 }
   1489 
   1490 static std::string to_string(const hwc_display_contents_1_t& hwcContents,
   1491         int32_t hwc1MinorVersion) {
   1492     const char* fill = "      ";
   1493 
   1494     std::stringstream output;
   1495     output << fill << "Geometry changed: " <<
   1496             ((hwcContents.flags & HWC_GEOMETRY_CHANGED) != 0 ? "Y\n" : "N\n");
   1497 
   1498     output << fill << hwcContents.numHwLayers << " Layer" <<
   1499             ((hwcContents.numHwLayers == 1) ? "\n" : "s\n");
   1500     for (size_t layer = 0; layer < hwcContents.numHwLayers; ++layer) {
   1501         output << fill << "  Layer " << layer;
   1502         output << to_string(hwcContents.hwLayers[layer], hwc1MinorVersion);
   1503     }
   1504 
   1505     if (hwcContents.outbuf != nullptr) {
   1506         output << fill << "Output buffer: " << hwcContents.outbuf << "/" <<
   1507                 hwcContents.outbufAcquireFenceFd << '\n';
   1508     }
   1509 
   1510     return output.str();
   1511 }
   1512 
   1513 std::string HWC2On1Adapter::Display::dump() const {
   1514     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
   1515 
   1516     std::stringstream output;
   1517 
   1518     output << "  Display " << mId << ": ";
   1519     output << to_string(mType) << "  ";
   1520     output << "HWC1 ID: " << mHwc1Id << "  ";
   1521     output << "Power mode: " << to_string(mPowerMode) << "  ";
   1522     output << "Vsync: " << to_string(mVsyncEnabled) << '\n';
   1523 
   1524     output << "    Color modes [active]:";
   1525     for (const auto& mode : mColorModes) {
   1526         if (mode == mActiveColorMode) {
   1527             output << " [" << mode << ']';
   1528         } else {
   1529             output << " " << mode;
   1530         }
   1531     }
   1532     output << '\n';
   1533 
   1534     output << "    " << mConfigs.size() << " Config" <<
   1535             (mConfigs.size() == 1 ? "" : "s") << " (* active)\n";
   1536     for (const auto& config : mConfigs) {
   1537         output << (config == mActiveConfig ? "    * " : "      ");
   1538         output << config->toString(true) << '\n';
   1539     }
   1540 
   1541     output << "    " << mLayers.size() << " Layer" <<
   1542             (mLayers.size() == 1 ? "" : "s") << '\n';
   1543     for (const auto& layer : mLayers) {
   1544         output << layer->dump();
   1545     }
   1546 
   1547     output << "    Client target: " << mClientTarget.getBuffer() << '\n';
   1548 
   1549     if (mOutputBuffer.getBuffer() != nullptr) {
   1550         output << "    Output buffer: " << mOutputBuffer.getBuffer() << '\n';
   1551     }
   1552 
   1553     if (mHwc1RequestedContents) {
   1554         output << "    Last requested HWC1 state\n";
   1555         output << to_string(*mHwc1RequestedContents, mDevice.mHwc1MinorVersion);
   1556     }
   1557 
   1558     return output.str();
   1559 }
   1560 
   1561 hwc_rect_t* HWC2On1Adapter::Display::GetRects(size_t numRects) {
   1562     if (numRects == 0) {
   1563         return nullptr;
   1564     }
   1565 
   1566     if (numRects > mNumAvailableRects) {
   1567         // This should NEVER happen since we calculated how many rects the
   1568         // display would need.
   1569         ALOGE("Rect allocation failure! SF is likely to crash soon!");
   1570         return nullptr;
   1571 
   1572     }
   1573     hwc_rect_t* rects = mNextAvailableRect;
   1574     mNextAvailableRect += numRects;
   1575     mNumAvailableRects -= numRects;
   1576     return rects;
   1577 }
   1578 
   1579 hwc_display_contents_1* HWC2On1Adapter::Display::getDisplayContents() {
   1580     return mHwc1RequestedContents.get();
   1581 }
   1582 
   1583 void HWC2On1Adapter::Display::Config::setAttribute(HWC2::Attribute attribute,
   1584         int32_t value) {
   1585     mAttributes[attribute] = value;
   1586 }
   1587 
   1588 int32_t HWC2On1Adapter::Display::Config::getAttribute(Attribute attribute) const {
   1589     if (mAttributes.count(attribute) == 0) {
   1590         return -1;
   1591     }
   1592     return mAttributes.at(attribute);
   1593 }
   1594 
   1595 void HWC2On1Adapter::Display::Config::setHwc1Id(uint32_t id) {
   1596     android_color_mode_t colorMode = static_cast<android_color_mode_t>(getAttribute(ColorMode));
   1597     mHwc1Ids.emplace(colorMode, id);
   1598 }
   1599 
   1600 bool HWC2On1Adapter::Display::Config::hasHwc1Id(uint32_t id) const {
   1601     for (const auto& idPair : mHwc1Ids) {
   1602         if (id == idPair.second) {
   1603             return true;
   1604         }
   1605     }
   1606     return false;
   1607 }
   1608 
   1609 Error HWC2On1Adapter::Display::Config::getColorModeForHwc1Id(
   1610         uint32_t id, android_color_mode_t* outMode) const {
   1611     for (const auto& idPair : mHwc1Ids) {
   1612         if (id == idPair.second) {
   1613             *outMode = idPair.first;
   1614             return Error::None;
   1615         }
   1616     }
   1617     ALOGE("Unable to find color mode for HWC ID %" PRIu32 " on config %u", id, mId);
   1618     return Error::BadParameter;
   1619 }
   1620 
   1621 Error HWC2On1Adapter::Display::Config::getHwc1IdForColorMode(android_color_mode_t mode,
   1622         uint32_t* outId) const {
   1623     for (const auto& idPair : mHwc1Ids) {
   1624         if (mode == idPair.first) {
   1625             *outId = idPair.second;
   1626             return Error::None;
   1627         }
   1628     }
   1629     ALOGE("Unable to find HWC1 ID for color mode %d on config %u", mode, mId);
   1630     return Error::BadParameter;
   1631 }
   1632 
   1633 bool HWC2On1Adapter::Display::Config::merge(const Config& other) {
   1634     auto attributes = {HWC2::Attribute::Width, HWC2::Attribute::Height,
   1635             HWC2::Attribute::VsyncPeriod, HWC2::Attribute::DpiX,
   1636             HWC2::Attribute::DpiY};
   1637     for (auto attribute : attributes) {
   1638         if (getAttribute(attribute) != other.getAttribute(attribute)) {
   1639             return false;
   1640         }
   1641     }
   1642     android_color_mode_t otherColorMode =
   1643             static_cast<android_color_mode_t>(other.getAttribute(ColorMode));
   1644     if (mHwc1Ids.count(otherColorMode) != 0) {
   1645         ALOGE("Attempted to merge two configs (%u and %u) which appear to be "
   1646                 "identical", mHwc1Ids.at(otherColorMode),
   1647                 other.mHwc1Ids.at(otherColorMode));
   1648         return false;
   1649     }
   1650     mHwc1Ids.emplace(otherColorMode,
   1651             other.mHwc1Ids.at(otherColorMode));
   1652     return true;
   1653 }
   1654 
   1655 std::set<android_color_mode_t> HWC2On1Adapter::Display::Config::getColorModes() const {
   1656     std::set<android_color_mode_t> colorModes;
   1657     for (const auto& idPair : mHwc1Ids) {
   1658         colorModes.emplace(idPair.first);
   1659     }
   1660     return colorModes;
   1661 }
   1662 
   1663 std::string HWC2On1Adapter::Display::Config::toString(bool splitLine) const {
   1664     std::string output;
   1665 
   1666     const size_t BUFFER_SIZE = 100;
   1667     char buffer[BUFFER_SIZE] = {};
   1668     auto writtenBytes = snprintf(buffer, BUFFER_SIZE,
   1669             "%u x %u", mAttributes.at(HWC2::Attribute::Width),
   1670             mAttributes.at(HWC2::Attribute::Height));
   1671     output.append(buffer, writtenBytes);
   1672 
   1673     if (mAttributes.count(HWC2::Attribute::VsyncPeriod) != 0) {
   1674         std::memset(buffer, 0, BUFFER_SIZE);
   1675         writtenBytes = snprintf(buffer, BUFFER_SIZE, " @ %.1f Hz",
   1676                 1e9 / mAttributes.at(HWC2::Attribute::VsyncPeriod));
   1677         output.append(buffer, writtenBytes);
   1678     }
   1679 
   1680     if (mAttributes.count(HWC2::Attribute::DpiX) != 0 &&
   1681             mAttributes.at(HWC2::Attribute::DpiX) != -1) {
   1682         std::memset(buffer, 0, BUFFER_SIZE);
   1683         writtenBytes = snprintf(buffer, BUFFER_SIZE,
   1684                 ", DPI: %.1f x %.1f",
   1685                 mAttributes.at(HWC2::Attribute::DpiX) / 1000.0f,
   1686                 mAttributes.at(HWC2::Attribute::DpiY) / 1000.0f);
   1687         output.append(buffer, writtenBytes);
   1688     }
   1689 
   1690     std::memset(buffer, 0, BUFFER_SIZE);
   1691     if (splitLine) {
   1692         writtenBytes = snprintf(buffer, BUFFER_SIZE,
   1693                 "\n        HWC1 ID/Color transform:");
   1694     } else {
   1695         writtenBytes = snprintf(buffer, BUFFER_SIZE,
   1696                 ", HWC1 ID/Color transform:");
   1697     }
   1698     output.append(buffer, writtenBytes);
   1699 
   1700 
   1701     for (const auto& id : mHwc1Ids) {
   1702         android_color_mode_t colorMode = id.first;
   1703         uint32_t hwc1Id = id.second;
   1704         std::memset(buffer, 0, BUFFER_SIZE);
   1705         if (colorMode == mDisplay.mActiveColorMode) {
   1706             writtenBytes = snprintf(buffer, BUFFER_SIZE, " [%u/%d]", hwc1Id,
   1707                     colorMode);
   1708         } else {
   1709             writtenBytes = snprintf(buffer, BUFFER_SIZE, " %u/%d", hwc1Id,
   1710                     colorMode);
   1711         }
   1712         output.append(buffer, writtenBytes);
   1713     }
   1714 
   1715     return output;
   1716 }
   1717 
   1718 std::shared_ptr<const HWC2On1Adapter::Display::Config>
   1719         HWC2On1Adapter::Display::getConfig(hwc2_config_t configId) const {
   1720     if (configId > mConfigs.size() || !mConfigs[configId]->isOnDisplay(*this)) {
   1721         return nullptr;
   1722     }
   1723     return mConfigs[configId];
   1724 }
   1725 
   1726 void HWC2On1Adapter::Display::populateColorModes() {
   1727     mColorModes = mConfigs[0]->getColorModes();
   1728     for (const auto& config : mConfigs) {
   1729         std::set<android_color_mode_t> intersection;
   1730         auto configModes = config->getColorModes();
   1731         std::set_intersection(mColorModes.cbegin(), mColorModes.cend(),
   1732                 configModes.cbegin(), configModes.cend(),
   1733                 std::inserter(intersection, intersection.begin()));
   1734         std::swap(intersection, mColorModes);
   1735     }
   1736 }
   1737 
   1738 void HWC2On1Adapter::Display::initializeActiveConfig() {
   1739     if (mDevice.mHwc1Device->getActiveConfig == nullptr) {
   1740         ALOGV("getActiveConfig is null, choosing config 0");
   1741         mActiveConfig = mConfigs[0];
   1742         mActiveColorMode = HAL_COLOR_MODE_NATIVE;
   1743         return;
   1744     }
   1745 
   1746     auto activeConfig = mDevice.mHwc1Device->getActiveConfig(
   1747             mDevice.mHwc1Device, mHwc1Id);
   1748 
   1749     // Some devices startup without an activeConfig:
   1750     // We need to set one ourselves.
   1751     if (activeConfig == HWC_ERROR) {
   1752         ALOGV("There is no active configuration: Picking the first one: 0.");
   1753         const int defaultIndex = 0;
   1754         mDevice.mHwc1Device->setActiveConfig(mDevice.mHwc1Device, mHwc1Id, defaultIndex);
   1755         activeConfig = defaultIndex;
   1756     }
   1757 
   1758     for (const auto& config : mConfigs) {
   1759         if (config->hasHwc1Id(activeConfig)) {
   1760             ALOGE("Setting active config to %d for HWC1 config %u", config->getId(), activeConfig);
   1761             mActiveConfig = config;
   1762             if (config->getColorModeForHwc1Id(activeConfig, &mActiveColorMode) != Error::None) {
   1763                 // This should never happen since we checked for the config's presence before
   1764                 // setting it as active.
   1765                 ALOGE("Unable to find color mode for active HWC1 config %d", config->getId());
   1766                 mActiveColorMode = HAL_COLOR_MODE_NATIVE;
   1767             }
   1768             break;
   1769         }
   1770     }
   1771     if (!mActiveConfig) {
   1772         ALOGV("Unable to find active HWC1 config %u, defaulting to "
   1773                 "config 0", activeConfig);
   1774         mActiveConfig = mConfigs[0];
   1775         mActiveColorMode = HAL_COLOR_MODE_NATIVE;
   1776     }
   1777 
   1778 
   1779 
   1780 
   1781 }
   1782 
   1783 void HWC2On1Adapter::Display::allocateRequestedContents() {
   1784     // What needs to be allocated:
   1785     // 1 hwc_display_contents_1_t
   1786     // 1 hwc_layer_1_t for each layer
   1787     // 1 hwc_rect_t for each layer's surfaceDamage
   1788     // 1 hwc_rect_t for each layer's visibleRegion
   1789     // 1 hwc_layer_1_t for the framebuffer
   1790     // 1 hwc_rect_t for the framebuffer's visibleRegion
   1791 
   1792     // Count # of surfaceDamage
   1793     size_t numSurfaceDamages = 0;
   1794     for (const auto& layer : mLayers) {
   1795         numSurfaceDamages += layer->getNumSurfaceDamages();
   1796     }
   1797 
   1798     // Count # of visibleRegions (start at 1 for mandatory framebuffer target
   1799     // region)
   1800     size_t numVisibleRegion = 1;
   1801     for (const auto& layer : mLayers) {
   1802         numVisibleRegion += layer->getNumVisibleRegions();
   1803     }
   1804 
   1805     size_t numRects = numVisibleRegion + numSurfaceDamages;
   1806     auto numLayers = mLayers.size() + 1;
   1807     size_t size = sizeof(hwc_display_contents_1_t) +
   1808             sizeof(hwc_layer_1_t) * numLayers +
   1809             sizeof(hwc_rect_t) * numRects;
   1810     auto contents = static_cast<hwc_display_contents_1_t*>(std::calloc(size, 1));
   1811     mHwc1RequestedContents.reset(contents);
   1812     mNextAvailableRect = reinterpret_cast<hwc_rect_t*>(&contents->hwLayers[numLayers]);
   1813     mNumAvailableRects = numRects;
   1814 }
   1815 
   1816 void HWC2On1Adapter::Display::assignHwc1LayerIds() {
   1817     mHwc1LayerMap.clear();
   1818     size_t nextHwc1Id = 0;
   1819     for (auto& layer : mLayers) {
   1820         mHwc1LayerMap[nextHwc1Id] = layer;
   1821         layer->setHwc1Id(nextHwc1Id++);
   1822     }
   1823 }
   1824 
   1825 void HWC2On1Adapter::Display::updateTypeChanges(const hwc_layer_1_t& hwc1Layer,
   1826         const Layer& layer) {
   1827     auto layerId = layer.getId();
   1828     switch (hwc1Layer.compositionType) {
   1829         case HWC_FRAMEBUFFER:
   1830             if (layer.getCompositionType() != Composition::Client) {
   1831                 mChanges->addTypeChange(layerId, Composition::Client);
   1832             }
   1833             break;
   1834         case HWC_OVERLAY:
   1835             if (layer.getCompositionType() != Composition::Device) {
   1836                 mChanges->addTypeChange(layerId, Composition::Device);
   1837             }
   1838             break;
   1839         case HWC_BACKGROUND:
   1840             ALOGE_IF(layer.getCompositionType() != Composition::SolidColor,
   1841                     "updateTypeChanges: HWC1 requested BACKGROUND, but HWC2"
   1842                     " wasn't expecting SolidColor");
   1843             break;
   1844         case HWC_FRAMEBUFFER_TARGET:
   1845             // Do nothing, since it shouldn't be modified by HWC1
   1846             break;
   1847         case HWC_SIDEBAND:
   1848             ALOGE_IF(layer.getCompositionType() != Composition::Sideband,
   1849                     "updateTypeChanges: HWC1 requested SIDEBAND, but HWC2"
   1850                     " wasn't expecting Sideband");
   1851             break;
   1852         case HWC_CURSOR_OVERLAY:
   1853             ALOGE_IF(layer.getCompositionType() != Composition::Cursor,
   1854                     "updateTypeChanges: HWC1 requested CURSOR_OVERLAY, but"
   1855                     " HWC2 wasn't expecting Cursor");
   1856             break;
   1857     }
   1858 }
   1859 
   1860 void HWC2On1Adapter::Display::updateLayerRequests(
   1861         const hwc_layer_1_t& hwc1Layer, const Layer& layer) {
   1862     if ((hwc1Layer.hints & HWC_HINT_CLEAR_FB) != 0) {
   1863         mChanges->addLayerRequest(layer.getId(),
   1864                 LayerRequest::ClearClientTarget);
   1865     }
   1866 }
   1867 
   1868 void HWC2On1Adapter::Display::prepareFramebufferTarget() {
   1869     // We check that mActiveConfig is valid in Display::prepare
   1870     int32_t width = mActiveConfig->getAttribute(Attribute::Width);
   1871     int32_t height = mActiveConfig->getAttribute(Attribute::Height);
   1872 
   1873     auto& hwc1Target = mHwc1RequestedContents->hwLayers[mLayers.size()];
   1874     hwc1Target.compositionType = HWC_FRAMEBUFFER_TARGET;
   1875     hwc1Target.releaseFenceFd = -1;
   1876     hwc1Target.hints = 0;
   1877     hwc1Target.flags = 0;
   1878     hwc1Target.transform = 0;
   1879     hwc1Target.blending = HWC_BLENDING_PREMULT;
   1880     if (mDevice.getHwc1MinorVersion() < 3) {
   1881         hwc1Target.sourceCropi = {0, 0, width, height};
   1882     } else {
   1883         hwc1Target.sourceCropf = {0.0f, 0.0f, static_cast<float>(width),
   1884                 static_cast<float>(height)};
   1885     }
   1886     hwc1Target.displayFrame = {0, 0, width, height};
   1887     hwc1Target.planeAlpha = 255;
   1888 
   1889     hwc1Target.visibleRegionScreen.numRects = 1;
   1890     hwc_rect_t* rects = GetRects(1);
   1891     rects[0].left = 0;
   1892     rects[0].top = 0;
   1893     rects[0].right = width;
   1894     rects[0].bottom = height;
   1895     hwc1Target.visibleRegionScreen.rects = rects;
   1896 
   1897     // We will set this to the correct value in set
   1898     hwc1Target.acquireFenceFd = -1;
   1899 }
   1900 
   1901 // Layer functions
   1902 
   1903 std::atomic<hwc2_layer_t> HWC2On1Adapter::Layer::sNextId(1);
   1904 
   1905 HWC2On1Adapter::Layer::Layer(Display& display)
   1906   : mId(sNextId++),
   1907     mDisplay(display),
   1908     mBuffer(),
   1909     mSurfaceDamage(),
   1910     mBlendMode(BlendMode::None),
   1911     mColor({0, 0, 0, 0}),
   1912     mCompositionType(Composition::Invalid),
   1913     mDisplayFrame({0, 0, -1, -1}),
   1914     mPlaneAlpha(0.0f),
   1915     mSidebandStream(nullptr),
   1916     mSourceCrop({0.0f, 0.0f, -1.0f, -1.0f}),
   1917     mTransform(Transform::None),
   1918     mVisibleRegion(),
   1919     mZ(0),
   1920     mReleaseFence(),
   1921     mHwc1Id(0),
   1922     mHasUnsupportedPlaneAlpha(false) {}
   1923 
   1924 bool HWC2On1Adapter::SortLayersByZ::operator()(
   1925         const std::shared_ptr<Layer>& lhs, const std::shared_ptr<Layer>& rhs) {
   1926     return lhs->getZ() < rhs->getZ();
   1927 }
   1928 
   1929 Error HWC2On1Adapter::Layer::setBuffer(buffer_handle_t buffer,
   1930         int32_t acquireFence) {
   1931     ALOGV("Setting acquireFence to %d for layer %" PRIu64, acquireFence, mId);
   1932     mBuffer.setBuffer(buffer);
   1933     mBuffer.setFence(acquireFence);
   1934     return Error::None;
   1935 }
   1936 
   1937 Error HWC2On1Adapter::Layer::setCursorPosition(int32_t x, int32_t y) {
   1938     if (mCompositionType != Composition::Cursor) {
   1939         return Error::BadLayer;
   1940     }
   1941 
   1942     if (mDisplay.hasChanges()) {
   1943         return Error::NotValidated;
   1944     }
   1945 
   1946     auto displayId = mDisplay.getHwc1Id();
   1947     auto hwc1Device = mDisplay.getDevice().getHwc1Device();
   1948     hwc1Device->setCursorPositionAsync(hwc1Device, displayId, x, y);
   1949     return Error::None;
   1950 }
   1951 
   1952 Error HWC2On1Adapter::Layer::setSurfaceDamage(hwc_region_t damage) {
   1953     // HWC1 supports surface damage starting only with version 1.5.
   1954     if (mDisplay.getDevice().mHwc1MinorVersion < 5) {
   1955         return Error::None;
   1956     }
   1957     mSurfaceDamage.resize(damage.numRects);
   1958     std::copy_n(damage.rects, damage.numRects, mSurfaceDamage.begin());
   1959     return Error::None;
   1960 }
   1961 
   1962 // Layer state functions
   1963 
   1964 Error HWC2On1Adapter::Layer::setBlendMode(BlendMode mode) {
   1965     mBlendMode = mode;
   1966     mDisplay.markGeometryChanged();
   1967     return Error::None;
   1968 }
   1969 
   1970 Error HWC2On1Adapter::Layer::setColor(hwc_color_t color) {
   1971     mColor = color;
   1972     mDisplay.markGeometryChanged();
   1973     return Error::None;
   1974 }
   1975 
   1976 Error HWC2On1Adapter::Layer::setCompositionType(Composition type) {
   1977     mCompositionType = type;
   1978     mDisplay.markGeometryChanged();
   1979     return Error::None;
   1980 }
   1981 
   1982 Error HWC2On1Adapter::Layer::setDataspace(android_dataspace_t) {
   1983     return Error::None;
   1984 }
   1985 
   1986 Error HWC2On1Adapter::Layer::setDisplayFrame(hwc_rect_t frame) {
   1987     mDisplayFrame = frame;
   1988     mDisplay.markGeometryChanged();
   1989     return Error::None;
   1990 }
   1991 
   1992 Error HWC2On1Adapter::Layer::setPlaneAlpha(float alpha) {
   1993     mPlaneAlpha = alpha;
   1994     mDisplay.markGeometryChanged();
   1995     return Error::None;
   1996 }
   1997 
   1998 Error HWC2On1Adapter::Layer::setSidebandStream(const native_handle_t* stream) {
   1999     mSidebandStream = stream;
   2000     mDisplay.markGeometryChanged();
   2001     return Error::None;
   2002 }
   2003 
   2004 Error HWC2On1Adapter::Layer::setSourceCrop(hwc_frect_t crop) {
   2005     mSourceCrop = crop;
   2006     mDisplay.markGeometryChanged();
   2007     return Error::None;
   2008 }
   2009 
   2010 Error HWC2On1Adapter::Layer::setTransform(Transform transform) {
   2011     mTransform = transform;
   2012     mDisplay.markGeometryChanged();
   2013     return Error::None;
   2014 }
   2015 
   2016 static bool compareRects(const hwc_rect_t& rect1, const hwc_rect_t& rect2) {
   2017     return rect1.left == rect2.left &&
   2018             rect1.right == rect2.right &&
   2019             rect1.top == rect2.top &&
   2020             rect1.bottom == rect2.bottom;
   2021 }
   2022 
   2023 Error HWC2On1Adapter::Layer::setVisibleRegion(hwc_region_t visible) {
   2024     if ((getNumVisibleRegions() != visible.numRects) ||
   2025         !std::equal(mVisibleRegion.begin(), mVisibleRegion.end(), visible.rects,
   2026                     compareRects)) {
   2027         mVisibleRegion.resize(visible.numRects);
   2028         std::copy_n(visible.rects, visible.numRects, mVisibleRegion.begin());
   2029         mDisplay.markGeometryChanged();
   2030     }
   2031     return Error::None;
   2032 }
   2033 
   2034 Error HWC2On1Adapter::Layer::setZ(uint32_t z) {
   2035     mZ = z;
   2036     return Error::None;
   2037 }
   2038 
   2039 void HWC2On1Adapter::Layer::addReleaseFence(int fenceFd) {
   2040     ALOGV("addReleaseFence %d to layer %" PRIu64, fenceFd, mId);
   2041     mReleaseFence.add(fenceFd);
   2042 }
   2043 
   2044 const sp<MiniFence>& HWC2On1Adapter::Layer::getReleaseFence() const {
   2045     return mReleaseFence.get();
   2046 }
   2047 
   2048 void HWC2On1Adapter::Layer::applyState(hwc_layer_1_t& hwc1Layer) {
   2049     applyCommonState(hwc1Layer);
   2050     applyCompositionType(hwc1Layer);
   2051     switch (mCompositionType) {
   2052         case Composition::SolidColor : applySolidColorState(hwc1Layer); break;
   2053         case Composition::Sideband : applySidebandState(hwc1Layer); break;
   2054         default: applyBufferState(hwc1Layer); break;
   2055     }
   2056 }
   2057 
   2058 static std::string regionStrings(const std::vector<hwc_rect_t>& visibleRegion,
   2059         const std::vector<hwc_rect_t>& surfaceDamage) {
   2060     std::string regions;
   2061     regions += "        Visible Region";
   2062     regions.resize(40, ' ');
   2063     regions += "Surface Damage\n";
   2064 
   2065     size_t numPrinted = 0;
   2066     size_t maxSize = std::max(visibleRegion.size(), surfaceDamage.size());
   2067     while (numPrinted < maxSize) {
   2068         std::string line("        ");
   2069         if (visibleRegion.empty() && numPrinted == 0) {
   2070             line += "None";
   2071         } else if (numPrinted < visibleRegion.size()) {
   2072             line += rectString(visibleRegion[numPrinted]);
   2073         }
   2074         line.resize(40, ' ');
   2075         if (surfaceDamage.empty() && numPrinted == 0) {
   2076             line += "None";
   2077         } else if (numPrinted < surfaceDamage.size()) {
   2078             line += rectString(surfaceDamage[numPrinted]);
   2079         }
   2080         line += '\n';
   2081         regions += line;
   2082         ++numPrinted;
   2083     }
   2084     return regions;
   2085 }
   2086 
   2087 std::string HWC2On1Adapter::Layer::dump() const {
   2088     std::stringstream output;
   2089     const char* fill = "      ";
   2090 
   2091     output << fill << to_string(mCompositionType);
   2092     output << " Layer  HWC2/1: " << mId << "/" << mHwc1Id << "  ";
   2093     output << "Z: " << mZ;
   2094     if (mCompositionType == HWC2::Composition::SolidColor) {
   2095         output << "  " << colorString(mColor);
   2096     } else if (mCompositionType == HWC2::Composition::Sideband) {
   2097         output << "  Handle: " << mSidebandStream << '\n';
   2098     } else {
   2099         output << "  Buffer: " << mBuffer.getBuffer() << "/" <<
   2100                 mBuffer.getFence() << '\n';
   2101         output << fill << "  Display frame [LTRB]: " <<
   2102                 rectString(mDisplayFrame) << '\n';
   2103         output << fill << "  Source crop: " <<
   2104                 frectString(mSourceCrop) << '\n';
   2105         output << fill << "  Transform: " << to_string(mTransform);
   2106         output << "  Blend mode: " << to_string(mBlendMode);
   2107         if (mPlaneAlpha != 1.0f) {
   2108             output << "  Alpha: " <<
   2109                 alphaString(mPlaneAlpha) << '\n';
   2110         } else {
   2111             output << '\n';
   2112         }
   2113         output << regionStrings(mVisibleRegion, mSurfaceDamage);
   2114     }
   2115     return output.str();
   2116 }
   2117 
   2118 static int getHwc1Blending(HWC2::BlendMode blendMode) {
   2119     switch (blendMode) {
   2120         case BlendMode::Coverage: return HWC_BLENDING_COVERAGE;
   2121         case BlendMode::Premultiplied: return HWC_BLENDING_PREMULT;
   2122         default: return HWC_BLENDING_NONE;
   2123     }
   2124 }
   2125 
   2126 void HWC2On1Adapter::Layer::applyCommonState(hwc_layer_1_t& hwc1Layer) {
   2127     auto minorVersion = mDisplay.getDevice().getHwc1MinorVersion();
   2128     hwc1Layer.blending = getHwc1Blending(mBlendMode);
   2129     hwc1Layer.displayFrame = mDisplayFrame;
   2130 
   2131     auto pendingAlpha = mPlaneAlpha;
   2132     if (minorVersion < 2) {
   2133         mHasUnsupportedPlaneAlpha = pendingAlpha < 1.0f;
   2134     } else {
   2135         hwc1Layer.planeAlpha =
   2136                 static_cast<uint8_t>(255.0f * pendingAlpha + 0.5f);
   2137     }
   2138 
   2139     if (minorVersion < 3) {
   2140         auto pending = mSourceCrop;
   2141         hwc1Layer.sourceCropi.left =
   2142                 static_cast<int32_t>(std::ceil(pending.left));
   2143         hwc1Layer.sourceCropi.top =
   2144                 static_cast<int32_t>(std::ceil(pending.top));
   2145         hwc1Layer.sourceCropi.right =
   2146                 static_cast<int32_t>(std::floor(pending.right));
   2147         hwc1Layer.sourceCropi.bottom =
   2148                 static_cast<int32_t>(std::floor(pending.bottom));
   2149     } else {
   2150         hwc1Layer.sourceCropf = mSourceCrop;
   2151     }
   2152 
   2153     hwc1Layer.transform = static_cast<uint32_t>(mTransform);
   2154 
   2155     auto& hwc1VisibleRegion = hwc1Layer.visibleRegionScreen;
   2156     hwc1VisibleRegion.numRects = mVisibleRegion.size();
   2157     hwc_rect_t* rects = mDisplay.GetRects(hwc1VisibleRegion.numRects);
   2158     hwc1VisibleRegion.rects = rects;
   2159     for (size_t i = 0; i < mVisibleRegion.size(); i++) {
   2160         rects[i] = mVisibleRegion[i];
   2161     }
   2162 }
   2163 
   2164 void HWC2On1Adapter::Layer::applySolidColorState(hwc_layer_1_t& hwc1Layer) {
   2165     // If the device does not support background color it is likely to make
   2166     // assumption regarding backgroundColor and handle (both fields occupy
   2167     // the same location in hwc_layer_1_t union).
   2168     // To not confuse these devices we don't set background color and we
   2169     // make sure handle is a null pointer.
   2170     if (hasUnsupportedBackgroundColor()) {
   2171         hwc1Layer.handle = nullptr;
   2172     } else {
   2173         hwc1Layer.backgroundColor = mColor;
   2174     }
   2175 }
   2176 
   2177 void HWC2On1Adapter::Layer::applySidebandState(hwc_layer_1_t& hwc1Layer) {
   2178     hwc1Layer.sidebandStream = mSidebandStream;
   2179 }
   2180 
   2181 void HWC2On1Adapter::Layer::applyBufferState(hwc_layer_1_t& hwc1Layer) {
   2182     hwc1Layer.handle = mBuffer.getBuffer();
   2183     hwc1Layer.acquireFenceFd = mBuffer.getFence();
   2184 }
   2185 
   2186 void HWC2On1Adapter::Layer::applyCompositionType(hwc_layer_1_t& hwc1Layer) {
   2187     // HWC1 never supports color transforms or dataspaces and only sometimes
   2188     // supports plane alpha (depending on the version). These require us to drop
   2189     // some or all layers to client composition.
   2190     if (mHasUnsupportedPlaneAlpha || mDisplay.hasColorTransform() ||
   2191             hasUnsupportedBackgroundColor()) {
   2192         hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2193         hwc1Layer.flags = HWC_SKIP_LAYER;
   2194         return;
   2195     }
   2196 
   2197     hwc1Layer.flags = 0;
   2198     switch (mCompositionType) {
   2199         case Composition::Client:
   2200             hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2201             hwc1Layer.flags |= HWC_SKIP_LAYER;
   2202             break;
   2203         case Composition::Device:
   2204             hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2205             break;
   2206         case Composition::SolidColor:
   2207             // In theory the following line should work, but since the HWC1
   2208             // version of SurfaceFlinger never used HWC_BACKGROUND, HWC1
   2209             // devices may not work correctly. To be on the safe side, we
   2210             // fall back to client composition.
   2211             //
   2212             // hwc1Layer.compositionType = HWC_BACKGROUND;
   2213             hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2214             hwc1Layer.flags |= HWC_SKIP_LAYER;
   2215             break;
   2216         case Composition::Cursor:
   2217             hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2218             if (mDisplay.getDevice().getHwc1MinorVersion() >= 4) {
   2219                 hwc1Layer.hints |= HWC_IS_CURSOR_LAYER;
   2220             }
   2221             break;
   2222         case Composition::Sideband:
   2223             if (mDisplay.getDevice().getHwc1MinorVersion() < 4) {
   2224                 hwc1Layer.compositionType = HWC_SIDEBAND;
   2225             } else {
   2226                 hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2227                 hwc1Layer.flags |= HWC_SKIP_LAYER;
   2228             }
   2229             break;
   2230         default:
   2231             hwc1Layer.compositionType = HWC_FRAMEBUFFER;
   2232             hwc1Layer.flags |= HWC_SKIP_LAYER;
   2233             break;
   2234     }
   2235     ALOGV("Layer %" PRIu64 " %s set to %d", mId,
   2236             to_string(mCompositionType).c_str(),
   2237             hwc1Layer.compositionType);
   2238     ALOGV_IF(hwc1Layer.flags & HWC_SKIP_LAYER, "    and skipping");
   2239 }
   2240 
   2241 // Adapter helpers
   2242 
   2243 void HWC2On1Adapter::populateCapabilities() {
   2244     if (mHwc1MinorVersion >= 3U) {
   2245         int supportedTypes = 0;
   2246         auto result = mHwc1Device->query(mHwc1Device,
   2247                 HWC_DISPLAY_TYPES_SUPPORTED, &supportedTypes);
   2248         if ((result == 0) && ((supportedTypes & HWC_DISPLAY_VIRTUAL_BIT) != 0)) {
   2249             ALOGI("Found support for HWC virtual displays");
   2250             mHwc1SupportsVirtualDisplays = true;
   2251         }
   2252     }
   2253     if (mHwc1MinorVersion >= 4U) {
   2254         mCapabilities.insert(Capability::SidebandStream);
   2255     }
   2256 
   2257     // Check for HWC background color layer support.
   2258     if (mHwc1MinorVersion >= 1U) {
   2259         int backgroundColorSupported = 0;
   2260         auto result = mHwc1Device->query(mHwc1Device,
   2261                                          HWC_BACKGROUND_LAYER_SUPPORTED,
   2262                                          &backgroundColorSupported);
   2263         if ((result == 0) && (backgroundColorSupported == 1)) {
   2264             ALOGV("Found support for HWC background color");
   2265             mHwc1SupportsBackgroundColor = true;
   2266         }
   2267     }
   2268 
   2269     // Some devices might have HWC1 retire fences that accurately emulate
   2270     // HWC2 present fences when they are deferred, but it's not very reliable.
   2271     // To be safe, we indicate PresentFenceIsNotReliable for all HWC1 devices.
   2272     mCapabilities.insert(Capability::PresentFenceIsNotReliable);
   2273 }
   2274 
   2275 HWC2On1Adapter::Display* HWC2On1Adapter::getDisplay(hwc2_display_t id) {
   2276     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2277 
   2278     auto display = mDisplays.find(id);
   2279     if (display == mDisplays.end()) {
   2280         return nullptr;
   2281     }
   2282 
   2283     return display->second.get();
   2284 }
   2285 
   2286 std::tuple<HWC2On1Adapter::Layer*, Error> HWC2On1Adapter::getLayer(
   2287         hwc2_display_t displayId, hwc2_layer_t layerId) {
   2288     auto display = getDisplay(displayId);
   2289     if (!display) {
   2290         return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadDisplay);
   2291     }
   2292 
   2293     auto layerEntry = mLayers.find(layerId);
   2294     if (layerEntry == mLayers.end()) {
   2295         return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadLayer);
   2296     }
   2297 
   2298     auto layer = layerEntry->second;
   2299     if (layer->getDisplay().getId() != displayId) {
   2300         return std::make_tuple(static_cast<Layer*>(nullptr), Error::BadLayer);
   2301     }
   2302     return std::make_tuple(layer.get(), Error::None);
   2303 }
   2304 
   2305 void HWC2On1Adapter::populatePrimary() {
   2306     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2307 
   2308     auto display = std::make_shared<Display>(*this, HWC2::DisplayType::Physical);
   2309     mHwc1DisplayMap[HWC_DISPLAY_PRIMARY] = display->getId();
   2310     display->setHwc1Id(HWC_DISPLAY_PRIMARY);
   2311     display->populateConfigs();
   2312     mDisplays.emplace(display->getId(), std::move(display));
   2313 }
   2314 
   2315 bool HWC2On1Adapter::prepareAllDisplays() {
   2316     ATRACE_CALL();
   2317 
   2318     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2319 
   2320     for (const auto& displayPair : mDisplays) {
   2321         auto& display = displayPair.second;
   2322         if (!display->prepare()) {
   2323             return false;
   2324         }
   2325     }
   2326 
   2327     if (mHwc1DisplayMap.count(HWC_DISPLAY_PRIMARY) == 0) {
   2328         ALOGE("prepareAllDisplays: Unable to find primary HWC1 display");
   2329         return false;
   2330     }
   2331 
   2332     // Build an array of hwc_display_contents_1 to call prepare() on HWC1.
   2333     mHwc1Contents.clear();
   2334 
   2335     // Always push the primary display
   2336     auto primaryDisplayId = mHwc1DisplayMap[HWC_DISPLAY_PRIMARY];
   2337     auto& primaryDisplay = mDisplays[primaryDisplayId];
   2338     mHwc1Contents.push_back(primaryDisplay->getDisplayContents());
   2339 
   2340     // Push the external display, if present
   2341     if (mHwc1DisplayMap.count(HWC_DISPLAY_EXTERNAL) != 0) {
   2342         auto externalDisplayId = mHwc1DisplayMap[HWC_DISPLAY_EXTERNAL];
   2343         auto& externalDisplay = mDisplays[externalDisplayId];
   2344         mHwc1Contents.push_back(externalDisplay->getDisplayContents());
   2345     } else {
   2346         // Even if an external display isn't present, we still need to send
   2347         // at least two displays down to HWC1
   2348         mHwc1Contents.push_back(nullptr);
   2349     }
   2350 
   2351     // Push the hardware virtual display, if supported and present
   2352     if (mHwc1MinorVersion >= 3) {
   2353         if (mHwc1DisplayMap.count(HWC_DISPLAY_VIRTUAL) != 0) {
   2354             auto virtualDisplayId = mHwc1DisplayMap[HWC_DISPLAY_VIRTUAL];
   2355             auto& virtualDisplay = mDisplays[virtualDisplayId];
   2356             mHwc1Contents.push_back(virtualDisplay->getDisplayContents());
   2357         } else {
   2358             mHwc1Contents.push_back(nullptr);
   2359         }
   2360     }
   2361 
   2362     for (auto& displayContents : mHwc1Contents) {
   2363         if (!displayContents) {
   2364             continue;
   2365         }
   2366 
   2367         ALOGV("Display %zd layers:", mHwc1Contents.size() - 1);
   2368         for (size_t l = 0; l < displayContents->numHwLayers; ++l) {
   2369             auto& layer = displayContents->hwLayers[l];
   2370             ALOGV("  %zd: %d", l, layer.compositionType);
   2371         }
   2372     }
   2373 
   2374     ALOGV("Calling HWC1 prepare");
   2375     {
   2376         ATRACE_NAME("HWC1 prepare");
   2377         mHwc1Device->prepare(mHwc1Device, mHwc1Contents.size(),
   2378                 mHwc1Contents.data());
   2379     }
   2380 
   2381     for (size_t c = 0; c < mHwc1Contents.size(); ++c) {
   2382         auto& contents = mHwc1Contents[c];
   2383         if (!contents) {
   2384             continue;
   2385         }
   2386         ALOGV("Display %zd layers:", c);
   2387         for (size_t l = 0; l < contents->numHwLayers; ++l) {
   2388             ALOGV("  %zd: %d", l, contents->hwLayers[l].compositionType);
   2389         }
   2390     }
   2391 
   2392     // Return the received contents to their respective displays
   2393     for (size_t hwc1Id = 0; hwc1Id < mHwc1Contents.size(); ++hwc1Id) {
   2394         if (mHwc1Contents[hwc1Id] == nullptr) {
   2395             continue;
   2396         }
   2397 
   2398         auto displayId = mHwc1DisplayMap[hwc1Id];
   2399         auto& display = mDisplays[displayId];
   2400         display->generateChanges();
   2401     }
   2402 
   2403     return true;
   2404 }
   2405 
   2406 void dumpHWC1Message(hwc_composer_device_1* device, size_t numDisplays,
   2407                      hwc_display_contents_1_t** displays) {
   2408     ALOGV("*****************************");
   2409     size_t displayId = 0;
   2410     while (displayId < numDisplays) {
   2411         hwc_display_contents_1_t* display = displays[displayId];
   2412 
   2413         ALOGV("hwc_display_contents_1_t[%zu] @0x%p", displayId, display);
   2414         if (display == nullptr) {
   2415             displayId++;
   2416             continue;
   2417         }
   2418         ALOGV("  retirefd:0x%08x", display->retireFenceFd);
   2419         ALOGV("  outbuf  :0x%p", display->outbuf);
   2420         ALOGV("  outbuffd:0x%08x", display->outbufAcquireFenceFd);
   2421         ALOGV("  flags   :0x%08x", display->flags);
   2422         for(size_t layerId=0 ; layerId < display->numHwLayers ; layerId++) {
   2423             hwc_layer_1_t& layer = display->hwLayers[layerId];
   2424             ALOGV("    Layer[%zu]:", layerId);
   2425             ALOGV("      composition        : 0x%08x", layer.compositionType);
   2426             ALOGV("      hints              : 0x%08x", layer.hints);
   2427             ALOGV("      flags              : 0x%08x", layer.flags);
   2428             ALOGV("      handle             : 0x%p", layer.handle);
   2429             ALOGV("      transform          : 0x%08x", layer.transform);
   2430             ALOGV("      blending           : 0x%08x", layer.blending);
   2431             ALOGV("      sourceCropf        : %f, %f, %f, %f",
   2432                   layer.sourceCropf.left,
   2433                   layer.sourceCropf.top,
   2434                   layer.sourceCropf.right,
   2435                   layer.sourceCropf.bottom);
   2436             ALOGV("      displayFrame       : %d, %d, %d, %d",
   2437                   layer.displayFrame.left,
   2438                   layer.displayFrame.left,
   2439                   layer.displayFrame.left,
   2440                   layer.displayFrame.left);
   2441             hwc_region_t& visReg = layer.visibleRegionScreen;
   2442             ALOGV("      visibleRegionScreen: #0x%08zx[@0x%p]",
   2443                   visReg.numRects,
   2444                   visReg.rects);
   2445             for (size_t visRegId=0; visRegId < visReg.numRects ; visRegId++) {
   2446                 if (layer.visibleRegionScreen.rects == nullptr) {
   2447                     ALOGV("        null");
   2448                 } else {
   2449                     ALOGV("        visibleRegionScreen[%zu] %d, %d, %d, %d",
   2450                           visRegId,
   2451                           visReg.rects[visRegId].left,
   2452                           visReg.rects[visRegId].top,
   2453                           visReg.rects[visRegId].right,
   2454                           visReg.rects[visRegId].bottom);
   2455                 }
   2456             }
   2457             ALOGV("      acquireFenceFd     : 0x%08x", layer.acquireFenceFd);
   2458             ALOGV("      releaseFenceFd     : 0x%08x", layer.releaseFenceFd);
   2459             ALOGV("      planeAlpha         : 0x%08x", layer.planeAlpha);
   2460             if (getMinorVersion(device) < 5)
   2461                continue;
   2462             ALOGV("      surfaceDamage      : #0x%08zx[@0x%p]",
   2463                   layer.surfaceDamage.numRects,
   2464                   layer.surfaceDamage.rects);
   2465             for (size_t sdId=0; sdId < layer.surfaceDamage.numRects ; sdId++) {
   2466                 if (layer.surfaceDamage.rects == nullptr) {
   2467                     ALOGV("      null");
   2468                 } else {
   2469                     ALOGV("      surfaceDamage[%zu] %d, %d, %d, %d",
   2470                           sdId,
   2471                           layer.surfaceDamage.rects[sdId].left,
   2472                           layer.surfaceDamage.rects[sdId].top,
   2473                           layer.surfaceDamage.rects[sdId].right,
   2474                           layer.surfaceDamage.rects[sdId].bottom);
   2475                 }
   2476             }
   2477         }
   2478         displayId++;
   2479     }
   2480     ALOGV("-----------------------------");
   2481 }
   2482 
   2483 Error HWC2On1Adapter::setAllDisplays() {
   2484     ATRACE_CALL();
   2485 
   2486     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2487 
   2488     // Make sure we're ready to validate
   2489     for (size_t hwc1Id = 0; hwc1Id < mHwc1Contents.size(); ++hwc1Id) {
   2490         if (mHwc1Contents[hwc1Id] == nullptr) {
   2491             continue;
   2492         }
   2493 
   2494         auto displayId = mHwc1DisplayMap[hwc1Id];
   2495         auto& display = mDisplays[displayId];
   2496         Error error = display->set(*mHwc1Contents[hwc1Id]);
   2497         if (error != Error::None) {
   2498             ALOGE("setAllDisplays: Failed to set display %zd: %s", hwc1Id,
   2499                     to_string(error).c_str());
   2500             return error;
   2501         }
   2502     }
   2503 
   2504     ALOGV("Calling HWC1 set");
   2505     {
   2506         ATRACE_NAME("HWC1 set");
   2507         //dumpHWC1Message(mHwc1Device, mHwc1Contents.size(), mHwc1Contents.data());
   2508         mHwc1Device->set(mHwc1Device, mHwc1Contents.size(),
   2509                 mHwc1Contents.data());
   2510     }
   2511 
   2512     // Add retire and release fences
   2513     for (size_t hwc1Id = 0; hwc1Id < mHwc1Contents.size(); ++hwc1Id) {
   2514         if (mHwc1Contents[hwc1Id] == nullptr) {
   2515             continue;
   2516         }
   2517 
   2518         auto displayId = mHwc1DisplayMap[hwc1Id];
   2519         auto& display = mDisplays[displayId];
   2520         auto retireFenceFd = mHwc1Contents[hwc1Id]->retireFenceFd;
   2521         ALOGV("setAllDisplays: Adding retire fence %d to display %zd",
   2522                 retireFenceFd, hwc1Id);
   2523         display->addRetireFence(mHwc1Contents[hwc1Id]->retireFenceFd);
   2524         display->addReleaseFences(*mHwc1Contents[hwc1Id]);
   2525     }
   2526 
   2527     return Error::None;
   2528 }
   2529 
   2530 void HWC2On1Adapter::hwc1Invalidate() {
   2531     ALOGV("Received hwc1Invalidate");
   2532 
   2533     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2534 
   2535     // If the HWC2-side callback hasn't been registered yet, buffer this until
   2536     // it is registered.
   2537     if (mCallbacks.count(Callback::Refresh) == 0) {
   2538         mHasPendingInvalidate = true;
   2539         return;
   2540     }
   2541 
   2542     const auto& callbackInfo = mCallbacks[Callback::Refresh];
   2543     std::vector<hwc2_display_t> displays;
   2544     for (const auto& displayPair : mDisplays) {
   2545         displays.emplace_back(displayPair.first);
   2546     }
   2547 
   2548     // Call back without the state lock held.
   2549     lock.unlock();
   2550 
   2551     auto refresh = reinterpret_cast<HWC2_PFN_REFRESH>(callbackInfo.pointer);
   2552     for (auto display : displays) {
   2553         refresh(callbackInfo.data, display);
   2554     }
   2555 }
   2556 
   2557 void HWC2On1Adapter::hwc1Vsync(int hwc1DisplayId, int64_t timestamp) {
   2558     ALOGV("Received hwc1Vsync(%d, %" PRId64 ")", hwc1DisplayId, timestamp);
   2559 
   2560     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2561 
   2562     // If the HWC2-side callback hasn't been registered yet, buffer this until
   2563     // it is registered.
   2564     if (mCallbacks.count(Callback::Vsync) == 0) {
   2565         mPendingVsyncs.emplace_back(hwc1DisplayId, timestamp);
   2566         return;
   2567     }
   2568 
   2569     if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
   2570         ALOGE("hwc1Vsync: Couldn't find display for HWC1 id %d", hwc1DisplayId);
   2571         return;
   2572     }
   2573 
   2574     const auto& callbackInfo = mCallbacks[Callback::Vsync];
   2575     auto displayId = mHwc1DisplayMap[hwc1DisplayId];
   2576 
   2577     // Call back without the state lock held.
   2578     lock.unlock();
   2579 
   2580     auto vsync = reinterpret_cast<HWC2_PFN_VSYNC>(callbackInfo.pointer);
   2581     vsync(callbackInfo.data, displayId, timestamp);
   2582 }
   2583 
   2584 void HWC2On1Adapter::hwc1Hotplug(int hwc1DisplayId, int connected) {
   2585     ALOGV("Received hwc1Hotplug(%d, %d)", hwc1DisplayId, connected);
   2586 
   2587     if (hwc1DisplayId != HWC_DISPLAY_EXTERNAL) {
   2588         ALOGE("hwc1Hotplug: Received hotplug for non-external display");
   2589         return;
   2590     }
   2591 
   2592     std::unique_lock<std::recursive_timed_mutex> lock(mStateMutex);
   2593 
   2594     // If the HWC2-side callback hasn't been registered yet, buffer this until
   2595     // it is registered
   2596     if (mCallbacks.count(Callback::Hotplug) == 0) {
   2597         mPendingHotplugs.emplace_back(hwc1DisplayId, connected);
   2598         return;
   2599     }
   2600 
   2601     hwc2_display_t displayId = UINT64_MAX;
   2602     if (mHwc1DisplayMap.count(hwc1DisplayId) == 0) {
   2603         if (connected == 0) {
   2604             ALOGW("hwc1Hotplug: Received disconnect for unconnected display");
   2605             return;
   2606         }
   2607 
   2608         // Create a new display on connect
   2609         auto display = std::make_shared<HWC2On1Adapter::Display>(*this,
   2610                 HWC2::DisplayType::Physical);
   2611         display->setHwc1Id(HWC_DISPLAY_EXTERNAL);
   2612         display->populateConfigs();
   2613         displayId = display->getId();
   2614         mHwc1DisplayMap[HWC_DISPLAY_EXTERNAL] = displayId;
   2615         mDisplays.emplace(displayId, std::move(display));
   2616     } else {
   2617         if (connected != 0) {
   2618             ALOGW("hwc1Hotplug: Received connect for previously connected "
   2619                     "display");
   2620             return;
   2621         }
   2622 
   2623         // Disconnect an existing display
   2624         displayId = mHwc1DisplayMap[hwc1DisplayId];
   2625         mHwc1DisplayMap.erase(HWC_DISPLAY_EXTERNAL);
   2626         mDisplays.erase(displayId);
   2627     }
   2628 
   2629     const auto& callbackInfo = mCallbacks[Callback::Hotplug];
   2630 
   2631     // Call back without the state lock held
   2632     lock.unlock();
   2633 
   2634     auto hotplug = reinterpret_cast<HWC2_PFN_HOTPLUG>(callbackInfo.pointer);
   2635     auto hwc2Connected = (connected == 0) ?
   2636             HWC2::Connection::Disconnected : HWC2::Connection::Connected;
   2637     hotplug(callbackInfo.data, displayId, static_cast<int32_t>(hwc2Connected));
   2638 }
   2639 } // namespace android
   2640