ComposerHal.cpp revision c0b2b0c457c45e09479029748e07e6d1b1c9d457
1aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu/* 2aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * Copyright 2016 The Android Open Source Project 3aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * 4aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License"); 5aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * you may not use this file except in compliance with the License. 6aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * You may obtain a copy of the License at 7aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * 8aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * http://www.apache.org/licenses/LICENSE-2.0 9aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * 10aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * Unless required by applicable law or agreed to in writing, software 11aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS, 12aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * See the License for the specific language governing permissions and 14aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu * limitations under the License. 15aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu */ 16aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 17aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#undef LOG_TAG 18aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#define LOG_TAG "HwcComposer" 19aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 20aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#include <inttypes.h> 21aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#include <log/log.h> 2206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu#include <gui/BufferQueue.h> 23aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 24aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu#include "ComposerHal.h" 25aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 26aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace android { 27aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 28aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing hardware::Return; 29aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuusing hardware::hidl_vec; 307c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenenusing hardware::hidl_handle; 31aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 32aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace Hwc2 { 33aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 34aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wunamespace { 35aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 36aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuclass BufferHandle { 37aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wupublic: 38aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu BufferHandle(const native_handle_t* buffer) 39aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 40aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu // nullptr is not a valid handle to HIDL 41aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0); 42aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 43aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 447c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen operator const hidl_handle&() const 45aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 46aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return mHandle; 47aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 48aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 49aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuprivate: 50aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0); 517c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen hidl_handle mHandle; 52aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu}; 53aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 54aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuclass FenceHandle 55aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 56aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wupublic: 57aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu FenceHandle(int fd, bool owned) 58aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu : mOwned(owned) 59aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 607c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen native_handle_t* handle; 61aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (fd >= 0) { 627c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen handle = native_handle_init(mStorage, 1, 0); 637c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen handle->data[0] = fd; 64aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } else { 65aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu // nullptr is not a valid handle to HIDL 667c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen handle = native_handle_init(mStorage, 0, 0); 67aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 687c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen mHandle = handle; 69aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 70aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 71aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu ~FenceHandle() 72aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 73aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (mOwned) { 74aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu native_handle_close(mHandle); 75aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 76aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 77aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 787c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen operator const hidl_handle&() const 79aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu { 80aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return mHandle; 81aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 82aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 83aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuprivate: 84aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu bool mOwned; 85aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0); 867c5a92fc5d4d62027f09537df978f2c90c9719c5Martijn Coenen hidl_handle mHandle; 87aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu}; 88aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 89aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu// assume NO_RESOURCES when Status::isOk returns false 90aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wuconstexpr Error kDefaultError = Error::NO_RESOURCES; 91aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 92aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wutemplate<typename T, typename U> 93aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuT unwrapRet(Return<T>& ret, const U& default_val) 94aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 959d02100650605c62b66ec45d212d6428f42761feSteven Moreland return (ret.isOk()) ? static_cast<T>(ret) : 96aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu static_cast<T>(default_val); 97aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 98aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 99aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError unwrapRet(Return<Error>& ret) 100aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 101aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret, kDefaultError); 102aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 103aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 104aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // anonymous namespace 105aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 1062f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraComposer::CommandWriter::CommandWriter(uint32_t initialMaxSize) 1072f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara : CommandWriterBase(initialMaxSize) {} 1082f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1092f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraComposer::CommandWriter::~CommandWriter() 1102f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{ 1112f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 1122f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1132f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoaravoid Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId) 114aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 1152f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara constexpr uint16_t kSetLayerInfoLength = 2; 1162f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara beginCommand( 1172f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara static_cast<IComposerClient::Command>( 1182f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara IVrComposerClient::VrCommand::SET_LAYER_INFO), 1192f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara kSetLayerInfoLength); 1202f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara write(type); 1212f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara write(appId); 1222f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara endCommand(); 1232f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 1242f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 1251f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid Composer::CommandWriter::setClientTargetMetadata( 1261f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) 1271f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara{ 1281f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara constexpr uint16_t kSetClientTargetMetadataLength = 7; 1291f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara beginCommand( 1301f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara static_cast<IComposerClient::Command>( 1311f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA), 1321f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara kSetClientTargetMetadataLength); 1331f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara writeBufferMetadata(metadata); 1341f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara endCommand(); 1351f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1361f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 1371f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid Composer::CommandWriter::setLayerBufferMetadata( 1381f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) 1391f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara{ 1401f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara constexpr uint16_t kSetLayerBufferMetadataLength = 7; 1411f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara beginCommand( 1421f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara static_cast<IComposerClient::Command>( 1431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA), 1441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara kSetLayerBufferMetadataLength); 1451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara writeBufferMetadata(metadata); 1461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara endCommand(); 1471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 1491f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid Composer::CommandWriter::writeBufferMetadata( 1501f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) 1511f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara{ 1521f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara write(metadata.width); 1531f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara write(metadata.height); 1541f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara write(metadata.stride); 1551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara write(metadata.layerCount); 1561f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara writeSigned(static_cast<int32_t>(metadata.format)); 1571f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara write64(metadata.usage); 1581f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1591f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 16087670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik WagenaarComposer::Composer(bool useVrComposer) 16187670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar : mWriter(kWriterInitialSize), 16287670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar mIsUsingVrComposer(useVrComposer) 1632f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{ 16487670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar if (mIsUsingVrComposer) { 165e96afe6e91efd036089a6b6c42a855bdec4308ecDaniel Nicoara mComposer = IComposer::getService("vr"); 1662f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara } else { 167f5eb5e62777e03551af611e799f9b24e473dd065Chris Phoenix mComposer = IComposer::getService(); // use default name 1682f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara } 1692f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 170cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (mComposer == nullptr) { 171aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu LOG_ALWAYS_FATAL("failed to get hwcomposer service"); 172aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 173cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 174cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mComposer->createClient( 175cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu [&](const auto& tmpError, const auto& tmpClient) 176cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu { 177cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (tmpError == Error::NONE) { 178cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient = tmpClient; 179cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 180cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu }); 181cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (mClient == nullptr) { 182cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu LOG_ALWAYS_FATAL("failed to create composer client"); 183cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 184a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara 185a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara if (mIsUsingVrComposer) { 186a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient); 187a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara if (vrClient == nullptr) { 188a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara LOG_ALWAYS_FATAL("failed to create vr composer client"); 189a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara } 190a50abc2fbbc1ab4ac00aa5d3b41d77b24048f81bDaniel Nicoara } 191aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 192aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 193cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wustd::vector<IComposer::Capability> Composer::getCapabilities() 194aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 195aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<IComposer::Capability> capabilities; 196cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mComposer->getCapabilities( 197aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpCapabilities) { 19867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu capabilities = tmpCapabilities; 199aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 200aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 201aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return capabilities; 202aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 203aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 204cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wustd::string Composer::dumpDebugInfo() 205aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 206aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::string info; 207cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mComposer->dumpDebugInfo([&](const auto& tmpInfo) { 208aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu info = tmpInfo.c_str(); 209aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 210aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 211aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return info; 212aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 213aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 214cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid Composer::registerCallback(const sp<IComposerCallback>& callback) 215aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 216cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->registerCallback(callback); 2179d02100650605c62b66ec45d212d6428f42761feSteven Moreland if (!ret.isOk()) { 218aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu ALOGE("failed to register IComposerCallback"); 219aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 220aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 221aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 222d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomasbool Composer::isRemote() { 223d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas return mClient->isRemote(); 224d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas} 225d7f49c5e93a554c2f0e85e279a765f92fb1e66f1Steven Thomas 2260af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomasvoid Composer::resetCommands() { 2270af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomas mWriter.reset(); 2280af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomas} 2290af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomas 230cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuuint32_t Composer::getMaxVirtualDisplayCount() 231aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 232cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->getMaxVirtualDisplayCount(); 233aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret, 0); 234aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 235aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 236aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::createVirtualDisplay(uint32_t width, uint32_t height, 23767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu PixelFormat* format, Display* outDisplay) 238aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 239cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const uint32_t bufferSlotCount = 1; 240aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 24167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mClient->createVirtualDisplay(width, height, *format, bufferSlotCount, 242aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpDisplay, 243aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpFormat) { 244aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 245aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 246aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 247aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 248aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 24967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outDisplay = tmpDisplay; 25067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *format = tmpFormat; 251aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 252aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 253aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 254aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 255aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 256cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::destroyVirtualDisplay(Display display) 257aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 258cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->destroyVirtualDisplay(display); 259aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 260aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 261aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 262cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::acceptDisplayChanges(Display display) 263aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 264cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 265cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.acceptDisplayChanges(); 266cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 267aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 268aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 26967e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::createLayer(Display display, Layer* outLayer) 270aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 271aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 27206d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS, 273aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpLayer) { 274aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 275aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 276aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 277aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 278aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 27967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayer = tmpLayer; 280aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 281aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 282aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 283aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 284aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 285cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::destroyLayer(Display display, Layer layer) 286aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 287cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->destroyLayer(display, layer); 288aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 289aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 290aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 29167e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getActiveConfig(Display display, Config* outConfig) 292aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 293aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 294cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getActiveConfig(display, 295aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpConfig) { 296aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 297aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 298aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 299aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 300aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 30167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outConfig = tmpConfig; 302aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 303aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 304aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 305aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 306aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 307aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getChangedCompositionTypes(Display display, 30867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, 30967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<IComposerClient::Composition>* outTypes) 310aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 31167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takeChangedCompositionTypes(display, outLayers, outTypes); 312cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 313aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 314aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 315aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getColorModes(Display display, 31667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<ColorMode>* outModes) 317aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 318aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 319cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getColorModes(display, 320aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpModes) { 321aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 322aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 323aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 324aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 325aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 32667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outModes = tmpModes; 327aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 328aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 329aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 330aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 331aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 332aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getDisplayAttribute(Display display, Config config, 33367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu IComposerClient::Attribute attribute, int32_t* outValue) 334aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 335aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 336cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayAttribute(display, config, attribute, 337aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpValue) { 338aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 339aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 340aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 341aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 342aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 34367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outValue = tmpValue; 344aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 345aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 346aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 347aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 348aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 349aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getDisplayConfigs(Display display, 35067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Config>* outConfigs) 351aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 352aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 353cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayConfigs(display, 354aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpConfigs) { 355aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 356aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 357aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 358aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 359aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 36067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outConfigs = tmpConfigs; 361aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 362aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 363aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 364aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 365aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 36667e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getDisplayName(Display display, std::string* outName) 367aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 368aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 369cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayName(display, 370aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpName) { 371aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 372aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 373aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 374aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 375aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 37667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outName = tmpName.c_str(); 377aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 378aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 379aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 380aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 381aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 382aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getDisplayRequests(Display display, 38367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 38467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<uint32_t>* outLayerRequestMasks) 385aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 38667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takeDisplayRequests(display, outDisplayRequestMask, 38767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers, outLayerRequestMasks); 388cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 389aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 390aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 39167e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getDisplayType(Display display, 39267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu IComposerClient::DisplayType* outType) 393aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 394aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 395cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayType(display, 396aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpType) { 397aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 398aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 399aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 400aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 401aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 40267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outType = tmpType; 403aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 404aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 405aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 406aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 407aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 40867e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getDozeSupport(Display display, bool* outSupport) 409aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 410aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 411cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDozeSupport(display, 412aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpSupport) { 413aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 414aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 415aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 416aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 417aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 41867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outSupport = tmpSupport; 419aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 420aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 421aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 422aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 423aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 42467e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getHdrCapabilities(Display display, 42567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Hdr>* outTypes, float* outMaxLuminance, 42667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu float* outMaxAverageLuminance, float* outMinLuminance) 427aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 428aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 429cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getHdrCapabilities(display, 430aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpTypes, 431aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpMaxLuminance, 432aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpMaxAverageLuminance, 433aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpMinLuminance) { 434aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 435aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 436aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 437aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 438aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 43967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outTypes = tmpTypes; 44067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outMaxLuminance = tmpMaxLuminance; 44167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outMaxAverageLuminance = tmpMaxAverageLuminance; 44267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outMinLuminance = tmpMinLuminance; 443aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 444aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 445aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 446aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 447aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 44867e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getReleaseFences(Display display, 44967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 450aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 45167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takeReleaseFences(display, outLayers, outReleaseFences); 452cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 453aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 454aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 45567e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::presentDisplay(Display display, int* outPresentFence) 456aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 457cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 458cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.presentDisplay(); 459aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 460cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Error error = execute(); 461cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 462cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 463cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 464aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 46567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takePresentFence(display, outPresentFence); 466cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 467cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 468aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 469aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 470cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setActiveConfig(Display display, Config config) 471aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 472cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setActiveConfig(display, config); 473aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 474aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 475aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 47606d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I WuError Composer::setClientTarget(Display display, uint32_t slot, 4771f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const sp<GraphicBuffer>& target, 478aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu int acquireFence, Dataspace dataspace, 479cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const std::vector<IComposerClient::Rect>& damage) 480aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 481cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 4821f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (mIsUsingVrComposer && target.get()) { 4831f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::BufferMetadata metadata = { 4841f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .width = target->getWidth(), 4851f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .height = target->getHeight(), 4861f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .stride = target->getStride(), 4871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .layerCount = target->getLayerCount(), 4881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .format = static_cast<PixelFormat>(target->getPixelFormat()), 4891f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .usage = target->getUsage(), 4901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara }; 4911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setClientTargetMetadata(metadata); 4921f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 4931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 4941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const native_handle_t* handle = nullptr; 4951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (target.get()) { 4961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara handle = target->getNativeBuffer()->handle; 4971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 4981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 4991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage); 500cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 501aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 502aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 503cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setColorMode(Display display, ColorMode mode) 504aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 505cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setColorMode(display, mode); 506aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 507aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 508aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 509aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setColorTransform(Display display, const float* matrix, 510cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ColorTransform hint) 511aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 512cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 513cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setColorTransform(matrix, hint); 514cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 515aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 516aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 517aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setOutputBuffer(Display display, const native_handle_t* buffer, 518cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu int releaseFence) 519aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 520cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 521cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setOutputBuffer(0, buffer, dup(releaseFence)); 522cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 523cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 524aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 525cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) 526cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 527cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setPowerMode(display, mode); 528aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 529aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 530aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 531cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) 532aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 533cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setVsyncEnabled(display, enabled); 534aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 535aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 536aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 537cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setClientTargetSlotCount(Display display) 538aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 53906d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS; 540cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount); 541aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 542aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 543aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 54467e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::validateDisplay(Display display, uint32_t* outNumTypes, 54567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outNumRequests) 546aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 547cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 548cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.validateDisplay(); 549aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 550cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Error error = execute(); 551cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 552cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 553cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 554aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 55567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.hasChanges(display, outNumTypes, outNumRequests); 556cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 557cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 558aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 559aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 560249c0ae80a6e5690d091294c4447cb3facafbc37Fabien SanglardError Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes, 561249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) { 562249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mWriter.selectDisplay(display); 563249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mWriter.presentOrvalidateDisplay(); 564249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 565249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard Error error = execute(); 566249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (error != Error::NONE) { 567249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return error; 568249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 569249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 570249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mReader.takePresentOrValidateStage(display, state); 571249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 572249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (*state == 1) { // Present succeeded 573249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mReader.takePresentFence(display, outPresentFence); 574249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 575249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 576249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (*state == 0) { // Validate succeeded. 577249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mReader.hasChanges(display, outNumTypes, outNumRequests); 578249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 579249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 580249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return Error::NONE; 581249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 582249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 583aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setCursorPosition(Display display, Layer layer, 584cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu int32_t x, int32_t y) 585aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 586cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 587cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 588cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerCursorPosition(x, y); 589cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 590aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 591aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 592aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerBuffer(Display display, Layer layer, 5931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence) 594aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 595cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 596cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 5971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (mIsUsingVrComposer && buffer.get()) { 5981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::BufferMetadata metadata = { 5991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .width = buffer->getWidth(), 6001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .height = buffer->getHeight(), 6011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .stride = buffer->getStride(), 6021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .layerCount = buffer->getLayerCount(), 6031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .format = static_cast<PixelFormat>(buffer->getPixelFormat()), 6041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .usage = buffer->getUsage(), 6051f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara }; 6061f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setLayerBufferMetadata(metadata); 6071f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 6081f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 6091f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const native_handle_t* handle = nullptr; 6101f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (buffer.get()) { 6111f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara handle = buffer->getNativeBuffer()->handle; 6121f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 6131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 6141f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setLayerBuffer(slot, handle, acquireFence); 615cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 616aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 617aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 618aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerSurfaceDamage(Display display, Layer layer, 619cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const std::vector<IComposerClient::Rect>& damage) 620aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 621cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 622cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 623cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerSurfaceDamage(damage); 624cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 625aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 626aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 627aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerBlendMode(Display display, Layer layer, 628cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu IComposerClient::BlendMode mode) 629aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 630cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 631cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 632cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerBlendMode(mode); 633cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 634aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 635aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 636aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerColor(Display display, Layer layer, 637cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const IComposerClient::Color& color) 638aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 639cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 640cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 641cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerColor(color); 642cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 643aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 644aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 645aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerCompositionType(Display display, Layer layer, 646cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu IComposerClient::Composition type) 647aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 648cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 649cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 650cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerCompositionType(type); 651cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 652aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 653aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 654aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerDataspace(Display display, Layer layer, 655cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Dataspace dataspace) 656aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 657cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 658cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 659cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerDataspace(dataspace); 660cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 661aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 662aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 663aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerDisplayFrame(Display display, Layer layer, 664cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const IComposerClient::Rect& frame) 665aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 666cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 667cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 668cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerDisplayFrame(frame); 669cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 670aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 671aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 672aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerPlaneAlpha(Display display, Layer layer, 673cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu float alpha) 674aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 675cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 676cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 677cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerPlaneAlpha(alpha); 678cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 679aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 680aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 681aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerSidebandStream(Display display, Layer layer, 682cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const native_handle_t* stream) 683aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 684cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 685cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 686cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerSidebandStream(stream); 687cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 688aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 689aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 690aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerSourceCrop(Display display, Layer layer, 691cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const IComposerClient::FRect& crop) 692aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 693cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 694cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 695cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerSourceCrop(crop); 696cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 697aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 698aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 699aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerTransform(Display display, Layer layer, 700cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Transform transform) 701aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 702cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 703cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 704cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerTransform(transform); 705cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 706aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 707aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 708aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerVisibleRegion(Display display, Layer layer, 709cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const std::vector<IComposerClient::Rect>& visible) 710aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 711cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 712cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 713cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerVisibleRegion(visible); 714cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 715cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 716aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 717cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setLayerZOrder(Display display, Layer layer, uint32_t z) 718cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 719cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 720cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 721cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerZOrder(z); 722cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 723aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 724aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 7252f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Composer::setLayerInfo(Display display, Layer layer, uint32_t type, 7262f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara uint32_t appId) 7272f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{ 72887670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar if (mIsUsingVrComposer) { 7292f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mWriter.selectDisplay(display); 7302f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mWriter.selectLayer(layer); 7312f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mWriter.setLayerInfo(type, appId); 7322f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara } 7332f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara return Error::NONE; 7342f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 7352f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 736cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::execute() 737aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 738cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // prepare input command queue 739cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu bool queueChanged = false; 740cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t commandLength = 0; 741cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu hidl_vec<hidl_handle> commandHandles; 74267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) { 743cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.reset(); 744cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NO_RESOURCES; 745cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 746cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 747cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // set up new input command queue if necessary 748cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (queueChanged) { 749cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor()); 750cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto error = unwrapRet(ret); 751cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 752cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.reset(); 753cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 754cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 755cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 756cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 757cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Error error = kDefaultError; 758c0b2b0c457c45e09479029748e07e6d1b1c9d457Chia-I Wu auto ret = mClient->executeCommands(commandLength, commandHandles, 759cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu [&](const auto& tmpError, const auto& tmpOutChanged, 760cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const auto& tmpOutLength, const auto& tmpOutHandles) 761cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu { 762cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = tmpError; 763cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 764cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // set up new output command queue if necessary 765cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error == Error::NONE && tmpOutChanged) { 766cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = kDefaultError; 767cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getOutputCommandQueue( 768cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu [&](const auto& tmpError, 769cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const auto& tmpDescriptor) 770cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu { 771cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = tmpError; 772cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 773cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 774cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 775cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 776cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReader.setMQDescriptor(tmpDescriptor); 777cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu }); 778cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 779cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 780cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 781cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 782cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 783cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 784cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (mReader.readQueue(tmpOutLength, tmpOutHandles)) { 785cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = mReader.parse(); 786cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReader.reset(); 787cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } else { 788cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = Error::NO_RESOURCES; 789cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 790cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu }); 791c0b2b0c457c45e09479029748e07e6d1b1c9d457Chia-I Wu // executeCommands can fail because of out-of-fd and we do not want to 792c0b2b0c457c45e09479029748e07e6d1b1c9d457Chia-I Wu // abort() in that case 793c0b2b0c457c45e09479029748e07e6d1b1c9d457Chia-I Wu if (!ret.isOk()) { 794c0b2b0c457c45e09479029748e07e6d1b1c9d457Chia-I Wu ALOGE("executeCommands failed because of %s", ret.description().c_str()); 795c0b2b0c457c45e09479029748e07e6d1b1c9d457Chia-I Wu } 796cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 797cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error == Error::NONE) { 798cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<CommandReader::CommandError> commandErrors = 799cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReader.takeErrors(); 800cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 801cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu for (const auto& cmdErr : commandErrors) { 802cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto command = mWriter.getCommand(cmdErr.location); 803cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 804cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (command == IComposerClient::Command::VALIDATE_DISPLAY || 805249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard command == IComposerClient::Command::PRESENT_DISPLAY || 806249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) { 807cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = cmdErr.error; 808cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } else { 809cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ALOGW("command 0x%x generated error %d", 810cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu command, cmdErr.error); 811cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 812cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 813cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 814cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 815cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.reset(); 816cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 817cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 818cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 819cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 820cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuCommandReader::~CommandReader() 821cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 822cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu resetData(); 823cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 824cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 825cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError CommandReader::parse() 826cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 827cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu resetData(); 828cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 829cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu IComposerClient::Command command; 830cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint16_t length = 0; 831cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 832cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (!isEmpty()) { 83367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu if (!beginCommand(&command, &length)) { 834cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 835cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 836cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 837cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu bool parsed = false; 838cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu switch (command) { 839cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SELECT_DISPLAY: 840cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSelectDisplay(length); 841cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 842cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_ERROR: 843cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetError(length); 844cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 845cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES: 846cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetChangedCompositionTypes(length); 847cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 848cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_DISPLAY_REQUESTS: 849cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetDisplayRequests(length); 850cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 851cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_PRESENT_FENCE: 852cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetPresentFence(length); 853cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 854cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_RELEASE_FENCES: 855cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetReleaseFences(length); 856cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 857249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT: 858249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard parsed = parseSetPresentOrValidateDisplayResult(length); 859249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard break; 860cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu default: 861cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = false; 862cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 863cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 864cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 865cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu endCommand(); 866cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 867cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (!parsed) { 868cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ALOGE("failed to parse command 0x%x length %" PRIu16, 869cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu command, length); 870cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 871cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 872cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 873cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 874cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return isEmpty() ? Error::NONE : Error::NO_RESOURCES; 875cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 876cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 877cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSelectDisplay(uint16_t length) 878cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 8793c9cbd48a678542f6832168f3f6371c4f717f709Daniel Nicoara if (length != CommandWriterBase::kSelectDisplayLength) { 880cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 881cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 882cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 883cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData = &mReturnData[read64()]; 884cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 885cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 886cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 887cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 888cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetError(uint16_t length) 889cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 8903c9cbd48a678542f6832168f3f6371c4f717f709Daniel Nicoara if (length != CommandWriterBase::kSetErrorLength) { 891cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 892cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 893cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 894cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto location = read(); 895cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto error = static_cast<Error>(readSigned()); 896cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 897cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mErrors.emplace_back(CommandError{location, error}); 898cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 899cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 900cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 901cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 902cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetChangedCompositionTypes(uint16_t length) 903cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 904cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // (layer id, composition type) pairs 905cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (length % 3 != 0 || !mCurrentReturnData) { 906cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 907cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 908cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 909cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t count = length / 3; 910cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->changedLayers.reserve(count); 911cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->compositionTypes.reserve(count); 912cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (count > 0) { 913cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layer = read64(); 914cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto type = static_cast<IComposerClient::Composition>(readSigned()); 915cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 916cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->changedLayers.push_back(layer); 917cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->compositionTypes.push_back(type); 918cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 919cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu count--; 920cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 921cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 922cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 923cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 924cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 925cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetDisplayRequests(uint16_t length) 926cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 927cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // display requests followed by (layer id, layer requests) pairs 928cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (length % 3 != 1 || !mCurrentReturnData) { 929cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 930cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 931cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 932cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->displayRequests = read(); 933cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 934cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t count = (length - 1) / 3; 935cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestedLayers.reserve(count); 936cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestMasks.reserve(count); 937cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (count > 0) { 938cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layer = read64(); 939cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layerRequestMask = read(); 940cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 941cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestedLayers.push_back(layer); 942cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestMasks.push_back(layerRequestMask); 943cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 944cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu count--; 945cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 946cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 947cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 948cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 949cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 950cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetPresentFence(uint16_t length) 951cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 9523c9cbd48a678542f6832168f3f6371c4f717f709Daniel Nicoara if (length != CommandWriterBase::kSetPresentFenceLength || 953cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu !mCurrentReturnData) { 954cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 955cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 956cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 957cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (mCurrentReturnData->presentFence >= 0) { 958cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu close(mCurrentReturnData->presentFence); 959cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 960cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->presentFence = readFence(); 961cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 962cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 963cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 964cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 965cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetReleaseFences(uint16_t length) 966cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 967cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // (layer id, release fence index) pairs 968cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (length % 3 != 0 || !mCurrentReturnData) { 969cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 970cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 971cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 972cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t count = length / 3; 973cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releasedLayers.reserve(count); 974cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releaseFences.reserve(count); 975cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (count > 0) { 976cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layer = read64(); 977cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto fence = readFence(); 978cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 979cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releasedLayers.push_back(layer); 980cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releaseFences.push_back(fence); 981cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 982cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu count--; 983cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 984cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 985cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 986cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 987cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 988249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglardbool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) 989249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard{ 990249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) { 991249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return false; 992249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 993249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mCurrentReturnData->presentOrValidateState = read(); 994249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return true; 995249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 996249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 997cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::resetData() 998cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 999cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mErrors.clear(); 1000cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1001cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu for (auto& data : mReturnData) { 1002cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (data.second.presentFence >= 0) { 1003cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu close(data.second.presentFence); 1004cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1005cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu for (auto fence : data.second.releaseFences) { 1006cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (fence >= 0) { 1007cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu close(fence); 1008cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1009cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1010cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1011cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1012cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReturnData.clear(); 1013cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData = nullptr; 1014cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1015cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1016cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wustd::vector<CommandReader::CommandError> CommandReader::takeErrors() 1017cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1018cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return std::move(mErrors); 1019cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1020cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1021cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::hasChanges(Display display, 102267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outNumChangedCompositionTypes, 102367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outNumLayerRequestMasks) const 1024cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1025cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1026cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 102767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumChangedCompositionTypes = 0; 102867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumLayerRequestMasks = 0; 1029cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 1030cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1031cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1032cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const ReturnData& data = found->second; 1033cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 103467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumChangedCompositionTypes = data.compositionTypes.size(); 103567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumLayerRequestMasks = data.requestMasks.size(); 1036cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1037cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return !(data.compositionTypes.empty() && data.requestMasks.empty()); 1038cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1039cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1040cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::takeChangedCompositionTypes(Display display, 104167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, 104267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<IComposerClient::Composition>* outTypes) 1043cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1044cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1045cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 104667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers->clear(); 104767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outTypes->clear(); 1048cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1049cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1050cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1051cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1052cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 105367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayers = std::move(data.changedLayers); 105467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outTypes = std::move(data.compositionTypes); 1055cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1056cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1057cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::takeDisplayRequests(Display display, 105867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 105967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<uint32_t>* outLayerRequestMasks) 1060cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1061cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1062cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 106367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outDisplayRequestMask = 0; 106467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers->clear(); 106567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayerRequestMasks->clear(); 1066cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1067cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1068cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1069cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1070cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 107167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outDisplayRequestMask = data.displayRequests; 107267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayers = std::move(data.requestedLayers); 107367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayerRequestMasks = std::move(data.requestMasks); 1074cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1075cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1076cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::takeReleaseFences(Display display, 107767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 1078cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1079cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1080cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 108167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers->clear(); 108267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outReleaseFences->clear(); 1083cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1084cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1085cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1086cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1087cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 108867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayers = std::move(data.releasedLayers); 108967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outReleaseFences = std::move(data.releaseFences); 1090cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1091cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 109267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wuvoid CommandReader::takePresentFence(Display display, int* outPresentFence) 1093cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1094cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1095cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 109667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outPresentFence = -1; 1097cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1098cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1099cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1100cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1101cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 110267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outPresentFence = data.presentFence; 1103cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu data.presentFence = -1; 1104aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 1105aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 1106249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglardvoid CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) { 1107249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard auto found = mReturnData.find(display); 1108249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (found == mReturnData.end()) { 1109249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *state= -1; 1110249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return; 1111249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 1112249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard ReturnData& data = found->second; 1113249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *state = data.presentOrValidateState; 1114249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 1115249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 1116aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace Hwc2 1117aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 1118aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace android 1119