15bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu/*
25bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * Copyright 2016 The Android Open Source Project
35bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu *
45bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
55bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * you may not use this file except in compliance with the License.
65bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * You may obtain a copy of the License at
75bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu *
85bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
95bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu *
105bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * Unless required by applicable law or agreed to in writing, software
115bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
125bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * See the License for the specific language governing permissions and
145bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu * limitations under the License.
155bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu */
165bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
175bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#define LOG_TAG "Gralloc2"
185bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
195dac7819ac9461c14f0b7c208597579c5c3fb814Jesse Hall#include <hidl/ServiceManagement.h>
20d8091b9331b17d4a6d5d3ec04e161b7956f67cb8Chia-I Wu#include <hwbinder/IPCThreadState.h>
215bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#include <ui/Gralloc2.h>
225bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
23e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner#include <inttypes.h>
245bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#include <log/log.h>
255bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#pragma clang diagnostic push
265bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#pragma clang diagnostic ignored "-Wzero-length-array"
275bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#include <sync/sync.h>
285bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#pragma clang diagnostic pop
295bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
305bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wunamespace android {
315bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
325bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wunamespace Gralloc2 {
335bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
34e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donnernamespace {
35e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
365bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wustatic constexpr Error kTransactionError = Error::NO_RESOURCES;
375bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
38e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donneruint64_t getValid10UsageBits() {
39e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    static const uint64_t valid10UsageBits = []() -> uint64_t {
40e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        using hardware::graphics::common::V1_0::BufferUsage;
41e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        uint64_t bits = 0;
42e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        for (const auto bit : hardware::hidl_enum_iterator<BufferUsage>()) {
43e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner            bits = bits | bit;
44e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        }
45e8d3ba646cc53d115f7fd4a74475f7d6e3f5dee3Chia-I Wu        // TODO(b/72323293, b/72703005): Remove these additional bits
46e8d3ba646cc53d115f7fd4a74475f7d6e3f5dee3Chia-I Wu        bits = bits | (1 << 10) | (1 << 13);
47e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
48e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        return bits;
49e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    }();
50e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    return valid10UsageBits;
51e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner}
52e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
53e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donneruint64_t getValid11UsageBits() {
54e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    static const uint64_t valid11UsageBits = []() -> uint64_t {
55e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        using hardware::graphics::common::V1_1::BufferUsage;
56e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        uint64_t bits = 0;
57e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        for (const auto bit : hardware::hidl_enum_iterator<BufferUsage>()) {
58e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner            bits = bits | bit;
59e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        }
604f55f16638c161834d39e1581d069780f8918c2fChia-I Wu        return bits;
61e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    }();
62e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    return valid11UsageBits;
63e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner}
64e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
65e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner}  // anonymous namespace
66e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
675dac7819ac9461c14f0b7c208597579c5c3fb814Jesse Hallvoid Mapper::preload() {
685dac7819ac9461c14f0b7c208597579c5c3fb814Jesse Hall    android::hardware::preloadPassthroughService<hardware::graphics::mapper::V2_0::IMapper>();
695dac7819ac9461c14f0b7c208597579c5c3fb814Jesse Hall}
705dac7819ac9461c14f0b7c208597579c5c3fb814Jesse Hall
715bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuMapper::Mapper()
725bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
734f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    mMapper = hardware::graphics::mapper::V2_0::IMapper::getService();
74dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    if (mMapper == nullptr) {
75dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        LOG_ALWAYS_FATAL("gralloc-mapper is missing");
76dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    }
77dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    if (mMapper->isRemote()) {
785bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        LOG_ALWAYS_FATAL("gralloc-mapper must be in passthrough mode");
795bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
80dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
81dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    // IMapper 2.1 is optional
824f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    mMapperV2_1 = IMapper::castFrom(mMapper);
835bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
845bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
85e6ecb920255d4dd4182ced22c75cc7c49355b469Craig DonnerGralloc2::Error Mapper::validateBufferDescriptorInfo(
86e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        const IMapper::BufferDescriptorInfo& descriptorInfo) const {
87e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    uint64_t validUsageBits = getValid10UsageBits();
88e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    if (mMapperV2_1 != nullptr) {
89e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        validUsageBits = validUsageBits | getValid11UsageBits();
90e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    }
91e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
92e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    if (descriptorInfo.usage & ~validUsageBits) {
93e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64,
94e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner              descriptorInfo.usage & ~validUsageBits);
95e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        return Error::BAD_VALUE;
96e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    }
97e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    return Error::NONE;
98e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner}
99e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
1005bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuError Mapper::createDescriptor(
1015bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        const IMapper::BufferDescriptorInfo& descriptorInfo,
1025bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        BufferDescriptor* outDescriptor) const
1035bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
1044f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    Error error = validateBufferDescriptorInfo(descriptorInfo);
105e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    if (error != Error::NONE) {
106e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner        return error;
107e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner    }
108e6ecb920255d4dd4182ced22c75cc7c49355b469Craig Donner
1094f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    auto hidl_cb = [&](const auto& tmpError, const auto& tmpDescriptor)
1104f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                   {
1114f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                       error = tmpError;
1124f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                       if (error != Error::NONE) {
1134f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                           return;
1144f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                       }
1154f55f16638c161834d39e1581d069780f8918c2fChia-I Wu
1164f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                       *outDescriptor = tmpDescriptor;
1174f55f16638c161834d39e1581d069780f8918c2fChia-I Wu                   };
1185bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1194f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    hardware::Return<void> ret;
1204f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    if (mMapperV2_1 != nullptr) {
1214f55f16638c161834d39e1581d069780f8918c2fChia-I Wu        ret = mMapperV2_1->createDescriptor_2_1(descriptorInfo, hidl_cb);
1224f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    } else {
1234f55f16638c161834d39e1581d069780f8918c2fChia-I Wu        const hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo info = {
1244f55f16638c161834d39e1581d069780f8918c2fChia-I Wu            descriptorInfo.width,
1254f55f16638c161834d39e1581d069780f8918c2fChia-I Wu            descriptorInfo.height,
1264f55f16638c161834d39e1581d069780f8918c2fChia-I Wu            descriptorInfo.layerCount,
1274f55f16638c161834d39e1581d069780f8918c2fChia-I Wu            static_cast<hardware::graphics::common::V1_0::PixelFormat>(descriptorInfo.format),
1284f55f16638c161834d39e1581d069780f8918c2fChia-I Wu            descriptorInfo.usage,
1294f55f16638c161834d39e1581d069780f8918c2fChia-I Wu        };
1304f55f16638c161834d39e1581d069780f8918c2fChia-I Wu        ret = mMapper->createDescriptor(info, hidl_cb);
1314f55f16638c161834d39e1581d069780f8918c2fChia-I Wu    }
1325bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1335bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return (ret.isOk()) ? error : kTransactionError;
1345bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
1355bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1365bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuError Mapper::importBuffer(const hardware::hidl_handle& rawHandle,
1375bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        buffer_handle_t* outBufferHandle) const
1385bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
1395bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    Error error;
1405bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto ret = mMapper->importBuffer(rawHandle,
1415bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            [&](const auto& tmpError, const auto& tmpBuffer)
1425bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            {
1435bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                error = tmpError;
1445bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                if (error != Error::NONE) {
1455bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    return;
1465bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
1475bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1485bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                *outBufferHandle = static_cast<buffer_handle_t>(tmpBuffer);
1495bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            });
1505bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1515bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return (ret.isOk()) ? error : kTransactionError;
1525bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
1535bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1545bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wuvoid Mapper::freeBuffer(buffer_handle_t bufferHandle) const
1555bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
1565bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto buffer = const_cast<native_handle_t*>(bufferHandle);
1575bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto ret = mMapper->freeBuffer(buffer);
1585bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
1595bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto error = (ret.isOk()) ? static_cast<Error>(ret) : kTransactionError;
1605bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    ALOGE_IF(error != Error::NONE, "freeBuffer(%p) failed with %d",
1615bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            buffer, error);
1625bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
1635bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
164dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I WuError Mapper::validateBufferSize(buffer_handle_t bufferHandle,
165dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        const IMapper::BufferDescriptorInfo& descriptorInfo,
166dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        uint32_t stride) const
167dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu{
168dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    if (mMapperV2_1 == nullptr) {
169dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        return Error::NONE;
170dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    }
171dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
172dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    auto buffer = const_cast<native_handle_t*>(bufferHandle);
173dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    auto ret = mMapperV2_1->validateBufferSize(buffer, descriptorInfo, stride);
174dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
175dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    return (ret.isOk()) ? static_cast<Error>(ret) : kTransactionError;
176dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu}
177dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
178dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wuvoid Mapper::getTransportSize(buffer_handle_t bufferHandle,
179dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        uint32_t* outNumFds, uint32_t* outNumInts) const
180dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu{
181dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    *outNumFds = uint32_t(bufferHandle->numFds);
182dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    *outNumInts = uint32_t(bufferHandle->numInts);
183dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
184dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    if (mMapperV2_1 == nullptr) {
185dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        return;
186dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    }
187dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
188dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    Error error;
189dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    auto buffer = const_cast<native_handle_t*>(bufferHandle);
190dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    auto ret = mMapperV2_1->getTransportSize(buffer,
191dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu            [&](const auto& tmpError, const auto& tmpNumFds, const auto& tmpNumInts) {
192dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu                error = tmpError;
193dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu                if (error != Error::NONE) {
194dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu                    return;
195dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu                }
196dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
197dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu                *outNumFds = tmpNumFds;
198dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu                *outNumInts = tmpNumInts;
199dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu            });
200dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
201dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    if (!ret.isOk()) {
202dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu        error = kTransactionError;
203dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    }
204dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu    ALOGE_IF(error != Error::NONE, "getTransportSize(%p) failed with %d",
205dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu            buffer, error);
206dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu}
207dbbe33b95336efa74e8bb4ebcf6cba50919aa247Chia-I Wu
2085bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuError Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage,
2095bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        const IMapper::Rect& accessRegion,
2105bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        int acquireFence, void** outData) const
2115bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
2125bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto buffer = const_cast<native_handle_t*>(bufferHandle);
2135bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2145bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    // put acquireFence in a hidl_handle
2155bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    hardware::hidl_handle acquireFenceHandle;
2165bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    NATIVE_HANDLE_DECLARE_STORAGE(acquireFenceStorage, 1, 0);
2175bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    if (acquireFence >= 0) {
2185bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        auto h = native_handle_init(acquireFenceStorage, 1, 0);
2195bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        h->data[0] = acquireFence;
2205bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        acquireFenceHandle = h;
2215bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
2225bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2235bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    Error error;
2245bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto ret = mMapper->lock(buffer, usage, accessRegion, acquireFenceHandle,
2255bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            [&](const auto& tmpError, const auto& tmpData)
2265bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            {
2275bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                error = tmpError;
2285bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                if (error != Error::NONE) {
2295bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    return;
2305bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
2315bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2325bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                *outData = tmpData;
2335bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            });
2345bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2355bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    // we own acquireFence even on errors
2365bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    if (acquireFence >= 0) {
2375bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        close(acquireFence);
2385bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
2395bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2405bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return (ret.isOk()) ? error : kTransactionError;
2415bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
2425bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2435bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuError Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage,
2445bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        const IMapper::Rect& accessRegion,
2455bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        int acquireFence, YCbCrLayout* outLayout) const
2465bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
2475bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto buffer = const_cast<native_handle_t*>(bufferHandle);
2485bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2495bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    // put acquireFence in a hidl_handle
2505bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    hardware::hidl_handle acquireFenceHandle;
2515bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    NATIVE_HANDLE_DECLARE_STORAGE(acquireFenceStorage, 1, 0);
2525bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    if (acquireFence >= 0) {
2535bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        auto h = native_handle_init(acquireFenceStorage, 1, 0);
2545bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        h->data[0] = acquireFence;
2555bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        acquireFenceHandle = h;
2565bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
2575bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2585bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    Error error;
2595bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto ret = mMapper->lockYCbCr(buffer, usage, accessRegion,
2605bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            acquireFenceHandle,
2615bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            [&](const auto& tmpError, const auto& tmpLayout)
2625bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            {
2635bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                error = tmpError;
2645bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                if (error != Error::NONE) {
2655bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    return;
2665bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
2675bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2685bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                *outLayout = tmpLayout;
2695bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            });
2705bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2715bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    // we own acquireFence even on errors
2725bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    if (acquireFence >= 0) {
2735bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        close(acquireFence);
2745bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
2755bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2765bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return (ret.isOk()) ? error : kTransactionError;
2775bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
2785bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2795bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wuint Mapper::unlock(buffer_handle_t bufferHandle) const
2805bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
2815bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto buffer = const_cast<native_handle_t*>(bufferHandle);
2825bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2835bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    int releaseFence = -1;
2845bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    Error error;
2855bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto ret = mMapper->unlock(buffer,
2865bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            [&](const auto& tmpError, const auto& tmpReleaseFence)
2875bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            {
2885bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                error = tmpError;
2895bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                if (error != Error::NONE) {
2905bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    return;
2915bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
2925bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
2935bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                auto fenceHandle = tmpReleaseFence.getNativeHandle();
2945bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                if (fenceHandle && fenceHandle->numFds == 1) {
2955bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    int fd = dup(fenceHandle->data[0]);
2965bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    if (fd >= 0) {
2975bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                        releaseFence = fd;
2985bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    } else {
2995bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                        ALOGD("failed to dup unlock release fence");
3005bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                        sync_wait(fenceHandle->data[0], -1);
3015bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    }
3025bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
3035bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            });
3045bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3055bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    if (!ret.isOk()) {
3065bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        error = kTransactionError;
3075bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
3085bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3095bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    if (error != Error::NONE) {
3105bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        ALOGE("unlock(%p) failed with %d", buffer, error);
3115bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
3125bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3135bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return releaseFence;
3145bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
3155bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3165bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuAllocator::Allocator(const Mapper& mapper)
3175bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    : mMapper(mapper)
3185bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
319cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu    mAllocator = IAllocator::getService();
320cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu    if (mAllocator == nullptr) {
321cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        LOG_ALWAYS_FATAL("gralloc-alloc is missing");
3225bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    }
3235bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
3245bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3255bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wustd::string Allocator::dumpDebugInfo() const
3265bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
3275bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    std::string debugInfo;
3285bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3295bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    mAllocator->dumpDebugInfo([&](const auto& tmpDebugInfo) {
3305bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        debugInfo = tmpDebugInfo.c_str();
3315bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    });
3325bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3335bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return debugInfo;
3345bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
3355bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3365bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I WuError Allocator::allocate(BufferDescriptor descriptor, uint32_t count,
3375bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        uint32_t* outStride, buffer_handle_t* outBufferHandles) const
3385bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu{
3395bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    Error error;
3405bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    auto ret = mAllocator->allocate(descriptor, count,
3415bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            [&](const auto& tmpError, const auto& tmpStride,
3425bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                const auto& tmpBuffers) {
3435bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                error = tmpError;
3445bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                if (tmpError != Error::NONE) {
3455bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    return;
3465bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
3475bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3485bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                // import buffers
3495bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                for (uint32_t i = 0; i < count; i++) {
3505bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    error = mMapper.importBuffer(tmpBuffers[i],
3515bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                            &outBufferHandles[i]);
3525bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    if (error != Error::NONE) {
3535bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                        for (uint32_t j = 0; j < i; j++) {
3545bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                            mMapper.freeBuffer(outBufferHandles[j]);
3555bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                            outBufferHandles[j] = nullptr;
3565bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                        }
3575bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                        return;
3585bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                    }
3595bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                }
3605bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3615bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu                *outStride = tmpStride;
3625bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu            });
3635bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
364d8091b9331b17d4a6d5d3ec04e161b7956f67cb8Chia-I Wu    // make sure the kernel driver sees BC_FREE_BUFFER and closes the fds now
365d8091b9331b17d4a6d5d3ec04e161b7956f67cb8Chia-I Wu    hardware::IPCThreadState::self()->flushCommands();
366d8091b9331b17d4a6d5d3ec04e161b7956f67cb8Chia-I Wu
3675bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu    return (ret.isOk()) ? error : kTransactionError;
3685bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu}
3695bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3705bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu} // namespace Gralloc2
3715bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu
3725bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu} // namespace android
373