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