ComposerHal.cpp revision 249c0ae80a6e5690d091294c4447cb3facafbc37
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 } 184aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 185aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 186cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wustd::vector<IComposer::Capability> Composer::getCapabilities() 187aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 188aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::vector<IComposer::Capability> capabilities; 189cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mComposer->getCapabilities( 190aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpCapabilities) { 19167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu capabilities = tmpCapabilities; 192aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 193aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 194aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return capabilities; 195aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 196aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 197cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wustd::string Composer::dumpDebugInfo() 198aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 199aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu std::string info; 200cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mComposer->dumpDebugInfo([&](const auto& tmpInfo) { 201aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu info = tmpInfo.c_str(); 202aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 203aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 204aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return info; 205aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 206aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 207cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid Composer::registerCallback(const sp<IComposerCallback>& callback) 208aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 209cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->registerCallback(callback); 2109d02100650605c62b66ec45d212d6428f42761feSteven Moreland if (!ret.isOk()) { 211aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu ALOGE("failed to register IComposerCallback"); 212aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 213aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 214aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 2150af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomasvoid Composer::resetCommands() { 2160af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomas mWriter.reset(); 2170af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomas} 2180af4b9f88a48a6ecc705b4a8cec3d3ba24c53eadSteven Thomas 219cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuuint32_t Composer::getMaxVirtualDisplayCount() 220aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 221cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->getMaxVirtualDisplayCount(); 222aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret, 0); 223aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 224aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 225aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::createVirtualDisplay(uint32_t width, uint32_t height, 22667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu PixelFormat* format, Display* outDisplay) 227aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 228cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const uint32_t bufferSlotCount = 1; 229aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 23067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mClient->createVirtualDisplay(width, height, *format, bufferSlotCount, 231aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpDisplay, 232aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpFormat) { 233aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 234aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 235aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 236aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 237aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 23867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outDisplay = tmpDisplay; 23967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *format = tmpFormat; 240aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 241aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 242aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 243aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 244aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 245cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::destroyVirtualDisplay(Display display) 246aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 247cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->destroyVirtualDisplay(display); 248aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 249aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 250aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 251cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::acceptDisplayChanges(Display display) 252aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 253cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 254cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.acceptDisplayChanges(); 255cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 256aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 257aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 25867e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::createLayer(Display display, Layer* outLayer) 259aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 260aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 26106d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS, 262aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpLayer) { 263aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 264aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 265aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 266aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 267aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 26867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayer = tmpLayer; 269aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 270aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 271aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 272aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 273aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 274cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::destroyLayer(Display display, Layer layer) 275aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 276cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->destroyLayer(display, layer); 277aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 278aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 279aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 28067e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getActiveConfig(Display display, Config* outConfig) 281aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 282aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 283cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getActiveConfig(display, 284aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpConfig) { 285aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 286aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 287aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 288aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 289aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 29067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outConfig = tmpConfig; 291aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 292aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 293aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 294aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 295aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 296aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getChangedCompositionTypes(Display display, 29767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, 29867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<IComposerClient::Composition>* outTypes) 299aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 30067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takeChangedCompositionTypes(display, outLayers, outTypes); 301cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 302aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 303aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 304aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getColorModes(Display display, 30567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<ColorMode>* outModes) 306aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 307aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 308cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getColorModes(display, 309aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpModes) { 310aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 311aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 312aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 313aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 314aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 31567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outModes = tmpModes; 316aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 317aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 318aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 319aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 320aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 321aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getDisplayAttribute(Display display, Config config, 32267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu IComposerClient::Attribute attribute, int32_t* outValue) 323aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 324aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 325cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayAttribute(display, config, attribute, 326aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpValue) { 327aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 328aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 329aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 330aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 331aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 33267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outValue = tmpValue; 333aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 334aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 335aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 336aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 337aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 338aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getDisplayConfigs(Display display, 33967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Config>* outConfigs) 340aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 341aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 342cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayConfigs(display, 343aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpConfigs) { 344aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 345aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 346aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 347aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 348aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 34967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outConfigs = tmpConfigs; 350aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 351aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 352aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 353aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 354aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 35567e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getDisplayName(Display display, std::string* outName) 356aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 357aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 358cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayName(display, 359aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpName) { 360aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 361aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 362aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 363aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 364aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 36567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outName = tmpName.c_str(); 366aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 367aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 368aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 369aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 370aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 371aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::getDisplayRequests(Display display, 37267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 37367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<uint32_t>* outLayerRequestMasks) 374aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 37567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takeDisplayRequests(display, outDisplayRequestMask, 37667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers, outLayerRequestMasks); 377cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 378aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 379aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 38067e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getDisplayType(Display display, 38167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu IComposerClient::DisplayType* outType) 382aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 383aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 384cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDisplayType(display, 385aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpType) { 386aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 387aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 388aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 389aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 390aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 39167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outType = tmpType; 392aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 393aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 394aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 395aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 396aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 39767e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getDozeSupport(Display display, bool* outSupport) 398aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 399aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 400cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getDozeSupport(display, 401aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpSupport) { 402aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 403aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 404aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 405aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 406aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 40767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outSupport = tmpSupport; 408aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 409aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 410aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 411aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 412aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 41367e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getHdrCapabilities(Display display, 41467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Hdr>* outTypes, float* outMaxLuminance, 41567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu float* outMaxAverageLuminance, float* outMinLuminance) 416aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 417aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu Error error = kDefaultError; 418cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getHdrCapabilities(display, 419aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu [&](const auto& tmpError, const auto& tmpTypes, 420aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpMaxLuminance, 421aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpMaxAverageLuminance, 422aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu const auto& tmpMinLuminance) { 423aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu error = tmpError; 424aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu if (error != Error::NONE) { 425aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return; 426aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu } 427aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 42867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outTypes = tmpTypes; 42967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outMaxLuminance = tmpMaxLuminance; 43067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outMaxAverageLuminance = tmpMaxAverageLuminance; 43167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outMinLuminance = tmpMinLuminance; 432aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu }); 433aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 434aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return error; 435aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 436aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 43767e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::getReleaseFences(Display display, 43867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 439aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 44067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takeReleaseFences(display, outLayers, outReleaseFences); 441cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 442aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 443aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 44467e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::presentDisplay(Display display, int* outPresentFence) 445aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 446cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 447cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.presentDisplay(); 448aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 449cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Error error = execute(); 450cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 451cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 452cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 453aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 45467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.takePresentFence(display, outPresentFence); 455cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 456cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 457aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 458aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 459cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setActiveConfig(Display display, Config config) 460aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 461cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setActiveConfig(display, config); 462aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 463aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 464aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 46506d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I WuError Composer::setClientTarget(Display display, uint32_t slot, 4661f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const sp<GraphicBuffer>& target, 467aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu int acquireFence, Dataspace dataspace, 468cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const std::vector<IComposerClient::Rect>& damage) 469aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 470cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 4711f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (mIsUsingVrComposer && target.get()) { 4721f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::BufferMetadata metadata = { 4731f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .width = target->getWidth(), 4741f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .height = target->getHeight(), 4751f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .stride = target->getStride(), 4761f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .layerCount = target->getLayerCount(), 4771f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .format = static_cast<PixelFormat>(target->getPixelFormat()), 4781f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .usage = target->getUsage(), 4791f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara }; 4801f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setClientTargetMetadata(metadata); 4811f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 4821f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 4831f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const native_handle_t* handle = nullptr; 4841f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (target.get()) { 4851f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara handle = target->getNativeBuffer()->handle; 4861f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 4871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 4881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage); 489cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 490aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 491aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 492cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setColorMode(Display display, ColorMode mode) 493aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 494cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setColorMode(display, mode); 495aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 496aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 497aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 498aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setColorTransform(Display display, const float* matrix, 499cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ColorTransform hint) 500aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 501cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 502cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setColorTransform(matrix, hint); 503cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 504aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 505aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 506aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setOutputBuffer(Display display, const native_handle_t* buffer, 507cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu int releaseFence) 508aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 509cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 510cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setOutputBuffer(0, buffer, dup(releaseFence)); 511cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 512cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 513aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 514cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) 515cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 516cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setPowerMode(display, mode); 517aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 518aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 519aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 520cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) 521aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 522cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setVsyncEnabled(display, enabled); 523aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 524aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 525aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 526cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setClientTargetSlotCount(Display display) 527aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 52806d63de03cb2a551ca99608f5aa0c4f3e200b0fcChia-I Wu const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS; 529cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount); 530aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu return unwrapRet(ret); 531aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 532aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 53367e376d6564f8b9f996a347c9402bdc9da789321Chia-I WuError Composer::validateDisplay(Display display, uint32_t* outNumTypes, 53467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outNumRequests) 535aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 536cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 537cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.validateDisplay(); 538aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 539cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Error error = execute(); 540cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 541cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 542cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 543aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 54467e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu mReader.hasChanges(display, outNumTypes, outNumRequests); 545cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 546cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 547aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 548aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 549249c0ae80a6e5690d091294c4447cb3facafbc37Fabien SanglardError Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes, 550249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) { 551249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mWriter.selectDisplay(display); 552249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mWriter.presentOrvalidateDisplay(); 553249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 554249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard Error error = execute(); 555249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (error != Error::NONE) { 556249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return error; 557249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 558249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 559249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mReader.takePresentOrValidateStage(display, state); 560249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 561249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (*state == 1) { // Present succeeded 562249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mReader.takePresentFence(display, outPresentFence); 563249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 564249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 565249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (*state == 0) { // Validate succeeded. 566249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mReader.hasChanges(display, outNumTypes, outNumRequests); 567249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 568249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 569249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return Error::NONE; 570249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 571249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 572aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setCursorPosition(Display display, Layer layer, 573cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu int32_t x, int32_t y) 574aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 575cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 576cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 577cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerCursorPosition(x, y); 578cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 579aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 580aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 581aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerBuffer(Display display, Layer layer, 5821f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence) 583aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 584cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 585cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 5861f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (mIsUsingVrComposer && buffer.get()) { 5871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::BufferMetadata metadata = { 5881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .width = buffer->getWidth(), 5891f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .height = buffer->getHeight(), 5901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .stride = buffer->getStride(), 5911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .layerCount = buffer->getLayerCount(), 5921f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .format = static_cast<PixelFormat>(buffer->getPixelFormat()), 5931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .usage = buffer->getUsage(), 5941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara }; 5951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setLayerBufferMetadata(metadata); 5961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 5971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 5981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const native_handle_t* handle = nullptr; 5991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (buffer.get()) { 6001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara handle = buffer->getNativeBuffer()->handle; 6011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 6021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 6031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setLayerBuffer(slot, handle, acquireFence); 604cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 605aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 606aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 607aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerSurfaceDamage(Display display, Layer layer, 608cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const std::vector<IComposerClient::Rect>& damage) 609aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 610cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 611cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 612cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerSurfaceDamage(damage); 613cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 614aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 615aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 616aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerBlendMode(Display display, Layer layer, 617cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu IComposerClient::BlendMode mode) 618aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 619cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 620cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 621cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerBlendMode(mode); 622cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 623aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 624aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 625aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerColor(Display display, Layer layer, 626cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const IComposerClient::Color& color) 627aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 628cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 629cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 630cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerColor(color); 631cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 632aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 633aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 634aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerCompositionType(Display display, Layer layer, 635cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu IComposerClient::Composition type) 636aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 637cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 638cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 639cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerCompositionType(type); 640cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 641aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 642aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 643aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerDataspace(Display display, Layer layer, 644cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Dataspace dataspace) 645aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 646cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 647cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 648cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerDataspace(dataspace); 649cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 650aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 651aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 652aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerDisplayFrame(Display display, Layer layer, 653cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const IComposerClient::Rect& frame) 654aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 655cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 656cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 657cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerDisplayFrame(frame); 658cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 659aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 660aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 661aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerPlaneAlpha(Display display, Layer layer, 662cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu float alpha) 663aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 664cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 665cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 666cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerPlaneAlpha(alpha); 667cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 668aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 669aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 670aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerSidebandStream(Display display, Layer layer, 671cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const native_handle_t* stream) 672aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 673cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 674cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 675cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerSidebandStream(stream); 676cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 677aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 678aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 679aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerSourceCrop(Display display, Layer layer, 680cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const IComposerClient::FRect& crop) 681aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 682cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 683cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 684cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerSourceCrop(crop); 685cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 686aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 687aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 688aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerTransform(Display display, Layer layer, 689cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Transform transform) 690aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 691cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 692cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 693cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerTransform(transform); 694cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 695aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 696aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 697aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I WuError Composer::setLayerVisibleRegion(Display display, Layer layer, 698cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const std::vector<IComposerClient::Rect>& visible) 699aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 700cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 701cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 702cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerVisibleRegion(visible); 703cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 704cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 705aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 706cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::setLayerZOrder(Display display, Layer layer, uint32_t z) 707cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 708cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectDisplay(display); 709cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.selectLayer(layer); 710cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.setLayerZOrder(z); 711cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NONE; 712aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 713aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 7142f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel NicoaraError Composer::setLayerInfo(Display display, Layer layer, uint32_t type, 7152f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara uint32_t appId) 7162f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara{ 71787670ffe26079eb50b62f698eb0f7bfa8ee51debHendrik Wagenaar if (mIsUsingVrComposer) { 7182f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mWriter.selectDisplay(display); 7192f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mWriter.selectLayer(layer); 7202f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara mWriter.setLayerInfo(type, appId); 7212f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara } 7222f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara return Error::NONE; 7232f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara} 7242f5f8a51f5994cf14837030d4b3b252a9d1b950bDaniel Nicoara 725cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError Composer::execute() 726aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu{ 727cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // prepare input command queue 728cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu bool queueChanged = false; 729cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t commandLength = 0; 730cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu hidl_vec<hidl_handle> commandHandles; 73167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) { 732cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.reset(); 733cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return Error::NO_RESOURCES; 734cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 735cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 736cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // set up new input command queue if necessary 737cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (queueChanged) { 738cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor()); 739cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto error = unwrapRet(ret); 740cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 741cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.reset(); 742cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 743cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 744cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 745cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 746cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu Error error = kDefaultError; 747cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->executeCommands(commandLength, commandHandles, 748cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu [&](const auto& tmpError, const auto& tmpOutChanged, 749cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const auto& tmpOutLength, const auto& tmpOutHandles) 750cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu { 751cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = tmpError; 752cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 753cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // set up new output command queue if necessary 754cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error == Error::NONE && tmpOutChanged) { 755cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = kDefaultError; 756cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mClient->getOutputCommandQueue( 757cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu [&](const auto& tmpError, 758cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const auto& tmpDescriptor) 759cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu { 760cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = tmpError; 761cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 762cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 763cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 764cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 765cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReader.setMQDescriptor(tmpDescriptor); 766cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu }); 767cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 768cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 769cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error != Error::NONE) { 770cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 771cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 772cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 773cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (mReader.readQueue(tmpOutLength, tmpOutHandles)) { 774cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = mReader.parse(); 775cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReader.reset(); 776cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } else { 777cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = Error::NO_RESOURCES; 778cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 779cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu }); 780cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 781cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (error == Error::NONE) { 782cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu std::vector<CommandReader::CommandError> commandErrors = 783cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReader.takeErrors(); 784cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 785cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu for (const auto& cmdErr : commandErrors) { 786cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto command = mWriter.getCommand(cmdErr.location); 787cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 788cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (command == IComposerClient::Command::VALIDATE_DISPLAY || 789249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard command == IComposerClient::Command::PRESENT_DISPLAY || 790249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) { 791cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu error = cmdErr.error; 792cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } else { 793cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ALOGW("command 0x%x generated error %d", 794cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu command, cmdErr.error); 795cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 796cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 797cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 798cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 799cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mWriter.reset(); 800cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 801cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return error; 802cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 803cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 804cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuCommandReader::~CommandReader() 805cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 806cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu resetData(); 807cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 808cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 809cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I WuError CommandReader::parse() 810cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 811cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu resetData(); 812cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 813cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu IComposerClient::Command command; 814cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint16_t length = 0; 815cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 816cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (!isEmpty()) { 81767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu if (!beginCommand(&command, &length)) { 818cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 819cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 820cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 821cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu bool parsed = false; 822cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu switch (command) { 823cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SELECT_DISPLAY: 824cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSelectDisplay(length); 825cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 826cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_ERROR: 827cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetError(length); 828cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 829cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES: 830cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetChangedCompositionTypes(length); 831cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 832cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_DISPLAY_REQUESTS: 833cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetDisplayRequests(length); 834cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 835cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_PRESENT_FENCE: 836cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetPresentFence(length); 837cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 838cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu case IComposerClient::Command::SET_RELEASE_FENCES: 839cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = parseSetReleaseFences(length); 840cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 841249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT: 842249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard parsed = parseSetPresentOrValidateDisplayResult(length); 843249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard break; 844cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu default: 845cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu parsed = false; 846cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 847cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 848cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 849cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu endCommand(); 850cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 851cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (!parsed) { 852cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ALOGE("failed to parse command 0x%x length %" PRIu16, 853cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu command, length); 854cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu break; 855cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 856cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 857cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 858cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return isEmpty() ? Error::NONE : Error::NO_RESOURCES; 859cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 860cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 861cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSelectDisplay(uint16_t length) 862cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 8633c9cbd48a678542f6832168f3f6371c4f717f709Daniel Nicoara if (length != CommandWriterBase::kSelectDisplayLength) { 864cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 865cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 866cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 867cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData = &mReturnData[read64()]; 868cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 869cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 870cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 871cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 872cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetError(uint16_t length) 873cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 8743c9cbd48a678542f6832168f3f6371c4f717f709Daniel Nicoara if (length != CommandWriterBase::kSetErrorLength) { 875cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 876cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 877cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 878cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto location = read(); 879cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto error = static_cast<Error>(readSigned()); 880cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 881cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mErrors.emplace_back(CommandError{location, error}); 882cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 883cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 884cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 885cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 886cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetChangedCompositionTypes(uint16_t length) 887cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 888cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // (layer id, composition type) pairs 889cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (length % 3 != 0 || !mCurrentReturnData) { 890cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 891cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 892cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 893cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t count = length / 3; 894cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->changedLayers.reserve(count); 895cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->compositionTypes.reserve(count); 896cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (count > 0) { 897cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layer = read64(); 898cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto type = static_cast<IComposerClient::Composition>(readSigned()); 899cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 900cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->changedLayers.push_back(layer); 901cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->compositionTypes.push_back(type); 902cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 903cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu count--; 904cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 905cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 906cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 907cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 908cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 909cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetDisplayRequests(uint16_t length) 910cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 911cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // display requests followed by (layer id, layer requests) pairs 912cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (length % 3 != 1 || !mCurrentReturnData) { 913cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 914cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 915cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 916cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->displayRequests = read(); 917cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 918cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t count = (length - 1) / 3; 919cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestedLayers.reserve(count); 920cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestMasks.reserve(count); 921cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (count > 0) { 922cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layer = read64(); 923cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layerRequestMask = read(); 924cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 925cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestedLayers.push_back(layer); 926cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->requestMasks.push_back(layerRequestMask); 927cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 928cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu count--; 929cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 930cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 931cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 932cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 933cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 934cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetPresentFence(uint16_t length) 935cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 9363c9cbd48a678542f6832168f3f6371c4f717f709Daniel Nicoara if (length != CommandWriterBase::kSetPresentFenceLength || 937cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu !mCurrentReturnData) { 938cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 939cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 940cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 941cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (mCurrentReturnData->presentFence >= 0) { 942cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu close(mCurrentReturnData->presentFence); 943cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 944cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->presentFence = readFence(); 945cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 946cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 947cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 948cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 949cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::parseSetReleaseFences(uint16_t length) 950cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 951cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu // (layer id, release fence index) pairs 952cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (length % 3 != 0 || !mCurrentReturnData) { 953cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 954cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 955cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 956cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu uint32_t count = length / 3; 957cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releasedLayers.reserve(count); 958cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releaseFences.reserve(count); 959cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu while (count > 0) { 960cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto layer = read64(); 961cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto fence = readFence(); 962cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 963cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releasedLayers.push_back(layer); 964cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData->releaseFences.push_back(fence); 965cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 966cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu count--; 967cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 968cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 969cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return true; 970cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 971cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 972249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglardbool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) 973249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard{ 974249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) { 975249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return false; 976249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 977249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard mCurrentReturnData->presentOrValidateState = read(); 978249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return true; 979249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 980249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 981cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::resetData() 982cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 983cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mErrors.clear(); 984cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 985cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu for (auto& data : mReturnData) { 986cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (data.second.presentFence >= 0) { 987cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu close(data.second.presentFence); 988cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 989cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu for (auto fence : data.second.releaseFences) { 990cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (fence >= 0) { 991cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu close(fence); 992cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 993cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 994cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 995cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 996cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mReturnData.clear(); 997cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu mCurrentReturnData = nullptr; 998cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 999cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1000cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wustd::vector<CommandReader::CommandError> CommandReader::takeErrors() 1001cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1002cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return std::move(mErrors); 1003cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1004cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1005cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wubool CommandReader::hasChanges(Display display, 100667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outNumChangedCompositionTypes, 100767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outNumLayerRequestMasks) const 1008cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1009cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1010cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 101167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumChangedCompositionTypes = 0; 101267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumLayerRequestMasks = 0; 1013cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return false; 1014cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1015cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1016cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu const ReturnData& data = found->second; 1017cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 101867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumChangedCompositionTypes = data.compositionTypes.size(); 101967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outNumLayerRequestMasks = data.requestMasks.size(); 1020cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1021cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return !(data.compositionTypes.empty() && data.requestMasks.empty()); 1022cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1023cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1024cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::takeChangedCompositionTypes(Display display, 102567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, 102667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<IComposerClient::Composition>* outTypes) 1027cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1028cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1029cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 103067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers->clear(); 103167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outTypes->clear(); 1032cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1033cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1034cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1035cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1036cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 103767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayers = std::move(data.changedLayers); 103867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outTypes = std::move(data.compositionTypes); 1039cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1040cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1041cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::takeDisplayRequests(Display display, 104267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 104367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<uint32_t>* outLayerRequestMasks) 1044cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1045cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1046cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 104767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outDisplayRequestMask = 0; 104867e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers->clear(); 104967e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayerRequestMasks->clear(); 1050cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1051cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1052cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1053cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1054cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 105567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outDisplayRequestMask = data.displayRequests; 105667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayers = std::move(data.requestedLayers); 105767e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayerRequestMasks = std::move(data.requestMasks); 1058cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1059cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1060cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wuvoid CommandReader::takeReleaseFences(Display display, 106167e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 1062cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1063cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1064cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 106567e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outLayers->clear(); 106667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu outReleaseFences->clear(); 1067cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1068cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1069cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1070cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1071cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 107267e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outLayers = std::move(data.releasedLayers); 107367e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outReleaseFences = std::move(data.releaseFences); 1074cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu} 1075cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 107667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wuvoid CommandReader::takePresentFence(Display display, int* outPresentFence) 1077cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu{ 1078cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu auto found = mReturnData.find(display); 1079cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu if (found == mReturnData.end()) { 108067e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outPresentFence = -1; 1081cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu return; 1082cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu } 1083cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 1084cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu ReturnData& data = found->second; 1085cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu 108667e376d6564f8b9f996a347c9402bdc9da789321Chia-I Wu *outPresentFence = data.presentFence; 1087cd8d7f08fe26645f74e540365b1a8a38e602088dChia-I Wu data.presentFence = -1; 1088aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} 1089aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 1090249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglardvoid CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) { 1091249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard auto found = mReturnData.find(display); 1092249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard if (found == mReturnData.end()) { 1093249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *state= -1; 1094249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard return; 1095249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard } 1096249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard ReturnData& data = found->second; 1097249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard *state = data.presentOrValidateState; 1098249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard} 1099249c0ae80a6e5690d091294c4447cb3facafbc37Fabien Sanglard 1100aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace Hwc2 1101aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu 1102aab99f576b205114eaa5399c8f97b9e175a1c698Chia-I Wu} // namespace android 1103