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