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 Stozausing android::Fence; 375a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stozausing android::FloatRect; 38651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::GraphicBuffer; 397d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stozausing android::HdrCapabilities; 40651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Rect; 41651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::Region; 42651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozausing android::sp; 43aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Return; 44aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing android::hardware::Void; 45651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 46651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozanamespace HWC2 { 47651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 48aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace Hwc2 = android::Hwc2; 49aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 50d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasnamespace { 51d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 52d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasclass ComposerCallbackBridge : public Hwc2::IComposerCallback { 53d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomaspublic: 54d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ComposerCallbackBridge(ComposerCallback* callback, int32_t sequenceId) 55d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas : mCallback(callback), mSequenceId(sequenceId), 56d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mHasPrimaryDisplay(false) {} 57d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 58d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas Return<void> onHotplug(Hwc2::Display display, 59d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas IComposerCallback::Connection conn) override 60d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas { 61d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas HWC2::Connection connection = static_cast<HWC2::Connection>(conn); 62d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (!mHasPrimaryDisplay) { 63d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas LOG_ALWAYS_FATAL_IF(connection != HWC2::Connection::Connected, 64d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas "Initial onHotplug callback should be " 65d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas "primary display connected"); 66d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mHasPrimaryDisplay = true; 67d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mCallback->onHotplugReceived(mSequenceId, display, 68d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas connection, true); 69d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } else { 70d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mCallback->onHotplugReceived(mSequenceId, display, 71d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas connection, false); 72d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 73d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return Void(); 74d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 75d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 76d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas Return<void> onRefresh(Hwc2::Display display) override 77d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas { 78d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mCallback->onRefreshReceived(mSequenceId, display); 79d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return Void(); 80d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 81d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 82d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override 83d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas { 84d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mCallback->onVsyncReceived(mSequenceId, display, timestamp); 85d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return Void(); 86d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 87d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 88d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas bool HasPrimaryDisplay() { return mHasPrimaryDisplay; } 89d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 90d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasprivate: 91d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ComposerCallback* mCallback; 92d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas int32_t mSequenceId; 93d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas bool mHasPrimaryDisplay; 94d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas}; 95d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 96d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas} // namespace anonymous 97d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 98d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 99651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device methods 100651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 10187670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik WagenaarDevice::Device(bool useVrComposer) 10287670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar : mComposer(std::make_unique<Hwc2::Composer>(useVrComposer)), 103651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mCapabilities(), 104651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDisplays(), 105d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mRegisteredCallback(false) 106651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 107651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadCapabilities(); 108651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 109651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 110d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Device::registerCallback(ComposerCallback* callback, int32_t sequenceId) { 111d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (mRegisteredCallback) { 112d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGW("Callback already registered. Ignored extra registration " 113d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas "attempt."); 114d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return; 115651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 116d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mRegisteredCallback = true; 117d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas sp<ComposerCallbackBridge> callbackBridge( 118d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas new ComposerCallbackBridge(callback, sequenceId)); 119d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mComposer->registerCallback(callbackBridge); 120d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas LOG_ALWAYS_FATAL_IF(!callbackBridge->HasPrimaryDisplay(), 121d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas "Registered composer callback but didn't get primary display"); 122651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 123651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 124651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 device 125651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 126651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::string Device::dump() const 127651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 128aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return mComposer->dumpDebugInfo(); 129651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 130651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 131651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozauint32_t Device::getMaxVirtualDisplayCount() const 132651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 133aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return mComposer->getMaxVirtualDisplayCount(); 134651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 135651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 136651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Device::createVirtualDisplay(uint32_t width, uint32_t height, 137d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas android_pixel_format_t* format, Display** outDisplay) 138651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 139651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGI("Creating virtual display"); 140651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 141651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_display_t displayId = 0; 142aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intFormat = static_cast<Hwc2::PixelFormat>(*format); 143aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intError = mComposer->createVirtualDisplay(width, height, 14467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &intFormat, &displayId); 145651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 146651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 147651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 148651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 149651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 150d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto display = std::make_unique<Display>( 151d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas *mComposer.get(), mCapabilities, displayId, DisplayType::Virtual); 152d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas *outDisplay = display.get(); 1535cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza *format = static_cast<android_pixel_format_t>(intFormat); 154d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mDisplays.emplace(displayId, std::move(display)); 155d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGI("Created virtual display"); 156651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 157651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 158651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 159d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Device::destroyDisplay(hwc2_display_t displayId) 160651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 161d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGI("Destroying display %" PRIu64, displayId); 162d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mDisplays.erase(displayId); 163651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 164651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 165d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Device::onHotplug(hwc2_display_t displayId, Connection connection) { 166d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (connection == Connection::Connected) { 167d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto display = getDisplayById(displayId); 168d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (display) { 169d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (display->isConnected()) { 170d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGW("Attempt to hotplug connect display %" PRIu64 171d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas " , which is already connected.", displayId); 172d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } else { 173d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas display->setConnected(true); 174d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 175d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } else { 176d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas DisplayType displayType; 177d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer->getDisplayType(displayId, 178d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas reinterpret_cast<Hwc2::IComposerClient::DisplayType *>( 179d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas &displayType)); 180d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto error = static_cast<Error>(intError); 181d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (error != Error::None) { 182d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGE("getDisplayType(%" PRIu64 ") failed: %s (%d). " 183d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas "Aborting hotplug attempt.", 184d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas displayId, to_string(error).c_str(), intError); 185d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return; 186d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 187651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 188d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto newDisplay = std::make_unique<Display>( 189d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas *mComposer.get(), mCapabilities, displayId, displayType); 190d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mDisplays.emplace(displayId, std::move(newDisplay)); 191d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 192d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } else if (connection == Connection::Disconnected) { 193d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas // The display will later be destroyed by a call to 194d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas // destroyDisplay(). For now we just mark it disconnected. 195d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto display = getDisplayById(displayId); 196d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (display) { 197d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas display->setConnected(false); 198d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } else { 199d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGW("Attempted to disconnect unknown display %" PRIu64, 200d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas displayId); 201651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 202651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 203651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 204651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 205651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Device methods 206651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 207d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasDisplay* Device::getDisplayById(hwc2_display_t id) { 208d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto iter = mDisplays.find(id); 209d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return iter == mDisplays.end() ? nullptr : iter->second.get(); 210651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 211651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 212651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Device initialization methods 213651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 214651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Device::loadCapabilities() 215651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 216651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_assert(sizeof(Capability) == sizeof(int32_t), 217651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza "Capability size has changed"); 218aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto capabilities = mComposer->getCapabilities(); 219aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu for (auto capability : capabilities) { 220aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mCapabilities.emplace(static_cast<Capability>(capability)); 221aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 222651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 223651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 224651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Display methods 225651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 226d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasDisplay::Display(android::Hwc2::Composer& composer, 227d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas const std::unordered_set<Capability>& capabilities, 228d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas hwc2_display_t id, DisplayType type) 229d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas : mComposer(composer), 230d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mCapabilities(capabilities), 231651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id), 232651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mIsConnected(false), 233d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mType(type) 234651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 235651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("Created display %" PRIu64, id); 236d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas setConnected(true); 237651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 238651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 239d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasDisplay::~Display() { 240d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mLayers.clear(); 241d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 242ceb67d1f8f61e15e2c752d15c4077e5194118d1cChris Forbes if (mType == DisplayType::Virtual) { 243d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGV("Destroying virtual display"); 244d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.destroyVirtualDisplay(mId); 245d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto error = static_cast<Error>(intError); 246d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGE_IF(error != Error::None, "destroyVirtualDisplay(%" PRIu64 247d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ") failed: %s (%d)", mId, to_string(error).c_str(), intError); 248d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } else if (mType == DisplayType::Physical) { 249d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto error = setVsyncEnabled(HWC2::Vsync::Disable); 250d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (error != Error::None) { 251d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGE("~Display: Failed to disable vsync for display %" PRIu64 252d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ": %s (%d)", mId, to_string(error).c_str(), 253d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas static_cast<int32_t>(error)); 254d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 255651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 256651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 257651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 258651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Config(Display& display, hwc2_config_t id) 259651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mDisplay(display), 260651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mId(id), 261651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mWidth(-1), 262651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mHeight(-1), 263651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mVsyncPeriod(-1), 264651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDpiX(-1), 265651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mDpiY(-1) {} 266651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 267651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaDisplay::Config::Builder::Builder(Display& display, hwc2_config_t id) 268651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza : mConfig(new Config(display, id)) {} 269651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 270651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozafloat Display::Config::Builder::getDefaultDensity() { 271651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Default density is based on TVs: 1080p displays get XHIGH density, lower- 272651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // resolution displays get TV density. Maybe eventually we'll need to update 273651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // it for 4k displays, though hopefully those will just report accurate DPI 274651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // information to begin with. This is also used for virtual displays and 275651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // older HWC implementations, so be careful about orientation. 276651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 277651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto longDimension = std::max(mConfig->mWidth, mConfig->mHeight); 278651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (longDimension >= 1080) { 279651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return ACONFIGURATION_DENSITY_XHIGH; 280651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 281651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return ACONFIGURATION_DENSITY_TV; 282651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 283651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 284651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 285651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Required by HWC2 display 286651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 287651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::acceptChanges() 288651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 289d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.acceptDisplayChanges(mId); 290651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 291651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 292651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 293d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasError Display::createLayer(Layer** outLayer) 294651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 295d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (!outLayer) { 296d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return Error::BadParameter; 297d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 298651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_layer_t layerId = 0; 299d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.createLayer(mId, &layerId); 300651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 301651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 302651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 303651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 304651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 305d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto layer = std::make_unique<Layer>( 306d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mComposer, mCapabilities, mId, layerId); 307d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas *outLayer = layer.get(); 308d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mLayers.emplace(layerId, std::move(layer)); 309d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return Error::None; 310d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas} 311d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 312d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasError Display::destroyLayer(Layer* layer) 313d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas{ 314d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (!layer) { 315d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return Error::BadParameter; 316d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 317d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mLayers.erase(layer->getId()); 318651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 319651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 320651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 321651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getActiveConfig( 322651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::shared_ptr<const Display::Config>* outConfig) const 323651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 324651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] getActiveConfig", mId); 325651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwc2_config_t configId = 0; 326d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getActiveConfig(mId, &configId); 327651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 328651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 329651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 330b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard ALOGE("Unable to get active config for mId:[%" PRIu64 "]", mId); 331b7432cc57cd957fb18f68d7976c5829b3a3a7751Fabien Sanglard *outConfig = nullptr; 332651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 333651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 334651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 335651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mConfigs.count(configId) != 0) { 336651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outConfig = mConfigs.at(configId); 337651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 338651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getActiveConfig returned unknown config %u", mId, 339651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId); 340651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // Return no error, but the caller needs to check for a null pointer to 341651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // detect this case 342651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outConfig = nullptr; 343651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 344651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 345651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 346651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 347651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 348651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getChangedCompositionTypes( 349d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas std::unordered_map<Layer*, Composition>* outTypes) 350651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 351aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Layer> layerIds; 352cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Composition> types; 353d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getChangedCompositionTypes( 354d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mId, &layerIds, &types); 355aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numElements = layerIds.size(); 356aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 357651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza error = static_cast<Error>(intError); 358651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 359651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 360651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 361651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 362651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->clear(); 363651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->reserve(numElements); 364651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 365651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 366651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 367651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto type = static_cast<Composition>(types[element]); 368651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("getChangedCompositionTypes: adding %" PRIu64 " %s", 369651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza layer->getId(), to_string(type).c_str()); 370651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outTypes->emplace(layer, type); 371651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 372651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getChangedCompositionTypes: invalid layer %" PRIu64 " found" 373651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " on display %" PRIu64, layerIds[element], mId); 374651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 375651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 376651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 377651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 378651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 379651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::getColorModes(std::vector<android_color_mode_t>* outModes) const 381076ac670262e448c531e6db7727cfade325866caDan Stoza{ 382aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::ColorMode> modes; 383d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getColorModes(mId, &modes); 384aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numModes = modes.size(); 385aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 386076ac670262e448c531e6db7727cfade325866caDan Stoza if (error != Error::None) { 387076ac670262e448c531e6db7727cfade325866caDan Stoza return error; 388076ac670262e448c531e6db7727cfade325866caDan Stoza } 389076ac670262e448c531e6db7727cfade325866caDan Stoza 39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outModes->resize(numModes); 39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (size_t i = 0; i < numModes; i++) { 39228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright (*outModes)[i] = static_cast<android_color_mode_t>(modes[i]); 39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 394076ac670262e448c531e6db7727cfade325866caDan Stoza return Error::None; 395076ac670262e448c531e6db7727cfade325866caDan Stoza} 396076ac670262e448c531e6db7727cfade325866caDan Stoza 397651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozastd::vector<std::shared_ptr<const Display::Config>> Display::getConfigs() const 398651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 399651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza std::vector<std::shared_ptr<const Config>> configs; 400651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (const auto& element : mConfigs) { 401651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configs.emplace_back(element.second); 402651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 403651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return configs; 404651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 405651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 406651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getName(std::string* outName) const 407651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 408d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getDisplayName(mId, outName); 409aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return static_cast<Error>(intError); 410651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 411651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 412651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getRequests(HWC2::DisplayRequest* outDisplayRequests, 413d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas std::unordered_map<Layer*, LayerRequest>* outLayerRequests) 414651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 415aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t intDisplayRequests; 416aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Layer> layerIds; 417aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<uint32_t> layerRequests; 418d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getDisplayRequests( 419d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mId, &intDisplayRequests, &layerIds, &layerRequests); 420aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numElements = layerIds.size(); 421aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 422651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 423651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 424651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 425651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 426651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outDisplayRequests = static_cast<DisplayRequest>(intDisplayRequests); 427651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->clear(); 428651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->reserve(numElements); 429651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 430651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 431651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 432651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layerRequest = 433651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza static_cast<LayerRequest>(layerRequests[element]); 434651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza outLayerRequests->emplace(layer, layerRequest); 435651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 436651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getRequests: invalid layer %" PRIu64 " found on display %" 437651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza PRIu64, layerIds[element], mId); 438651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 439651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 440651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 441651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 442651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 443651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 444651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getType(DisplayType* outType) const 445651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 446016d73c2d8f8fae544f09a6eebe827791f499470Chris Forbes *outType = mType; 447651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 448651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 449651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 450651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::supportsDoze(bool* outSupport) const 451651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 452aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu bool intSupport = false; 453d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getDozeSupport(mId, &intSupport); 454651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 455651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 456651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 457651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 458651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outSupport = static_cast<bool>(intSupport); 459651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 460651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 461651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 4627d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan StozaError Display::getHdrCapabilities( 4637d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza std::unique_ptr<HdrCapabilities>* outCapabilities) const 4647d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza{ 4657d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza uint32_t numTypes = 0; 4667d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float maxLuminance = -1.0f; 4677d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float maxAverageLuminance = -1.0f; 4687d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza float minLuminance = -1.0f; 469aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Hdr> intTypes; 470d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getHdrCapabilities(mId, &intTypes, 47167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &maxLuminance, &maxAverageLuminance, &minLuminance); 472aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<HWC2::Error>(intError); 473aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 474aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<int32_t> types; 475aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu for (auto type : intTypes) { 476aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu types.push_back(static_cast<int32_t>(type)); 477aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 478aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu numTypes = types.size(); 4797d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza if (error != Error::None) { 4807d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return error; 4817d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza } 4827d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 4837d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza *outCapabilities = std::make_unique<HdrCapabilities>(std::move(types), 4847d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza maxLuminance, maxAverageLuminance, minLuminance); 4857d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza return Error::None; 4867d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza} 4877d7ae7345abfb91be55c4aed6c9be9d09a144e4cDan Stoza 488651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::getReleaseFences( 489d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas std::unordered_map<Layer*, sp<Fence>>* outFences) const 490651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 491aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Layer> layerIds; 492aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<int> fenceFds; 493d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getReleaseFences(mId, &layerIds, &fenceFds); 494aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 495aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu uint32_t numElements = layerIds.size(); 496651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 497651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 498651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 499651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 500d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas std::unordered_map<Layer*, sp<Fence>> releaseFences; 501651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza releaseFences.reserve(numElements); 502651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (uint32_t element = 0; element < numElements; ++element) { 503651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto layer = getLayerById(layerIds[element]); 504651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (layer) { 505651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza sp<Fence> fence(new Fence(fenceFds[element])); 506d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas releaseFences.emplace(layer, fence); 507651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 508651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getReleaseFences: invalid layer %" PRIu64 509651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza " found on display %" PRIu64, layerIds[element], mId); 5105e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu for (; element < numElements; ++element) { 5115e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu close(fenceFds[element]); 5125e74c65a55e2297228e1c8cf7885420d6a946e80Chia-I Wu } 513651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::BadLayer; 514651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 515651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 516651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 517651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outFences = std::move(releaseFences); 518651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 519651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 520651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 52111d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien SanglardError Display::present(sp<Fence>* outPresentFence) 522651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 523847650b5d89a1667f78fa0fa67429377cd3bf37aNaseer Ahmed int32_t presentFenceFd = -1; 524d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.presentDisplay(mId, &presentFenceFd); 525651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 526651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 527651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 528651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 529651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 53011d0fc38ad8d2e5bb5bc0a282336cabe28dbf9d6Fabien Sanglard *outPresentFence = new Fence(presentFenceFd); 531651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::None; 532651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 533651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 534651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setActiveConfig(const std::shared_ptr<const Config>& config) 535651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 536651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (config->getDisplayId() != mId) { 537651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("setActiveConfig received config %u for the wrong display %" 538651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza PRIu64 " (expected %" PRIu64 ")", config->getId(), 539651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza config->getDisplayId(), mId); 540651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return Error::BadConfig; 541651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 542d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setActiveConfig(mId, config->getId()); 543651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 544651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 545651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 5461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError Display::setClientTarget(uint32_t slot, const sp<GraphicBuffer>& target, 547651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& acquireFence, android_dataspace_t dataspace) 548651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 5495cf424bc129f01ee12c7a4fbea1664276d29f970Dan Stoza // TODO: Properly encode client target surface damage 550651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = acquireFence->dup(); 551d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setClientTarget(mId, slot, target, 55206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu fenceFd, static_cast<Hwc2::Dataspace>(dataspace), 553cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Rect>()); 554651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 555651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 556651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 55728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael WrightError Display::setColorMode(android_color_mode_t mode) 558076ac670262e448c531e6db7727cfade325866caDan Stoza{ 559d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setColorMode( 560d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mId, static_cast<Hwc2::ColorMode>(mode)); 561076ac670262e448c531e6db7727cfade325866caDan Stoza return static_cast<Error>(intError); 562076ac670262e448c531e6db7727cfade325866caDan Stoza} 563076ac670262e448c531e6db7727cfade325866caDan Stoza 5645df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Display::setColorTransform(const android::mat4& matrix, 5655df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza android_color_transform_t hint) 5665df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{ 567d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setColorTransform(mId, 568aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu matrix.asArray(), static_cast<Hwc2::ColorTransform>(hint)); 5695df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza return static_cast<Error>(intError); 5705df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza} 5715df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza 572651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setOutputBuffer(const sp<GraphicBuffer>& buffer, 573651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& releaseFence) 574651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 575651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = releaseFence->dup(); 576651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto handle = buffer->getNativeBuffer()->handle; 577d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setOutputBuffer(mId, handle, fenceFd); 57838628986f2bb3b392dd4b519aacb9354320e409fDan Stoza close(fenceFd); 579651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 580651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 581651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 582651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setPowerMode(PowerMode mode) 583651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 584cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intMode = static_cast<Hwc2::IComposerClient::PowerMode>(mode); 585d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setPowerMode(mId, intMode); 586651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 587651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 588651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 589651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::setVsyncEnabled(Vsync enabled) 590651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 591cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intEnabled = static_cast<Hwc2::IComposerClient::Vsync>(enabled); 592d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setVsyncEnabled(mId, intEnabled); 593651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 594651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 595651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 596651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests) 597651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 598651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numTypes = 0; 599651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza uint32_t numRequests = 0; 600d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.validateDisplay(mId, &numTypes, &numRequests); 601651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 602651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None && error != Error::HasChanges) { 603651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 604651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 605651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 606651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outNumTypes = numTypes; 607651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza *outNumRequests = numRequests; 608651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return error; 609651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 610651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 611249c0ae80a6e5690d091294c4447cb3facafbc37Fabien SanglardError Display::presentOrValidate(uint32_t* outNumTypes, uint32_t* outNumRequests, 612249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard sp<android::Fence>* outPresentFence, uint32_t* state) { 613249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 614249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard uint32_t numTypes = 0; 615249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard uint32_t numRequests = 0; 616249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard int32_t presentFenceFd = -1; 617d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.presentOrValidateDisplay( 618d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mId, &numTypes, &numRequests, &presentFenceFd, state); 619249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard auto error = static_cast<Error>(intError); 620249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (error != Error::None && error != Error::HasChanges) { 621249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return error; 622249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 623249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 624249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (*state == 1) { 625249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *outPresentFence = new Fence(presentFenceFd); 626249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 627249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 628249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (*state == 0) { 629249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *outNumTypes = numTypes; 630249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *outNumRequests = numRequests; 631249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 632249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return error; 633249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 6340c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu 6350c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wuvoid Display::discardCommands() 6360c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu{ 637d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mComposer.resetCommands(); 6380c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu} 6390c6ce4608fc022608537162dd919e7f729b9cb77Chia-I Wu 640651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// For use by Device 641651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 642d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Display::setConnected(bool connected) { 643d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (!mIsConnected && connected && mType == DisplayType::Physical) { 644d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mComposer.setClientTargetSlotCount(mId); 645d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas loadConfigs(); 646d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas } 647d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mIsConnected = connected; 648d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas} 649d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 650651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozaint32_t Display::getAttribute(hwc2_config_t configId, Attribute attribute) 651651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 652651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t value = 0; 653d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getDisplayAttribute(mId, configId, 65467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu static_cast<Hwc2::IComposerClient::Attribute>(attribute), 65567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu &value); 656651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto error = static_cast<Error>(intError); 657651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 658651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("getDisplayAttribute(%" PRIu64 ", %u, %s) failed: %s (%d)", mId, 659651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza configId, to_string(attribute).c_str(), 660651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 661651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return -1; 662651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 663651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return value; 664651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 665651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 666651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfig(hwc2_config_t configId) 667651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 668651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] loadConfig(%u)", mId, configId); 669651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 670651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto config = Config::Builder(*this, configId) 671651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setWidth(getAttribute(configId, Attribute::Width)) 672651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setHeight(getAttribute(configId, Attribute::Height)) 673651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setVsyncPeriod(getAttribute(configId, Attribute::VsyncPeriod)) 674651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setDpiX(getAttribute(configId, Attribute::DpiX)) 675651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .setDpiY(getAttribute(configId, Attribute::DpiY)) 676651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza .build(); 677651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza mConfigs.emplace(configId, std::move(config)); 678651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 679651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 680651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stozavoid Display::loadConfigs() 681651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 682651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGV("[%" PRIu64 "] loadConfigs", mId); 683651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 684aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<Hwc2::Config> configIds; 685d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.getDisplayConfigs(mId, &configIds); 686aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto error = static_cast<Error>(intError); 687651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (error != Error::None) { 688651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza ALOGE("[%" PRIu64 "] getDisplayConfigs [2] failed: %s (%d)", mId, 689651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza to_string(error).c_str(), intError); 690651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return; 691651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 692651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 693651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (auto configId : configIds) { 694651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza loadConfig(configId); 695651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 696651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 697651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 698651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Other Display methods 699651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 700d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasLayer* Display::getLayerById(hwc2_layer_t id) const 701651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 702651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (mLayers.count(id) == 0) { 703651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return nullptr; 704651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 705651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 706d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return mLayers.at(id).get(); 707651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 708651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 709651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza// Layer methods 710651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 711d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven ThomasLayer::Layer(android::Hwc2::Composer& composer, 712d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas const std::unordered_set<Capability>& capabilities, 713d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas hwc2_display_t displayId, hwc2_layer_t layerId) 714d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas : mComposer(composer), 715d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mCapabilities(capabilities), 716d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mDisplayId(displayId), 717d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mId(layerId) 718651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 719d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGV("Created layer %" PRIu64 " on display %" PRIu64, layerId, displayId); 720651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 721651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 722651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaLayer::~Layer() 723651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 724d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.destroyLayer(mDisplayId, mId); 725d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto error = static_cast<Error>(intError); 726d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")" 727d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas " failed: %s (%d)", mDisplayId, mId, to_string(error).c_str(), 728d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas intError); 729d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (mLayerDestroyedListener) { 730d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mLayerDestroyedListener(this); 731651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 732651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 733651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 734d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasvoid Layer::setLayerDestroyedListener(std::function<void(Layer*)> listener) { 735d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas LOG_ALWAYS_FATAL_IF(mLayerDestroyedListener && listener, 736d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas "Attempt to set layer destroyed listener multiple times"); 737d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mLayerDestroyedListener = listener; 738d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas} 739d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 740651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCursorPosition(int32_t x, int32_t y) 741651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 742d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setCursorPosition(mDisplayId, mId, x, y); 743651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 744651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 745651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 7461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError Layer::setBuffer(uint32_t slot, const sp<GraphicBuffer>& buffer, 747651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza const sp<Fence>& acquireFence) 748651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 749651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza int32_t fenceFd = acquireFence->dup(); 750d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerBuffer(mDisplayId, mId, slot, buffer, 751d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas fenceFd); 752651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 753651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 754651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 755651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSurfaceDamage(const Region& damage) 756651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 757651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // We encode default full-screen damage as INVALID_RECT upstream, but as 0 758651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza // rects for HWC 759aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Hwc2::Error intError = Hwc2::Error::NONE; 760651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza if (damage.isRect() && damage.getBounds() == Rect::INVALID_RECT) { 761d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas intError = mComposer.setLayerSurfaceDamage(mDisplayId, 762cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mId, std::vector<Hwc2::IComposerClient::Rect>()); 763651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } else { 764651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza size_t rectCount = 0; 765651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto rectArray = damage.getArray(&rectCount); 766651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 767cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Rect> hwcRects; 768651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (size_t rect = 0; rect < rectCount; ++rect) { 769651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRects.push_back({rectArray[rect].left, rectArray[rect].top, 770651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rectArray[rect].right, rectArray[rect].bottom}); 771651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 772651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 773d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas intError = mComposer.setLayerSurfaceDamage(mDisplayId, mId, hwcRects); 774651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 775651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 776651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 777651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 778651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 779651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setBlendMode(BlendMode mode) 780651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 781cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intMode = static_cast<Hwc2::IComposerClient::BlendMode>(mode); 782d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerBlendMode(mDisplayId, mId, intMode); 783651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 784651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 785651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 786651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setColor(hwc_color_t color) 787651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 788cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Hwc2::IComposerClient::Color hwcColor{color.r, color.g, color.b, color.a}; 789d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerColor(mDisplayId, mId, hwcColor); 790651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 791651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 792651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 793651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setCompositionType(Composition type) 794651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 795cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto intType = static_cast<Hwc2::IComposerClient::Composition>(type); 796d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerCompositionType( 797d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas mDisplayId, mId, intType); 798651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 799651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 800651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 8015df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan StozaError Layer::setDataspace(android_dataspace_t dataspace) 8025df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza{ 803c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter if (dataspace == mDataSpace) { 804c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter return Error::None; 805c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter } 806c988ee4c4c21331e2a33467dc899ebb561035b0bCourtney Goeltzenleuchter mDataSpace = dataspace; 807aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intDataspace = static_cast<Hwc2::Dataspace>(dataspace); 808d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerDataspace(mDisplayId, mId, intDataspace); 8095df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza return static_cast<Error>(intError); 8105df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza} 8115df2a86063c6a83813fc1aa3d8938a82f7ff8f14Dan Stoza 812651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setDisplayFrame(const Rect& frame) 813651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 814cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Hwc2::IComposerClient::Rect hwcRect{frame.left, frame.top, 815aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu frame.right, frame.bottom}; 816d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerDisplayFrame(mDisplayId, mId, hwcRect); 817651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 818651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 819651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 820651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setPlaneAlpha(float alpha) 821651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 822d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerPlaneAlpha(mDisplayId, mId, alpha); 823651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 824651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 825651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 826651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSidebandStream(const native_handle_t* stream) 827651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 828d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas if (mCapabilities.count(Capability::SidebandStream) == 0) { 82909e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza ALOGE("Attempted to call setSidebandStream without checking that the " 83009e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza "device supports sideband streams"); 83109e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza return Error::Unsupported; 83209e7a27fabde3da99ba6dfd2fd20be7d1425a9adDan Stoza } 833d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerSidebandStream(mDisplayId, mId, stream); 834651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 835651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 836651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 837651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setSourceCrop(const FloatRect& crop) 838651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 839cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Hwc2::IComposerClient::FRect hwcRect{ 840aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu crop.left, crop.top, crop.right, crop.bottom}; 841d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerSourceCrop(mDisplayId, mId, hwcRect); 842651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 843651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 844651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 845651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setTransform(Transform transform) 846651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 847aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu auto intTransform = static_cast<Hwc2::Transform>(transform); 848d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerTransform(mDisplayId, mId, intTransform); 849651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 850651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 851651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 852651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setVisibleRegion(const Region& region) 853651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 854651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza size_t rectCount = 0; 855651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza auto rectArray = region.getArray(&rectCount); 856651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 857cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<Hwc2::IComposerClient::Rect> hwcRects; 858651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza for (size_t rect = 0; rect < rectCount; ++rect) { 859651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza hwcRects.push_back({rectArray[rect].left, rectArray[rect].top, 860651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza rectArray[rect].right, rectArray[rect].bottom}); 861651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza } 862651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 863d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerVisibleRegion(mDisplayId, mId, hwcRects); 864651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 865651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 866651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 867651bf314a6a1a77e4cbb66ffb81221200f918290Dan StozaError Layer::setZOrder(uint32_t z) 868651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza{ 869d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerZOrder(mDisplayId, mId, z); 870651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza return static_cast<Error>(intError); 871651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} 872651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza 8732f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Layer::setInfo(uint32_t type, uint32_t appId) 8742f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{ 875d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas auto intError = mComposer.setLayerInfo(mDisplayId, mId, type, appId); 8762f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara return static_cast<Error>(intError); 8772f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 8782f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 879651bf314a6a1a77e4cbb66ffb81221200f918290Dan Stoza} // namespace HWC2 880