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