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