HWC2.cpp revision 9f26a9c8be6f00f55cbc30b93adf4895c6a093aa
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" 24651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 25651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include "FloatRect.h" 26651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 27651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza#include <ui/Fence.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; 76651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::FloatRect; 77651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer; 787d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities; 79651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect; 80651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region; 81651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp; 82651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 83651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 { 84651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 85651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods 86651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 87651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::Device(hwc2_device_t* device) 88651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mHwcDevice(device), 89651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateVirtualDisplay(nullptr), 90651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyVirtualDisplay(nullptr), 91651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDump(nullptr), 92651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetMaxVirtualDisplayCount(nullptr), 93651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRegisterCallback(nullptr), 94651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mAcceptDisplayChanges(nullptr), 95651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateLayer(nullptr), 96651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyLayer(nullptr), 97651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetActiveConfig(nullptr), 98651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetChangedCompositionTypes(nullptr), 99076ac670262e448c531e6db7727cfade325866caDan Stoza mGetColorModes(nullptr), 100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayAttribute(nullptr), 101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayConfigs(nullptr), 102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayName(nullptr), 103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayRequests(nullptr), 104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayType(nullptr), 105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDozeSupport(nullptr), 1067d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza mGetHdrCapabilities(nullptr), 107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetReleaseFences(nullptr), 108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPresentDisplay(nullptr), 109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetActiveConfig(nullptr), 110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetClientTarget(nullptr), 111076ac670262e448c531e6db7727cfade325866caDan Stoza mSetColorMode(nullptr), 1125df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetColorTransform(nullptr), 113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetOutputBuffer(nullptr), 114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetPowerMode(nullptr), 115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetVsyncEnabled(nullptr), 116651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mValidateDisplay(nullptr), 117651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetCursorPosition(nullptr), 118651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBuffer(nullptr), 119651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSurfaceDamage(nullptr), 120651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBlendMode(nullptr), 121651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerColor(nullptr), 122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerCompositionType(nullptr), 1235df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetLayerDataspace(nullptr), 124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerDisplayFrame(nullptr), 125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerPlaneAlpha(nullptr), 126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSidebandStream(nullptr), 127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSourceCrop(nullptr), 128651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerTransform(nullptr), 129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerVisibleRegion(nullptr), 130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerZOrder(nullptr), 131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCapabilities(), 132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays(), 133651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug(), 134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingHotplugs(), 135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh(), 136651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingRefreshes(), 137651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync(), 138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingVsyncs() 139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadCapabilities(); 141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadFunctionPointers(); 142651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallbacks(); 143651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 144651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 145651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDevice::~Device() 146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mHwcDevice == nullptr) { 148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 150651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 151651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto element : mDisplays) { 15238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza auto display = element.second.lock(); 15338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza if (!display) { 15438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza ALOGE("~Device: Found a display (%" PRId64 " that has already been" 15538628986f2bb3b392dd4b519aacb9354320e409fDan Stoza " destroyed", element.first); 15638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza continue; 15738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza } 158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 159651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza DisplayType displayType = HWC2::DisplayType::Invalid; 160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = display->getType(&displayType); 161651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 162651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("~Device: Failed to determine type of display %" PRIu64 163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ": %s (%d)", display->getId(), to_string(error).c_str(), 164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<int32_t>(error)); 165651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza continue; 166651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 167651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 168651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (displayType == HWC2::DisplayType::Physical) { 169651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = display->setVsyncEnabled(HWC2::Vsync::Disable); 170651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 171651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("~Device: Failed to disable vsync for display %" PRIu64 172651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ": %s (%d)", display->getId(), to_string(error).c_str(), 173651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<int32_t>(error)); 174651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 175651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 176651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 177651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 178651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_close(mHwcDevice); 179651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 180651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 181651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device 182651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 183651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const 184651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 185651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numBytes = 0; 186651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDump(mHwcDevice, &numBytes, nullptr); 187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 188651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<char> buffer(numBytes); 189651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDump(mHwcDevice, &numBytes, buffer.data()); 190651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 191651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return std::string(buffer.data(), buffer.size()); 192651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 193651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 194651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const 195651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 196651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return mGetMaxVirtualDisplayCount(mHwcDevice); 197651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 198651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 199651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height, 2005cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay) 201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Creating virtual display"); 203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t displayId = 0; 2055cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza int32_t intFormat = static_cast<int32_t>(*format); 206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, 2075cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza &intFormat, &displayId); 208651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 209651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Created virtual display"); 2145cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza *format = static_cast<android_pixel_format_t>(intFormat); 215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outDisplay = getDisplayById(displayId); 21638628986f2bb3b392dd4b519aacb9354320e409fDan Stoza if (!*outDisplay) { 21738628986f2bb3b392dd4b519aacb9354320e409fDan Stoza ALOGE("Failed to get display by id"); 21838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza return Error::BadDisplay; 21938628986f2bb3b392dd4b519aacb9354320e409fDan Stoza } 220651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza (*outDisplay)->setVirtual(); 221651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerHotplugCallback(HotplugCallback hotplug) 225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 226651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("registerHotplugCallback"); 227651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug = hotplug; 228651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto& pending : mPendingHotplugs) { 229651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto& display = pending.first; 230651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto connected = pending.second; 231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Sending pending hotplug(%" PRIu64 ", %s)", display->getId(), 232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(connected).c_str()); 233651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug(std::move(display), connected); 234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 236651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerRefreshCallback(RefreshCallback refresh) 238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 239651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh = refresh; 240651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto& pending : mPendingRefreshes) { 241651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh(std::move(pending)); 242651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 243651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 244651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 245651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerVsyncCallback(VsyncCallback vsync) 246651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 247651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync = vsync; 248651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto& pending : mPendingVsyncs) { 249651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto& display = pending.first; 250651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto timestamp = pending.second; 251651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync(std::move(display), timestamp); 252651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 253651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 254651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device callbacks 256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callHotplug(std::shared_ptr<Display> display, Connection connected) 258651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (connected == Connection::Connected) { 260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (!display->isConnected()) { 261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->loadConfigs(); 262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->setConnected(true); 263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->setConnected(false); 266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays.erase(display->getId()); 267651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mHotplug) { 270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHotplug(std::move(display), connected); 271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("callHotplug called, but no valid callback registered, storing"); 273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingHotplugs.emplace_back(std::move(display), connected); 274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callRefresh(std::shared_ptr<Display> display) 278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mRefresh) { 280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRefresh(std::move(display)); 281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("callRefresh called, but no valid callback registered, storing"); 283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingRefreshes.emplace_back(std::move(display)); 284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 287651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::callVsync(std::shared_ptr<Display> display, nsecs_t timestamp) 288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 289651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mVsync) { 290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsync(std::move(display), timestamp); 291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("callVsync called, but no valid callback registered, storing"); 293651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPendingVsyncs.emplace_back(std::move(display), timestamp); 294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 295651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 296651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 297651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods 298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 299651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Display> Device::getDisplayById(hwc2_display_t id) { 300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mDisplays.count(id) != 0) { 30138628986f2bb3b392dd4b519aacb9354320e409fDan Stoza auto strongDisplay = mDisplays[id].lock(); 30238628986f2bb3b392dd4b519aacb9354320e409fDan Stoza ALOGE_IF(!strongDisplay, "Display %" PRId64 " is in mDisplays but is no" 30338628986f2bb3b392dd4b519aacb9354320e409fDan Stoza " longer alive", id); 30438628986f2bb3b392dd4b519aacb9354320e409fDan Stoza return strongDisplay; 305651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 306651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 307651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = std::make_shared<Display>(*this, id); 308651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays.emplace(id, display); 309651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return display; 310651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 311651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 312651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods 313651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 314651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities() 315651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 316651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_assert(sizeof(Capability) == sizeof(int32_t), 317651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza "Capability size has changed"); 318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numCapabilities = 0; 319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, nullptr); 3209f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza std::vector<Capability> capabilities(numCapabilities); 3219f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza auto asInt = reinterpret_cast<int32_t*>(capabilities.data()); 322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHwcDevice->getCapabilities(mHwcDevice, &numCapabilities, asInt); 3239f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza for (auto capability : capabilities) { 3249f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza mCapabilities.emplace(capability); 3259f26a9c8be6f00f55cbc30b93adf4895c6a093aaDan Stoza } 326651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 32809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stozabool Device::hasCapability(HWC2::Capability capability) const 32909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza{ 33009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza return std::find(mCapabilities.cbegin(), mCapabilities.cend(), 33109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza capability) != mCapabilities.cend(); 33209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza} 33309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza 334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadFunctionPointers() 335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // For all of these early returns, we log an error message inside 337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // loadFunctionPointer specifying which function failed to load 338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Display function pointers 3407d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::CreateVirtualDisplay, 341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateVirtualDisplay)) return; 3427d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::DestroyVirtualDisplay, 343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyVirtualDisplay)) return; 3447d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::Dump, mDump)) return; 3457d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetMaxVirtualDisplayCount, 346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetMaxVirtualDisplayCount)) return; 3477d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::RegisterCallback, 348651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mRegisterCallback)) return; 349651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Device function pointers 3517d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::AcceptDisplayChanges, 352651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mAcceptDisplayChanges)) return; 3537d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::CreateLayer, 354651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCreateLayer)) return; 3557d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::DestroyLayer, 356651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDestroyLayer)) return; 3577d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetActiveConfig, 358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetActiveConfig)) return; 3597d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetChangedCompositionTypes, 360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetChangedCompositionTypes)) return; 361076ac670262e448c531e6db7727cfade325866caDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetColorModes, 362076ac670262e448c531e6db7727cfade325866caDan Stoza mGetColorModes)) return; 3637d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayAttribute, 364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayAttribute)) return; 3657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayConfigs, 366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayConfigs)) return; 3677d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayName, 368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayName)) return; 3697d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayRequests, 370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayRequests)) return; 3717d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDisplayType, 372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDisplayType)) return; 3737d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetDozeSupport, 374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetDozeSupport)) return; 3757d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetHdrCapabilities, 3767d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza mGetHdrCapabilities)) return; 3777d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::GetReleaseFences, 378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mGetReleaseFences)) return; 3797d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::PresentDisplay, 380651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mPresentDisplay)) return; 3817d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetActiveConfig, 382651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetActiveConfig)) return; 3837d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetClientTarget, 384651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetClientTarget)) return; 385076ac670262e448c531e6db7727cfade325866caDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetColorMode, 386076ac670262e448c531e6db7727cfade325866caDan Stoza mSetColorMode)) return; 3875df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetColorTransform, 3885df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetColorTransform)) return; 3897d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetOutputBuffer, 390651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetOutputBuffer)) return; 3917d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetPowerMode, 392651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetPowerMode)) return; 3937d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetVsyncEnabled, 394651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetVsyncEnabled)) return; 3957d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::ValidateDisplay, 396651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mValidateDisplay)) return; 397651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Layer function pointers 3997d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetCursorPosition, 400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetCursorPosition)) return; 4017d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerBuffer, 402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBuffer)) return; 4037d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerSurfaceDamage, 404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSurfaceDamage)) return; 4057d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerBlendMode, 406651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerBlendMode)) return; 4077d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerColor, 408651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerColor)) return; 4097d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerCompositionType, 410651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerCompositionType)) return; 4115df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerDataspace, 4125df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mSetLayerDataspace)) return; 4137d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerDisplayFrame, 414651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerDisplayFrame)) return; 4157d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerPlaneAlpha, 416651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerPlaneAlpha)) return; 41709e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza if (hasCapability(Capability::SidebandStream)) { 41809e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerSidebandStream, 41909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza mSetLayerSidebandStream)) return; 42009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza } 4217d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerSourceCrop, 422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerSourceCrop)) return; 4237d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerTransform, 424651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerTransform)) return; 4257d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerVisibleRegion, 426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerVisibleRegion)) return; 4277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (!loadFunctionPointer(FunctionDescriptor::SetLayerZOrder, 428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mSetLayerZOrder)) return; 429651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 431651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::registerCallbacks() 432651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 433651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallback<HWC2_PFN_HOTPLUG>(Callback::Hotplug, hotplug_hook); 434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallback<HWC2_PFN_REFRESH>(Callback::Refresh, refresh_hook); 435651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza registerCallback<HWC2_PFN_VSYNC>(Callback::Vsync, vsync_hook); 436651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 437651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 438651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 439651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Display 440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 441651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::destroyVirtualDisplay(hwc2_display_t display) 442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 443651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Destroying virtual display"); 444651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDestroyVirtualDisplay(mHwcDevice, display); 445651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 446651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64 ") failed:" 447651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " %s (%d)", display, to_string(error).c_str(), intError); 44838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza mDisplays.erase(display); 449651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 450651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 451651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods 452651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 453651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Display(Device& device, hwc2_display_t id) 454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDevice(device), 455651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id), 456651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mIsConnected(false), 457651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mIsVirtual(false) 458651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 459651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Created display %" PRIu64, id); 460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 461651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 462651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::~Display() 463651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 464651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Destroyed display %" PRIu64, mId); 465651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mIsVirtual) { 466651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDevice.destroyVirtualDisplay(mId); 467651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 468651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 469651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 470651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id) 471651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDisplay(display), 472651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id), 473651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mWidth(-1), 474651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHeight(-1), 475651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsyncPeriod(-1), 476651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDpiX(-1), 477651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDpiY(-1) {} 478651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 479651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id) 480651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mConfig(new Config(display, id)) {} 481651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 482651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() { 483651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Default density is based on TVs: 1080p displays get XHIGH density, lower- 484651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // resolution displays get TV density. Maybe eventually we'll need to update 485651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // it for 4k displays, though hopefully those will just report accurate DPI 486651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // information to begin with. This is also used for virtual displays and 487651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // older HWC implementations, so be careful about orientation. 488651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 489651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight); 490651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (longDimension >= 1080) { 491651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return ACONFIGURATION_DENSITY_XHIGH; 492651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 493651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return ACONFIGURATION_DENSITY_TV; 494651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 495651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 496651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 497651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display 498651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 499651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges() 500651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 501651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mAcceptDisplayChanges(mDevice.mHwcDevice, mId); 502651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 503651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 504651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 505651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::createLayer(std::shared_ptr<Layer>* outLayer) 506651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 507651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t layerId = 0; 508651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mCreateLayer(mDevice.mHwcDevice, mId, &layerId); 509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 510651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 511651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 512651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = std::make_shared<Layer>(shared_from_this(), layerId); 515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mLayers.emplace(layerId, layer); 516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outLayer = std::move(layer); 517651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 519651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 520651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig( 521651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Display::Config>* outConfig) const 522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 523651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] getActiveConfig", mId); 524651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t configId = 0; 525651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetActiveConfig(mDevice.mHwcDevice, mId, 526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &configId); 527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 529651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 530651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 531651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mConfigs.count(configId) != 0) { 534651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outConfig = mConfigs.at(configId); 535651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId, 537651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId); 538651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Return no error, but the caller needs to check for a null pointer to 539651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // detect this case 540651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outConfig = nullptr; 541651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 542651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 543651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 544651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 545651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 546651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes( 547651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, Composition>* outTypes) 548651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 549651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numElements = 0; 550651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice, 551651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, &numElements, nullptr, nullptr); 552651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 553651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 554651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 555651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 556651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 557651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_layer_t> layerIds(numElements); 558651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<int32_t> types(numElements); 559651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetChangedCompositionTypes(mDevice.mHwcDevice, mId, 560651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numElements, layerIds.data(), types.data()); 561651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 562651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 563651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 564651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 565651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 566651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->clear(); 567651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->reserve(numElements); 568651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 569651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 570651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 571651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto type = static_cast<Composition>(types[element]); 572651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s", 573651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layer->getId(), to_string(type).c_str()); 574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->emplace(layer, type); 575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 576651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found" 577651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " on display %" PRIu64, layerIds[element], mId); 578651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 579651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 580651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 581651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 582651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 584076ac670262e448c531e6db7727cfade325866caDan StozaError Display::getColorModes(std::vector<int32_t>* outModes) const 585076ac670262e448c531e6db7727cfade325866caDan Stoza{ 586076ac670262e448c531e6db7727cfade325866caDan Stoza uint32_t numModes = 0; 587076ac670262e448c531e6db7727cfade325866caDan Stoza int32_t intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId, 588076ac670262e448c531e6db7727cfade325866caDan Stoza &numModes, nullptr); 589076ac670262e448c531e6db7727cfade325866caDan Stoza auto error = static_cast<Error>(intError); 590076ac670262e448c531e6db7727cfade325866caDan Stoza if (error != Error::None) { 591076ac670262e448c531e6db7727cfade325866caDan Stoza return error; 592076ac670262e448c531e6db7727cfade325866caDan Stoza } 593076ac670262e448c531e6db7727cfade325866caDan Stoza 594076ac670262e448c531e6db7727cfade325866caDan Stoza std::vector<int32_t> modes(numModes); 595076ac670262e448c531e6db7727cfade325866caDan Stoza intError = mDevice.mGetColorModes(mDevice.mHwcDevice, mId, &numModes, 596076ac670262e448c531e6db7727cfade325866caDan Stoza modes.data()); 597076ac670262e448c531e6db7727cfade325866caDan Stoza error = static_cast<Error>(intError); 598076ac670262e448c531e6db7727cfade325866caDan Stoza if (error != Error::None) { 599076ac670262e448c531e6db7727cfade325866caDan Stoza return error; 600076ac670262e448c531e6db7727cfade325866caDan Stoza } 601076ac670262e448c531e6db7727cfade325866caDan Stoza 602076ac670262e448c531e6db7727cfade325866caDan Stoza std::swap(*outModes, modes); 603076ac670262e448c531e6db7727cfade325866caDan Stoza return Error::None; 604076ac670262e448c531e6db7727cfade325866caDan Stoza} 605076ac670262e448c531e6db7727cfade325866caDan Stoza 606651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const 607651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<const Config>> configs; 609651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (const auto& element : mConfigs) { 610651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configs.emplace_back(element.second); 611651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 612651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return configs; 613651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 614651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 615651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const 616651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 617651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t size; 618651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size, 619651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza nullptr); 620651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 621651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 622651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 623651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 624651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 625651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<char> rawName(size); 626651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetDisplayName(mDevice.mHwcDevice, mId, &size, 627651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rawName.data()); 628651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 629651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 630651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 631651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 632651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 633651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outName = std::string(rawName.cbegin(), rawName.cend()); 634651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 635651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 636651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 637651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests, 638651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, LayerRequest>* 639651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests) 640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intDisplayRequests = 0; 642651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numElements = 0; 643651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId, 644651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intDisplayRequests, &numElements, nullptr, nullptr); 645651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 646651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 647651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 648651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 649651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 650651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_layer_t> layerIds(numElements); 651651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<int32_t> layerRequests(numElements); 652651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetDisplayRequests(mDevice.mHwcDevice, mId, 653651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intDisplayRequests, &numElements, layerIds.data(), 654651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layerRequests.data()); 655651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 656651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 657651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 658651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests); 661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->clear(); 662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->reserve(numElements); 663651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 664651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layerRequest = 667651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<LayerRequest>(layerRequests[element]); 668651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->emplace(layer, layerRequest); 669651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 670651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getRequests: invalid layer %" PRIu64 " found on display %" 671651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza PRIu64, layerIds[element], mId); 672651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 673651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 674651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 675651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 677651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 678651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const 679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intType = 0; 681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayType(mDevice.mHwcDevice, mId, 682651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intType); 683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 684651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 685651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 686651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 687651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outType = static_cast<DisplayType>(intType); 689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 692651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const 693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intSupport = 0; 695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDozeSupport(mDevice.mHwcDevice, mId, 696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &intSupport); 697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 698651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 699651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 700651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 701651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outSupport = static_cast<bool>(intSupport); 702651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 703651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 704651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 7057d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities( 7067d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::unique_ptr<HdrCapabilities>* outCapabilities) const 7077d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{ 7087d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza uint32_t numTypes = 0; 7097d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float maxLuminance = -1.0f; 7107d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float maxAverageLuminance = -1.0f; 7117d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float minLuminance = -1.0f; 7127d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza int32_t intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, 7137d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza &numTypes, nullptr, &maxLuminance, &maxAverageLuminance, 7147d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza &minLuminance); 7157d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza auto error = static_cast<HWC2::Error>(intError); 7167d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (error != Error::None) { 7177d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return error; 7187d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza } 7197d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 7207d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::vector<int32_t> types(numTypes); 7217d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza intError = mDevice.mGetHdrCapabilities(mDevice.mHwcDevice, mId, &numTypes, 7227d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza types.data(), &maxLuminance, &maxAverageLuminance, &minLuminance); 7237d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza error = static_cast<HWC2::Error>(intError); 7247d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (error != Error::None) { 7257d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return error; 7267d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza } 7277d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 7287d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types), 7297d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza maxLuminance, maxAverageLuminance, minLuminance); 7307d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return Error::None; 7317d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza} 7327d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 733651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences( 734651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, sp<Fence>>* outFences) const 735651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 736651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numElements = 0; 737651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId, 738651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numElements, nullptr, nullptr); 739651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 740651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 741651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 742651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_layer_t> layerIds(numElements); 745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<int32_t> fenceFds(numElements); 746651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetReleaseFences(mDevice.mHwcDevice, mId, &numElements, 747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layerIds.data(), fenceFds.data()); 748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 750651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 751651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::unordered_map<std::shared_ptr<Layer>, sp<Fence>> releaseFences; 754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza releaseFences.reserve(numElements); 755651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza sp<Fence> fence(new Fence(fenceFds[element])); 759651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza releaseFences.emplace(std::move(layer), fence); 760651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 761651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getReleaseFences: invalid layer %" PRIu64 762651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " found on display %" PRIu64, layerIds[element], mId); 763651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::BadLayer; 764651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 766651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 767651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outFences = std::move(releaseFences); 768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 770651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 771651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::present(sp<Fence>* outRetireFence) 772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 773651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t retireFenceFd = 0; 774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mPresentDisplay(mDevice.mHwcDevice, mId, 775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &retireFenceFd); 776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 779651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 780651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 781651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outRetireFence = new Fence(retireFenceFd); 782651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 785651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config) 786651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 787651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (config->getDisplayId() != mId) { 788651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("setActiveConfig received config %u for the wrong display %" 789651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza PRIu64 " (expected %" PRIu64 ")", config->getId(), 790651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza config->getDisplayId(), mId); 791651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::BadConfig; 792651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 793651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetActiveConfig(mDevice.mHwcDevice, mId, 794651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza config->getId()); 795651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 796651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 797651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 798651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setClientTarget(buffer_handle_t target, 799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& acquireFence, android_dataspace_t dataspace) 800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 8015cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza // TODO: Properly encode client target surface damage 802651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = acquireFence->dup(); 803651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target, 8045cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza fenceFd, static_cast<int32_t>(dataspace), {0, nullptr}); 805651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 806651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 807651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 808076ac670262e448c531e6db7727cfade325866caDan StozaError Display::setColorMode(int32_t mode) 809076ac670262e448c531e6db7727cfade325866caDan Stoza{ 810076ac670262e448c531e6db7727cfade325866caDan Stoza int32_t intError = mDevice.mSetColorMode(mDevice.mHwcDevice, mId, mode); 811076ac670262e448c531e6db7727cfade325866caDan Stoza return static_cast<Error>(intError); 812076ac670262e448c531e6db7727cfade325866caDan Stoza} 813076ac670262e448c531e6db7727cfade325866caDan Stoza 8145df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix, 8155df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza android_color_transform_t hint) 8165df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{ 8175df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza int32_t intError = mDevice.mSetColorTransform(mDevice.mHwcDevice, mId, 8185df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza matrix.asArray(), static_cast<int32_t>(hint)); 8195df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza return static_cast<Error>(intError); 8205df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza} 8215df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza 822651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer, 823651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& releaseFence) 824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 825651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = releaseFence->dup(); 826651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto handle = buffer->getNativeBuffer()->handle; 827651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetOutputBuffer(mDevice.mHwcDevice, mId, handle, 828651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza fenceFd); 82938628986f2bb3b392dd4b519aacb9354320e409fDan Stoza close(fenceFd); 830651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 831651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 832651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 833651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode) 834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intMode = static_cast<int32_t>(mode); 836651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetPowerMode(mDevice.mHwcDevice, mId, intMode); 837651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 839651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 840651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled) 841651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 842651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intEnabled = static_cast<int32_t>(enabled); 843651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetVsyncEnabled(mDevice.mHwcDevice, mId, 844651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intEnabled); 845651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 846651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 847651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 848651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests) 849651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 850651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numTypes = 0; 851651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numRequests = 0; 852651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mValidateDisplay(mDevice.mHwcDevice, mId, 853651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numTypes, &numRequests); 854651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 855651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None && error != Error::HasChanges) { 856651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 857651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 858651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 859651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outNumTypes = numTypes; 860651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outNumRequests = numRequests; 861651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 862651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 863651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 864651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device 865651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 866651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute) 867651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 868651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t value = 0; 869651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayAttribute(mDevice.mHwcDevice, mId, 870651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId, static_cast<int32_t>(attribute), &value); 871651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 872651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 873651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId, 874651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId, to_string(attribute).c_str(), 875651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 876651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return -1; 877651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 878651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return value; 879651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 880651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 881651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId) 882651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 883651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId); 884651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 885651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto config = Config::Builder(*this, configId) 886651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setWidth(getAttribute(configId, Attribute::Width)) 887651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setHeight(getAttribute(configId, Attribute::Height)) 888651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod)) 889651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setDpiX(getAttribute(configId, Attribute::DpiX)) 890651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setDpiY(getAttribute(configId, Attribute::DpiY)) 891651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .build(); 892651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfigs.emplace(configId, std::move(config)); 893651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 894651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 895651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs() 896651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 897651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] loadConfigs", mId); 898651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 899651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numConfigs = 0; 900651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId, 901651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza &numConfigs, nullptr); 902651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 903651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 904651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getDisplayConfigs [1] failed: %s (%d)", mId, 905651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 906651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 907651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 908651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 909651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc2_config_t> configIds(numConfigs); 910651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mGetDisplayConfigs(mDevice.mHwcDevice, mId, &numConfigs, 911651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configIds.data()); 912651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 913651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 914651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId, 915651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 916651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 917651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 918651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 919651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto configId : configIds) { 920651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadConfig(configId); 921651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 922651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 923651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 924651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Layer 925651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 926651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::destroyLayer(hwc2_layer_t layerId) 927651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 928651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mDestroyLayer(mDevice.mHwcDevice, mId, layerId); 929651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 930651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")" 931651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " failed: %s (%d)", mId, layerId, to_string(error).c_str(), 932651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError); 933651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mLayers.erase(layerId); 934651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 935651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 936651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods 937651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 938651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::shared_ptr<Layer> Display::getLayerById(hwc2_layer_t id) const 939651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 940651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mLayers.count(id) == 0) { 941651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return nullptr; 942651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 943651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 944651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = mLayers.at(id).lock(); 945651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return layer; 946651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 947651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 948651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods 949651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 950651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::Layer(const std::shared_ptr<Display>& display, hwc2_layer_t id) 951651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDisplay(display), 952651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId(display->getId()), 953651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDevice(display->getDevice()), 954651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id) 955651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 956651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Created layer %" PRIu64 " on display %" PRIu64, id, 957651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->getId()); 958651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 959651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 960651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer() 961651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 962651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto display = mDisplay.lock(); 963651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (display) { 964651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza display->destroyLayer(mId); 965651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 966651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 967651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 968651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y) 969651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 970651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetCursorPosition(mDevice.mHwcDevice, 971651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, x, y); 972651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 973651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 974651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 975651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBuffer(buffer_handle_t buffer, 976651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& acquireFence) 977651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 978651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = acquireFence->dup(); 979651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerBuffer(mDevice.mHwcDevice, mDisplayId, 980651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, buffer, fenceFd); 981651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 982651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 983651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 984651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage) 985651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 986651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // We encode default full-screen damage as INVALID_RECT upstream, but as 0 987651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // rects for HWC 988651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = 0; 989651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) { 990651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice, 991651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, {0, nullptr}); 992651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 993651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza size_t rectCount = 0; 994651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto rectArray = damage.getArray(&rectCount); 995651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 996651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc_rect_t> hwcRects; 997651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (size_t rect = 0; rect < rectCount; ++rect) { 998651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRects.push_back({rectArray[rect].left, rectArray[rect].top, 999651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rectArray[rect].right, rectArray[rect].bottom}); 1000651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1001651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1002651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_region_t hwcRegion = {}; 1003651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.numRects = rectCount; 1004651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.rects = hwcRects.data(); 1005651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1006651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza intError = mDevice.mSetLayerSurfaceDamage(mDevice.mHwcDevice, 1007651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRegion); 1008651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1009651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1010651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1011651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1012651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1013651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode) 1014651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1015651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intMode = static_cast<int32_t>(mode); 1016651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerBlendMode(mDevice.mHwcDevice, 1017651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, intMode); 1018651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1019651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1020651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1021651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color) 1022651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1023651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerColor(mDevice.mHwcDevice, mDisplayId, 1024651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, color); 1025651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1026651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1027651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1028651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type) 1029651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1030651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intType = static_cast<int32_t>(type); 1031651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerCompositionType(mDevice.mHwcDevice, 1032651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, intType); 1033651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1034651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1035651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 10365df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace) 10375df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{ 10385df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza auto intDataspace = static_cast<int32_t>(dataspace); 10395df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza int32_t intError = mDevice.mSetLayerDataspace(mDevice.mHwcDevice, 10405df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza mDisplayId, mId, intDataspace); 10415df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza return static_cast<Error>(intError); 10425df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza} 10435df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza 1044651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame) 1045651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1046651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_rect_t hwcRect{frame.left, frame.top, frame.right, frame.bottom}; 1047651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerDisplayFrame(mDevice.mHwcDevice, 1048651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRect); 1049651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1050651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1051651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1052651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha) 1053651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1054651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerPlaneAlpha(mDevice.mHwcDevice, 1055651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, alpha); 1056651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1057651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1058651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1059651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream) 1060651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 106109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza if (!mDevice.hasCapability(Capability::SidebandStream)) { 106209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza ALOGE("Attempted to call setSidebandStream without checking that the " 106309e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza "device supports sideband streams"); 106409e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza return Error::Unsupported; 106509e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza } 1066651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerSidebandStream(mDevice.mHwcDevice, 1067651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, stream); 1068651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1069651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1070651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1071651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop) 1072651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1073651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_frect_t hwcRect{crop.left, crop.top, crop.right, crop.bottom}; 1074651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerSourceCrop(mDevice.mHwcDevice, 1075651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRect); 1076651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1077651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1078651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1079651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform) 1080651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1081651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto intTransform = static_cast<int32_t>(transform); 1082651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerTransform(mDevice.mHwcDevice, 1083651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, intTransform); 1084651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1085651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1086651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1087651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region) 1088651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1089651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza size_t rectCount = 0; 1090651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto rectArray = region.getArray(&rectCount); 1091651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1092651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<hwc_rect_t> hwcRects; 1093651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (size_t rect = 0; rect < rectCount; ++rect) { 1094651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRects.push_back({rectArray[rect].left, rectArray[rect].top, 1095651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rectArray[rect].right, rectArray[rect].bottom}); 1096651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 1097651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1098651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc_region_t hwcRegion = {}; 1099651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.numRects = rectCount; 1100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRegion.rects = hwcRects.data(); 1101651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1102651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerVisibleRegion(mDevice.mHwcDevice, 1103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplayId, mId, hwcRegion); 1104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1105651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1107651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z) 1108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 1109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t intError = mDevice.mSetLayerZOrder(mDevice.mHwcDevice, mDisplayId, 1110651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId, z); 1111651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 1112651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 1113651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 1114651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2 1115