HWC2.cpp revision 016d73c2d8f8fae544f09a6eebe827791f499470
1651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza/* 2651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Copyright 2015 The Android Open Source Project 3651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * 4651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * you may not use this file except in compliance with the License. 6651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * You may obtain a copy of the License at 7651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * 8651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * 10651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * Unless required by applicable law or agreed to in writing, software 11651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * See the License for the specific language governing permissions and 14651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza * limitations under the License. 15651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza */ 16651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 17651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// #define LOG_NDEBUG 0 18651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 19651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#undef LOG_TAG 20651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define LOG_TAG "HWC2" 21651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#define ATRACE_TAG ATRACE_TAG_GRAPHICS 22651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 23651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include "HWC2.h" 24aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#include "ComposerHal.h" 25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 26651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Fence.h> 275a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza#include <ui/FloatRect.h> 28651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/GraphicBuffer.h> 29651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Region.h> 30651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 31651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <android/configuration.h> 32651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 3309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza#include <algorithm> 34651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <inttypes.h> 35651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 36651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaextern "C" { 37651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static void hotplug_hook(hwc2_callback_data_t callbackData, 38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t displayId, int32_t intConnected) { 39651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto device = static_cast<HWC2::Device*>(callbackData); 40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = device->getDisplayById(displayId); 41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (display) { 42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto connected = static_cast<HWC2::Connection>(intConnected); 43651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza device->callHotplug(std::move(display), connected); 44651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("Hotplug callback called with unknown display %" PRIu64, 46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza displayId); 47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 48651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 49651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 50651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static void refresh_hook(hwc2_callback_data_t callbackData, 51651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t displayId) { 52651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto device = static_cast<HWC2::Device*>(callbackData); 53651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = device->getDisplayById(displayId); 54651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (display) { 55651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza device->callRefresh(std::move(display)); 56651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 57651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("Refresh callback called with unknown display %" PRIu64, 58651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza displayId); 59651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 60651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 61651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 62651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static void vsync_hook(hwc2_callback_data_t callbackData, 63651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t displayId, int64_t timestamp) { 64651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto device = static_cast<HWC2::Device*>(callbackData); 65651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = device->getDisplayById(displayId); 66651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (display) { 67651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza device->callVsync(std::move(display), timestamp); 68651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 69651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("Vsync callback called with unknown display %" PRIu64, 70651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza displayId); 71651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 72651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 73651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 74651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 75651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Fence; 765a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stozausing android::FloatRect; 77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer; 787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities; 79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect; 80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region; 81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp; 82aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Return; 83aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Void; 84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 { 86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 87aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace Hwc2 = android::Hwc2; 88aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods 90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 91aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 92651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::Device(hwc2_device_t* device) 93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mHwcDevice(device), 94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateVirtualDisplay(nullptr), 95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyVirtualDisplay(nullptr), 96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDump(nullptr), 97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetMaxVirtualDisplayCount(nullptr), 98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRegisterCallback(nullptr), 99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mAcceptDisplayChanges(nullptr), 100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateLayer(nullptr), 101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyLayer(nullptr), 102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetActiveConfig(nullptr), 103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetChangedCompositionTypes(nullptr), 104076ac670262e448c531e6db7727cfade325866caDan Stoza mGetColorModes(nullptr), 105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayAttribute(nullptr), 106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayConfigs(nullptr), 107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayName(nullptr), 108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayRequests(nullptr), 109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayType(nullptr), 110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDozeSupport(nullptr), 1117d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza mGetHdrCapabilities(nullptr), 112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetReleaseFences(nullptr), 113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPresentDisplay(nullptr), 114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetActiveConfig(nullptr), 115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetClientTarget(nullptr), 116076ac670262e448c531e6db7727cfade325866caDan Stoza mSetColorMode(nullptr), 1175df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetColorTransform(nullptr), 118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetOutputBuffer(nullptr), 119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetPowerMode(nullptr), 120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetVsyncEnabled(nullptr), 121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mValidateDisplay(nullptr), 122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetCursorPosition(nullptr), 123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBuffer(nullptr), 124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSurfaceDamage(nullptr), 125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBlendMode(nullptr), 126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerColor(nullptr), 127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerCompositionType(nullptr), 1285df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetLayerDataspace(nullptr), 129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerDisplayFrame(nullptr), 130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerPlaneAlpha(nullptr), 131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSidebandStream(nullptr), 132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSourceCrop(nullptr), 133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerTransform(nullptr), 134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerVisibleRegion(nullptr), 135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerZOrder(nullptr), 136aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 13787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik WagenaarDevice::Device(bool useVrComposer) 13887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar : mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)), 139aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif // BYPASS_IHWC 140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCapabilities(), 141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays(), 142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug(), 143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingHotplugs(), 144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh(), 145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingRefreshes(), 146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync(), 147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingVsyncs() 148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadCapabilities(); 150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadFunctionPointers(); 151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallbacks(); 152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 154651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::~Device() 155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 156aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mHwcDevice == nullptr) { 158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 160aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto element : mDisplays) { 16338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza auto display = element.second.lock(); 16438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza if (!display) { 16538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza ALOGE("~Device: Found a display (%" PRId64 " that has already been" 16638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza " destroyed", element.first); 16738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza continue; 16838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza } 169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza DisplayType displayType = HWC2::DisplayType::Invalid; 171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = display->getType(&displayType); 172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("~Device: Failed to determine type of display %" PRIu64 174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ": %s (%d)", display->getId(), to_string(error).c_str(), 175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<int32_t>(error)); 176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza continue; 177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (displayType == HWC2::DisplayType::Physical) { 180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = display->setVsyncEnabled(HWC2::Vsync::Disable); 181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("~Device: Failed to disable vsync for display %" PRIu64 183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ": %s (%d)", display->getId(), to_string(error).c_str(), 184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<int32_t>(error)); 185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 189aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_close(mHwcDevice); 191aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device 195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const 197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 198aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numBytes = 0; 200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDump(mHwcDevice, &numBytes, nullptr); 201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<char> buffer(numBytes); 203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDump(mHwcDevice, &numBytes, buffer.data()); 204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return std::string(buffer.data(), buffer.size()); 206aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 207aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return mComposer->dumpDebugInfo(); 208aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const 212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 213aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return mGetMaxVirtualDisplayCount(mHwcDevice); 215aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 216aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return mComposer->getMaxVirtualDisplayCount(); 217aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 219651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 220651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height, 2215cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay) 222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Creating virtual display"); 224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t displayId = 0; 226aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 2275cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza int32_t intFormat = static_cast<int32_t>(*format); 228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, 2295cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza &intFormat, &displayId); 230aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 231aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intFormat = static_cast<Hwc2::PixelFormat>(*format); 232aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mComposer->createVirtualDisplay(width, height, 23367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &intFormat, &displayId); 234aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Created virtual display"); 2415cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza *format = static_cast<android_pixel_format_t>(intFormat); 242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outDisplay = getDisplayById(displayId); 24338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza if (!*outDisplay) { 24438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza ALOGE("Failed to get display by id"); 24538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza return Error::BadDisplay; 24638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza } 247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza (*outDisplay)->setVirtual(); 248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerHotplugCallback(HotplugCallback hotplug) 252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("registerHotplugCallback"); 254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug = hotplug; 255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto& pending : mPendingHotplugs) { 256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto& display = pending.first; 257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto connected = pending.second; 258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Sending pending hotplug(%" PRIu64 ", %s)", display->getId(), 259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(connected).c_str()); 260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug(std::move(display), connected); 261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerRefreshCallback(RefreshCallback refresh) 265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh = refresh; 267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto& pending : mPendingRefreshes) { 268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh(std::move(pending)); 269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerVsyncCallback(VsyncCallback vsync) 273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync = vsync; 275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto& pending : mPendingVsyncs) { 276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto& display = pending.first; 277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto timestamp = pending.second; 278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync(std::move(display), timestamp); 279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device callbacks 283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callHotplug(std::shared_ptr<Display> display, Connection connected) 285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (connected == Connection::Connected) { 287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (!display->isConnected()) { 288cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu#ifndef BYPASS_IHWC 289cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mComposer->setClientTargetSlotCount(display->getId()); 290cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu#endif 291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->loadConfigs(); 292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->setConnected(true); 293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->setConnected(false); 296651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays.erase(display->getId()); 297651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mHotplug) { 300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug(std::move(display), connected); 301651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("callHotplug called, but no valid callback registered, storing"); 303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingHotplugs.emplace_back(std::move(display), connected); 304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callRefresh(std::shared_ptr<Display> display) 308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mRefresh) { 310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh(std::move(display)); 311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 312651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("callRefresh called, but no valid callback registered, storing"); 313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingRefreshes.emplace_back(std::move(display)); 314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callVsync(std::shared_ptr<Display> display, nsecs_t timestamp) 318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mVsync) { 320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync(std::move(display), timestamp); 321651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("callVsync called, but no valid callback registered, storing"); 323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingVsyncs.emplace_back(std::move(display), timestamp); 324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods 328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Display> Device::getDisplayById(hwc2_display_t id) { 330651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mDisplays.count(id) != 0) { 33138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza auto strongDisplay = mDisplays[id].lock(); 33238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza ALOGE_IF(!strongDisplay, "Display %" PRId64 " is in mDisplays but is no" 33338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza " longer alive", id); 33438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza return strongDisplay; 335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = std::make_shared<Display>(*this, id); 338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays.emplace(id, display); 339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return display; 340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods 343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities() 345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_assert(sizeof(Capability) == sizeof(int32_t), 347651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza "Capability size has changed"); 348aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numCapabilities = 0; 350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, nullptr); 3519f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza std::vector<Capability> capabilities(numCapabilities); 3529f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza auto asInt = reinterpret_cast<int32_t*>(capabilities.data()); 353651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, asInt); 3549f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza for (auto capability : capabilities) { 3559f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza mCapabilities.emplace(capability); 3569f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza } 357aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 358aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto capabilities = mComposer->getCapabilities(); 359aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu for (auto capability : capabilities) { 360aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mCapabilities.emplace(static_cast<Capability>(capability)); 361aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 362aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 36509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stozabool Device::hasCapability(HWC2::Capability capability) const 36609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza{ 36709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza return std::find(mCapabilities.cbegin(), mCapabilities.cend(), 36809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza capability) != mCapabilities.cend(); 36909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza} 37009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza 371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadFunctionPointers() 372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 373aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For all of these early returns, we log an error message inside 375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // loadFunctionPointer specifying which function failed to load 376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Display function pointers 3787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::CreateVirtualDisplay, 379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateVirtualDisplay)) return; 3807d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::DestroyVirtualDisplay, 381651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyVirtualDisplay)) return; 3827d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::Dump, mDump)) return; 3837d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetMaxVirtualDisplayCount, 384651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetMaxVirtualDisplayCount)) return; 3857d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::RegisterCallback, 386651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRegisterCallback)) return; 387651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 388651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Device function pointers 3897d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::AcceptDisplayChanges, 390651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mAcceptDisplayChanges)) return; 3917d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::CreateLayer, 392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateLayer)) return; 3937d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::DestroyLayer, 394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyLayer)) return; 3957d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetActiveConfig, 396651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetActiveConfig)) return; 3977d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetChangedCompositionTypes, 398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetChangedCompositionTypes)) return; 399076ac670262e448c531e6db7727cfade325866caDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetColorModes, 400076ac670262e448c531e6db7727cfade325866caDan Stoza mGetColorModes)) return; 4017d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayAttribute, 402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayAttribute)) return; 4037d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayConfigs, 404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayConfigs)) return; 4057d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayName, 406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayName)) return; 4077d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayRequests, 408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayRequests)) return; 4097d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayType, 410651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayType)) return; 4117d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDozeSupport, 412651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDozeSupport)) return; 4137d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetHdrCapabilities, 4147d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza mGetHdrCapabilities)) return; 4157d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetReleaseFences, 416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetReleaseFences)) return; 4177d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::PresentDisplay, 418651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPresentDisplay)) return; 4197d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetActiveConfig, 420651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetActiveConfig)) return; 4217d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetClientTarget, 422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetClientTarget)) return; 423076ac670262e448c531e6db7727cfade325866caDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetColorMode, 424076ac670262e448c531e6db7727cfade325866caDan Stoza mSetColorMode)) return; 4255df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetColorTransform, 4265df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetColorTransform)) return; 4277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer, 428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetOutputBuffer)) return; 4297d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetPowerMode, 430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetPowerMode)) return; 4317d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetVsyncEnabled, 432651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetVsyncEnabled)) return; 4337d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::ValidateDisplay, 434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mValidateDisplay)) return; 435651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 436651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Layer function pointers 4377d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetCursorPosition, 438651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetCursorPosition)) return; 4397d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerBuffer, 440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBuffer)) return; 4417d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerSurfaceDamage, 442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSurfaceDamage)) return; 4437d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerBlendMode, 444651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBlendMode)) return; 4457d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerColor, 446651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerColor)) return; 4477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType, 448651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerCompositionType)) return; 4495df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerDataspace, 4505df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetLayerDataspace)) return; 4517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame, 452651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerDisplayFrame)) return; 4537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha, 454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerPlaneAlpha)) return; 45509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza if (hasCapability(Capability::SidebandStream)) { 45609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerSidebandStream, 45709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza mSetLayerSidebandStream)) return; 45809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza } 4597d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerSourceCrop, 460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSourceCrop)) return; 4617d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerTransform, 462651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerTransform)) return; 4637d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerVisibleRegion, 464651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerVisibleRegion)) return; 4657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerZOrder, 466651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerZOrder)) return; 467aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif // BYPASS_IHWC 468651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 469651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 470aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace { 471aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuclass ComposerCallback : public Hwc2::IComposerCallback { 472aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wupublic: 473aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu ComposerCallback(Device* device) : mDevice(device) {} 474aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 475aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Return<void> onHotplug(Hwc2::Display display, 476aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Connection connected) override 477aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 478aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu hotplug_hook(mDevice, display, static_cast<int32_t>(connected)); 479aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return Void(); 480aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 481aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 482aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Return<void> onRefresh(Hwc2::Display display) override 483aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 484aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu refresh_hook(mDevice, display); 485aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return Void(); 486aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 487aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 488aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override 489aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 490aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu vsync_hook(mDevice, display, timestamp); 491aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return Void(); 492aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 493aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 494aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuprivate: 495aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Device* mDevice; 496aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu}; 497aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace anonymous 498aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 499651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerCallbacks() 500651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 501aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 502651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallback<HWC2_PFN_HOTPLUG>(Callback::Hotplug, hotplug_hook); 503651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallback<HWC2_PFN_REFRESH>(Callback::Refresh, refresh_hook); 504651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallback<HWC2_PFN_VSYNC>(Callback::Vsync, vsync_hook); 505aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 506aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu sp<ComposerCallback> callback = new ComposerCallback(this); 507aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mComposer->registerCallback(callback); 508aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 510651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 511651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 512651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Display 513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::destroyVirtualDisplay(hwc2_display_t display) 515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Destroying virtual display"); 517aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDestroyVirtualDisplay(mHwcDevice, display); 519aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 520aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mComposer->destroyVirtualDisplay(display); 521aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 523651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64 ") failed:" 524651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " %s (%d)", display, to_string(error).c_str(), intError); 52538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza mDisplays.erase(display); 526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods 529651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 530651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Display(Device& device, hwc2_display_t id) 531651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDevice(device), 532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id), 533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mIsConnected(false), 534016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes mIsVirtual(false), 535016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes mType(DisplayType::Invalid) 536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 537651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Created display %" PRIu64, id); 538016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes 539016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes#ifdef BYPASS_IHWC 540016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes int32_t intError = mDevice.mGetDisplayType(mDevice.mHwcDevice, mId, 541016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes reinterpret_cast<int32_t *>(&mType)); 542016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes#else 543016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes auto intError = mDevice.mComposer->getDisplayType(mId, 544016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes reinterpret_cast<Hwc2::IComposerClient::DisplayType *>(&mType)); 545016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes#endif 546016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes auto error = static_cast<Error>(intError); 547016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes if (error != Error::None) { 548016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes ALOGE("getDisplayType(%" PRIu64 ") failed: %s (%d)", 549016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes id, to_string(error).c_str(), intError); 550016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes } 551651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 552651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 553651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::~Display() 554651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 555651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Destroyed display %" PRIu64, mId); 556651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mIsVirtual) { 557651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDevice.destroyVirtualDisplay(mId); 558651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 559651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 560651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 561651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id) 562651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDisplay(display), 563651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id), 564651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mWidth(-1), 565651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHeight(-1), 566651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsyncPeriod(-1), 567651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDpiX(-1), 568651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDpiY(-1) {} 569651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 570651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id) 571651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mConfig(new Config(display, id)) {} 572651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 573651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() { 574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Default density is based on TVs: 1080p displays get XHIGH density, lower- 575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // resolution displays get TV density. Maybe eventually we'll need to update 576651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // it for 4k displays, though hopefully those will just report accurate DPI 577651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // information to begin with. This is also used for virtual displays and 578651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // older HWC implementations, so be careful about orientation. 579651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 580651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight); 581651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (longDimension >= 1080) { 582651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return ACONFIGURATION_DENSITY_XHIGH; 583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 584651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return ACONFIGURATION_DENSITY_TV; 585651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 586651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 587651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 588651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display 589651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 590651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges() 591651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 592aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 593651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mAcceptDisplayChanges(mDevice.mHwcDevice, mId); 594aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 595aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->acceptDisplayChanges(mId); 596aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 597651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 598651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 599651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 600651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::createLayer(std::shared_ptr<Layer>* outLayer) 601651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 602651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t layerId = 0; 603aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 604651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mCreateLayer(mDevice.mHwcDevice, mId, &layerId); 605aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 60667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->createLayer(mId, &layerId); 607aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 609651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 610651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 611651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 612651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 613651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = std::make_shared<Layer>(shared_from_this(), layerId); 614651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mLayers.emplace(layerId, layer); 615651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outLayer = std::move(layer); 616651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 617651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 618651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 619651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig( 620651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Display::Config>* outConfig) const 621651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 622651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] getActiveConfig", mId); 623651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t configId = 0; 624aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 625651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetActiveConfig(mDevice.mHwcDevice, mId, 626651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &configId); 627aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 62867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getActiveConfig(mId, &configId); 629aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 630651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 631651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 632651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 633b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard ALOGE("Unable to get active config for mId:[%" PRIu64 "]", mId); 634b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard *outConfig = nullptr; 635651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 636651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 637651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 638651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mConfigs.count(configId) != 0) { 639651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outConfig = mConfigs.at(configId); 640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId, 642651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId); 643651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Return no error, but the caller needs to check for a null pointer to 644651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // detect this case 645651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outConfig = nullptr; 646651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 647651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 648651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 649651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 650651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 651651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes( 652651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes) 653651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 654aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 655651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numElements = 0; 656651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice, 657651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, &numElements, nullptr, nullptr); 658651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 663651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_layer_t> layerIds(numElements); 664651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<int32_t> types(numElements); 665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice, mId, 666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numElements, layerIds.data(), types.data()); 667aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 668aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Layer> layerIds; 669cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Composition> types; 670aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->getChangedCompositionTypes(mId, 67167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &layerIds, &types); 672aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numElements = layerIds.size(); 673aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 674aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 675651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 677651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 678651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->clear(); 681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->reserve(numElements); 682651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 684651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 685651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto type = static_cast<Composition>(types[element]); 686651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s", 687651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layer->getId(), to_string(type).c_str()); 688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->emplace(layer, type); 689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found" 691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " on display %" PRIu64, layerIds[element], mId); 692651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 69828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::getColorModes(std::vector<android_color_mode_t>* outModes) const 699076ac670262e448c531e6db7727cfade325866caDan Stoza{ 700aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 701076ac670262e448c531e6db7727cfade325866caDan Stoza uint32_t numModes = 0; 702076ac670262e448c531e6db7727cfade325866caDan Stoza int32_t intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId, 703076ac670262e448c531e6db7727cfade325866caDan Stoza &numModes, nullptr); 704076ac670262e448c531e6db7727cfade325866caDan Stoza auto error = static_cast<Error>(intError); 705076ac670262e448c531e6db7727cfade325866caDan Stoza if (error != Error::None) { 706076ac670262e448c531e6db7727cfade325866caDan Stoza return error; 707076ac670262e448c531e6db7727cfade325866caDan Stoza } 708076ac670262e448c531e6db7727cfade325866caDan Stoza 709076ac670262e448c531e6db7727cfade325866caDan Stoza std::vector<int32_t> modes(numModes); 710076ac670262e448c531e6db7727cfade325866caDan Stoza intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId, &numModes, 711076ac670262e448c531e6db7727cfade325866caDan Stoza modes.data()); 712076ac670262e448c531e6db7727cfade325866caDan Stoza error = static_cast<Error>(intError); 713aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 714aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::ColorMode> modes; 71567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getColorModes(mId, &modes); 716aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numModes = modes.size(); 717aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 718aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 719076ac670262e448c531e6db7727cfade325866caDan Stoza if (error != Error::None) { 720076ac670262e448c531e6db7727cfade325866caDan Stoza return error; 721076ac670262e448c531e6db7727cfade325866caDan Stoza } 722076ac670262e448c531e6db7727cfade325866caDan Stoza 72328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outModes->resize(numModes); 72428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (size_t i = 0; i < numModes; i++) { 72528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright (*outModes)[i] = static_cast<android_color_mode_t>(modes[i]); 72628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 727076ac670262e448c531e6db7727cfade325866caDan Stoza return Error::None; 728076ac670262e448c531e6db7727cfade325866caDan Stoza} 729076ac670262e448c531e6db7727cfade325866caDan Stoza 730651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const 731651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 732651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<const Config>> configs; 733651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (const auto& element : mConfigs) { 734651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configs.emplace_back(element.second); 735651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 736651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return configs; 737651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 738651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 739651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const 740651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 741aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 742651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t size; 743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size, 744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza nullptr); 745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 746651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 750651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<char> rawName(size); 751651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size, 752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rawName.data()); 753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 755651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outName = std::string(rawName.cbegin(), rawName.cend()); 759651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 760aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 76167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getDisplayName(mId, outName); 762aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return static_cast<Error>(intError); 763aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 764651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 766651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests, 767651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, LayerRequest>* 768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests) 769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 770aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 771651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intDisplayRequests = 0; 772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numElements = 0; 773651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId, 774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intDisplayRequests, &numElements, nullptr, nullptr); 775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 779651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 780651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_layer_t> layerIds(numElements); 781651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<int32_t> layerRequests(numElements); 782651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId, 783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intDisplayRequests, &numElements, layerIds.data(), 784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layerRequests.data()); 785651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 786aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 787aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t intDisplayRequests; 788aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Layer> layerIds; 789aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<uint32_t> layerRequests; 790aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->getDisplayRequests(mId, 79167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &intDisplayRequests, &layerIds, &layerRequests); 792aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numElements = layerIds.size(); 793aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 794aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 795651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 796651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 797651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 798651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests); 800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->clear(); 801651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->reserve(numElements); 802651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 803651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 804651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 805651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layerRequest = 806651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<LayerRequest>(layerRequests[element]); 807651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->emplace(layer, layerRequest); 808651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 809651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getRequests: invalid layer %" PRIu64 " found on display %" 810651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza PRIu64, layerIds[element], mId); 811651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 812651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 813651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 814651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 815651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 816651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 817651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const 818651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 819016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes *outType = mType; 820651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 821651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 822651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 823651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const 824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 825aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 826651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intSupport = 0; 827651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDozeSupport(mDevice.mHwcDevice, mId, 828651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intSupport); 829aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 830aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu bool intSupport = false; 83167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getDozeSupport(mId, &intSupport); 832aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 833651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 836651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 837651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outSupport = static_cast<bool>(intSupport); 838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 839651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 840651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 8417d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities( 8427d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::unique_ptr<HdrCapabilities>* outCapabilities) const 8437d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{ 8447d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza uint32_t numTypes = 0; 8457d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float maxLuminance = -1.0f; 8467d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float maxAverageLuminance = -1.0f; 8477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float minLuminance = -1.0f; 848aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 8497d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza int32_t intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, 8507d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza &numTypes, nullptr, &maxLuminance, &maxAverageLuminance, 8517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza &minLuminance); 8527d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza auto error = static_cast<HWC2::Error>(intError); 8537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (error != Error::None) { 8547d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return error; 8557d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza } 8567d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 8577d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::vector<int32_t> types(numTypes); 8587d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, &numTypes, 8597d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza types.data(), &maxLuminance, &maxAverageLuminance, &minLuminance); 8607d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza error = static_cast<HWC2::Error>(intError); 861aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 862aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Hdr> intTypes; 86367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getHdrCapabilities(mId, &intTypes, 86467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &maxLuminance, &maxAverageLuminance, &minLuminance); 865aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<HWC2::Error>(intError); 866aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 867aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<int32_t> types; 868aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu for (auto type : intTypes) { 869aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu types.push_back(static_cast<int32_t>(type)); 870aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 871aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu numTypes = types.size(); 872aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 8737d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (error != Error::None) { 8747d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return error; 8757d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza } 8767d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 8777d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types), 8787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza maxLuminance, maxAverageLuminance, minLuminance); 8797d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return Error::None; 8807d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza} 8817d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 882651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences( 883651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, sp<Fence>>* outFences) const 884651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 885aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 886651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numElements = 0; 887651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId, 888651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numElements, nullptr, nullptr); 889651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 890651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 891651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 892651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 893651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 894651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_layer_t> layerIds(numElements); 895651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<int32_t> fenceFds(numElements); 896651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId, &numElements, 897651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layerIds.data(), fenceFds.data()); 898651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 899aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 900aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Layer> layerIds; 901aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<int> fenceFds; 902aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->getReleaseFences(mId, 90367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &layerIds, &fenceFds); 904aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 905aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numElements = layerIds.size(); 906aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 907651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 908651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 909651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 910651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 911651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, sp<Fence>> releaseFences; 912651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza releaseFences.reserve(numElements); 913651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 914651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 915651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 916651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza sp<Fence> fence(new Fence(fenceFds[element])); 917651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza releaseFences.emplace(std::move(layer), fence); 918651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 919651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getReleaseFences: invalid layer %" PRIu64 920651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " found on display %" PRIu64, layerIds[element], mId); 921651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::BadLayer; 922651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 923651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 924651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 925651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outFences = std::move(releaseFences); 926651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 927651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 928651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 92911d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien SanglardError Display::present(sp<Fence>* outPresentFence) 930651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 931847650b5d89a1667f78fa0fa67429377cd3bf37aNaseer Ahmed int32_t presentFenceFd = -1; 932aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 933651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mPresentDisplay(mDevice.mHwcDevice, mId, 93411d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard &presentFenceFd); 935aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 93667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->presentDisplay(mId, &presentFenceFd); 937aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 938651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 939651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 940651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 941651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 942651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 94311d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard *outPresentFence = new Fence(presentFenceFd); 944651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 945651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 946651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 947651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config) 948651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 949651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (config->getDisplayId() != mId) { 950651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("setActiveConfig received config %u for the wrong display %" 951651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza PRIu64 " (expected %" PRIu64 ")", config->getId(), 952651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza config->getDisplayId(), mId); 953651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::BadConfig; 954651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 955aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 956651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetActiveConfig(mDevice.mHwcDevice, mId, 957651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza config->getId()); 958aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 959aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setActiveConfig(mId, config->getId()); 960aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 961651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 962651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 963651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 96406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I WuError Display::setClientTarget(uint32_t slot, buffer_handle_t target, 965651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& acquireFence, android_dataspace_t dataspace) 966651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 9675cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza // TODO: Properly encode client target surface damage 968651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = acquireFence->dup(); 969aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 97006d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu (void) slot; 971651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target, 9725cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza fenceFd, static_cast<int32_t>(dataspace), {0, nullptr}); 973aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 97406d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu auto intError = mDevice.mComposer->setClientTarget(mId, slot, target, 97506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu fenceFd, static_cast<Hwc2::Dataspace>(dataspace), 976cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Rect>()); 977aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 978651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 979651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 980651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 98128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::setColorMode(android_color_mode_t mode) 982076ac670262e448c531e6db7727cfade325866caDan Stoza{ 983aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 984076ac670262e448c531e6db7727cfade325866caDan Stoza int32_t intError = mDevice.mSetColorMode(mDevice.mHwcDevice, mId, mode); 985aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 986aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setColorMode(mId, 987aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu static_cast<Hwc2::ColorMode>(mode)); 988aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 989076ac670262e448c531e6db7727cfade325866caDan Stoza return static_cast<Error>(intError); 990076ac670262e448c531e6db7727cfade325866caDan Stoza} 991076ac670262e448c531e6db7727cfade325866caDan Stoza 9925df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix, 9935df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza android_color_transform_t hint) 9945df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{ 995aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 9965df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza int32_t intError = mDevice.mSetColorTransform(mDevice.mHwcDevice, mId, 9975df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza matrix.asArray(), static_cast<int32_t>(hint)); 998aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 999aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setColorTransform(mId, 1000aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu matrix.asArray(), static_cast<Hwc2::ColorTransform>(hint)); 1001aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 10025df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza return static_cast<Error>(intError); 10035df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza} 10045df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza 1005651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer, 1006651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& releaseFence) 1007651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1008651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = releaseFence->dup(); 1009651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto handle = buffer->getNativeBuffer()->handle; 1010aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1011651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetOutputBuffer(mDevice.mHwcDevice, mId, handle, 1012651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza fenceFd); 1013aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1014aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setOutputBuffer(mId, handle, fenceFd); 1015aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 101638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza close(fenceFd); 1017651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1018651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1019651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1020651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode) 1021651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1022aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1023651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intMode = static_cast<int32_t>(mode); 1024651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetPowerMode(mDevice.mHwcDevice, mId, intMode); 1025aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1026cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode); 1027aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setPowerMode(mId, intMode); 1028aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1029651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1030651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1031651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1032651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled) 1033651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1034aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1035651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intEnabled = static_cast<int32_t>(enabled); 1036651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetVsyncEnabled(mDevice.mHwcDevice, mId, 1037651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intEnabled); 1038aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1039cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intEnabled = static_cast<Hwc2::IComposerClient::Vsync>(enabled); 1040aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setVsyncEnabled(mId, intEnabled); 1041aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1042651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1043651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1044651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1045651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests) 1046651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1047651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numTypes = 0; 1048651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numRequests = 0; 1049aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1050651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mValidateDisplay(mDevice.mHwcDevice, mId, 1051651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numTypes, &numRequests); 1052aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1053aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->validateDisplay(mId, 105467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &numTypes, &numRequests); 1055aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1056651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 1057651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None && error != Error::HasChanges) { 1058651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 1059651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1060651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1061651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outNumTypes = numTypes; 1062651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outNumRequests = numRequests; 1063651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 1064651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1065651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1066651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device 1067651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1068651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute) 1069651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1070651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t value = 0; 1071aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1072651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayAttribute(mDevice.mHwcDevice, mId, 1073651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId, static_cast<int32_t>(attribute), &value); 1074aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 107567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getDisplayAttribute(mId, configId, 107667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu static_cast<Hwc2::IComposerClient::Attribute>(attribute), 107767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &value); 1078aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1079651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 1080651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 1081651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId, 1082651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId, to_string(attribute).c_str(), 1083651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 1084651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return -1; 1085651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1086651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return value; 1087651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1088651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1089651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId) 1090651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1091651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId); 1092651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1093651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto config = Config::Builder(*this, configId) 1094651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setWidth(getAttribute(configId, Attribute::Width)) 1095651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setHeight(getAttribute(configId, Attribute::Height)) 1096651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod)) 1097651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setDpiX(getAttribute(configId, Attribute::DpiX)) 1098651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setDpiY(getAttribute(configId, Attribute::DpiY)) 1099651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .build(); 1100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfigs.emplace(configId, std::move(config)); 1101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs() 1104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] loadConfigs", mId); 1106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1107aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numConfigs = 0; 1109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId, 1110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numConfigs, nullptr); 1111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 1112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 1113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getDisplayConfigs [1] failed: %s (%d)", mId, 1114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 1115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 1116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_config_t> configIds(numConfigs); 1119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId, &numConfigs, 1120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configIds.data()); 1121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 1122aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1123aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Config> configIds; 112467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu auto intError = mDevice.mComposer->getDisplayConfigs(mId, &configIds); 1125aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 1126aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 1128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId, 1129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 1130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 1131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto configId : configIds) { 1134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadConfig(configId); 1135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Layer 1139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::destroyLayer(hwc2_layer_t layerId) 1141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1142aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mDestroyLayer(mDevice.mHwcDevice, mId, layerId); 1144aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1145aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError =mDevice.mComposer->destroyLayer(mId, layerId); 1146aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 1148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")" 1149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " failed: %s (%d)", mId, layerId, to_string(error).c_str(), 1150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError); 1151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mLayers.erase(layerId); 1152651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1153651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1154651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods 1155651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Layer> Display::getLayerById(hwc2_layer_t id) const 1157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mLayers.count(id) == 0) { 1159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return nullptr; 1160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = mLayers.at(id).lock(); 1163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return layer; 1164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods 1167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1168651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id) 1169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDisplay(display), 1170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId(display->getId()), 1171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDevice(display->getDevice()), 1172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id) 1173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Created layer %" PRIu64 " on display %" PRIu64, id, 1175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->getId()); 1176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1178651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer() 1179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = mDisplay.lock(); 1181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (display) { 1182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->destroyLayer(mId); 1183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1186651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y) 1187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1188aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetCursorPosition(mDevice.mHwcDevice, 1190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, x, y); 1191aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1192aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setCursorPosition(mDisplayId, 1193aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, x, y); 1194aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 119806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I WuError Layer::setBuffer(uint32_t slot, buffer_handle_t buffer, 1199651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& acquireFence) 1200651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = acquireFence->dup(); 1202aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 120306d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu (void) slot; 1204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerBuffer(mDevice.mHwcDevice, mDisplayId, 1205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, buffer, fenceFd); 1206aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1207aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerBuffer(mDisplayId, 120806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mId, slot, buffer, fenceFd); 1209aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1213651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage) 1214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // We encode default full-screen damage as INVALID_RECT upstream, but as 0 1216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // rects for HWC 1217aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1218651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = 0; 1219aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1220aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Hwc2::Error intError = Hwc2::Error::NONE; 1221aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) { 1223aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice, 1225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, {0, nullptr}); 1226aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1227aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu intError = mDevice.mComposer->setLayerSurfaceDamage(mDisplayId, 1228cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mId, std::vector<Hwc2::IComposerClient::Rect>()); 1229aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 1231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza size_t rectCount = 0; 1232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto rectArray = damage.getArray(&rectCount); 1233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1234aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc_rect_t> hwcRects; 1236aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1237cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Rect> hwcRects; 1238aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (size_t rect = 0; rect < rectCount; ++rect) { 1240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRects.push_back({rectArray[rect].left, rectArray[rect].top, 1241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rectArray[rect].right, rectArray[rect].bottom}); 1242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1244aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_region_t hwcRegion = {}; 1246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.numRects = rectCount; 1247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.rects = hwcRects.data(); 1248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice, 1250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRegion); 1251aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1252aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu intError = mDevice.mComposer->setLayerSurfaceDamage(mDisplayId, 1253aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, hwcRects); 1254aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1260651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode) 1261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1262aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intMode = static_cast<int32_t>(mode); 1264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerBlendMode(mDevice.mHwcDevice, 1265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, intMode); 1266aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1267cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intMode = static_cast<Hwc2::IComposerClient::BlendMode>(mode); 1268aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerBlendMode(mDisplayId, 1269aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, intMode); 1270aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1274651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color) 1275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1276aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerColor(mDevice.mHwcDevice, mDisplayId, 1278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, color); 1279aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1280cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Hwc2::IComposerClient::Color hwcColor{color.r, color.g, color.b, color.a}; 1281aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerColor(mDisplayId, 1282aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, hwcColor); 1283aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1287651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type) 1288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1289aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intType = static_cast<int32_t>(type); 1291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerCompositionType(mDevice.mHwcDevice, 1292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, intType); 1293aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1294cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intType = static_cast<Hwc2::IComposerClient::Composition>(type); 1295aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerCompositionType(mDisplayId, 1296aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, intType); 1297aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 13015df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace) 13025df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{ 1303aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 13045df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza auto intDataspace = static_cast<int32_t>(dataspace); 13055df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza int32_t intError = mDevice.mSetLayerDataspace(mDevice.mHwcDevice, 13065df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mDisplayId, mId, intDataspace); 1307aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1308aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intDataspace = static_cast<Hwc2::Dataspace>(dataspace); 1309aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerDataspace(mDisplayId, 1310aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, intDataspace); 1311aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 13125df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza return static_cast<Error>(intError); 13135df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza} 13145df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza 1315651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame) 1316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1317aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_rect_t hwcRect{frame.left, frame.top, frame.right, frame.bottom}; 1319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerDisplayFrame(mDevice.mHwcDevice, 1320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRect); 1321aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1322cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Hwc2::IComposerClient::Rect hwcRect{frame.left, frame.top, 1323aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu frame.right, frame.bottom}; 1324aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerDisplayFrame(mDisplayId, 1325aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, hwcRect); 1326aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1330651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha) 1331651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1332aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerPlaneAlpha(mDevice.mHwcDevice, 1334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, alpha); 1335aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1336aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerPlaneAlpha(mDisplayId, 1337aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, alpha); 1338aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1342651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream) 1343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 134409e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza if (!mDevice.hasCapability(Capability::SidebandStream)) { 134509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza ALOGE("Attempted to call setSidebandStream without checking that the " 134609e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza "device supports sideband streams"); 134709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza return Error::Unsupported; 134809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza } 1349aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerSidebandStream(mDevice.mHwcDevice, 1351651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, stream); 1352aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1353aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerSidebandStream(mDisplayId, 1354aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, stream); 1355aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1359651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop) 1360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1361aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_frect_t hwcRect{crop.left, crop.top, crop.right, crop.bottom}; 1363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerSourceCrop(mDevice.mHwcDevice, 1364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRect); 1365aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1366cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Hwc2::IComposerClient::FRect hwcRect{ 1367aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu crop.left, crop.top, crop.right, crop.bottom}; 1368aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerSourceCrop(mDisplayId, 1369aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, hwcRect); 1370aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1374651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform) 1375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1376aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intTransform = static_cast<int32_t>(transform); 1378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerTransform(mDevice.mHwcDevice, 1379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, intTransform); 1380aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1381aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intTransform = static_cast<Hwc2::Transform>(transform); 1382aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerTransform(mDisplayId, 1383aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, intTransform); 1384aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1385651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1386651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1387651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1388651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region) 1389651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1390651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza size_t rectCount = 0; 1391651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto rectArray = region.getArray(&rectCount); 1392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1393aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc_rect_t> hwcRects; 1395aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1396cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Rect> hwcRects; 1397aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (size_t rect = 0; rect < rectCount; ++rect) { 1399651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRects.push_back({rectArray[rect].left, rectArray[rect].top, 1400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rectArray[rect].right, rectArray[rect].bottom}); 1401651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1403aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_region_t hwcRegion = {}; 1405651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.numRects = rectCount; 1406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.rects = hwcRects.data(); 1407651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerVisibleRegion(mDevice.mHwcDevice, 1409651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRegion); 1410aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1411aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerVisibleRegion(mDisplayId, 1412aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mId, hwcRects); 1413aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1414651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1415651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1417651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z) 1418651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1419aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#ifdef BYPASS_IHWC 1420651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerZOrder(mDevice.mHwcDevice, mDisplayId, 1421651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, z); 1422aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#else 1423aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mDevice.mComposer->setLayerZOrder(mDisplayId, mId, z); 1424aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#endif 1425651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1427651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 14282f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Layer::setInfo(uint32_t type, uint32_t appId) 14292f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{ 14302f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara#ifdef BYPASS_IHWC 14312f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara (void)type; 14322f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara (void)appId; 14332f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara int32_t intError = 0; 14342f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara#else 14352f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara auto intError = mDevice.mComposer->setLayerInfo(mDisplayId, mId, type, appId); 14362f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara#endif 14372f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara return static_cast<Error>(intError); 14382f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 14392f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2 1441