1731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu/* 2731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * Copyright 2016 The Android Open Source Project 3731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * 4731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License"); 5731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * you may not use this file except in compliance with the License. 6731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * You may obtain a copy of the License at 7731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * 8731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * http://www.apache.org/licenses/LICENSE-2.0 9731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * 10731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * Unless required by applicable law or agreed to in writing, software 11731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS, 12731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * See the License for the specific language governing permissions and 14731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * limitations under the License. 15731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu */ 16731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 17731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#undef LOG_TAG 18731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#define LOG_TAG "Gralloc1On0Adapter" 19731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu//#define LOG_NDEBUG 0 20731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 21939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include "Gralloc1On0Adapter.h" 22939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include "gralloc1-adapter.h" 23731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 2466ee1771a66afae08b2b8d5aad51c86cade347eeJesse Hall#include <grallocusage/GrallocUsageConversion.h> 2566ee1771a66afae08b2b8d5aad51c86cade347eeJesse Hall 26939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <hardware/gralloc.h> 27731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 284e7a3077309d33a21b08e9380573019cc7a8cffbSteven Moreland#include <log/log.h> 29939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <sync/sync.h> 30731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 31731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <inttypes.h> 32731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 33731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wutemplate <typename PFN, typename T> 34731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wustatic gralloc1_function_pointer_t asFP(T function) 35731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 36731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_assert(std::is_same<PFN, T>::value, "Incompatible function pointer"); 37731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return reinterpret_cast<gralloc1_function_pointer_t>(function); 38731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 39731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 40731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wunamespace android { 41939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wunamespace hardware { 42731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 43731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I WuGralloc1On0Adapter::Gralloc1On0Adapter(const hw_module_t* module) 44939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu : gralloc1_device_t(), 45939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule(reinterpret_cast<const gralloc_module_t*>(module)), 46731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mDevice(nullptr) 47731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 48731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Constructing"); 49939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 50939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int minor = 0; 51939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, 52939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu GRALLOC1_ADAPTER_PERFORM_GET_REAL_MODULE_API_VERSION_MINOR, 53939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu &minor); 54939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mMinorVersion = minor; 55939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 56939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu common.tag = HARDWARE_DEVICE_TAG, 57939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu common.version = HARDWARE_DEVICE_API_VERSION(0, 0), 58939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu common.module = const_cast<struct hw_module_t*>(module), 59939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu common.close = closeHook, 60939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 61731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu getCapabilities = getCapabilitiesHook; 62731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu getFunction = getFunctionHook; 63731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int error = ::gralloc_open(&(mModule->common), &mDevice); 64731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (error) { 65731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("Failed to open gralloc0 module: %d", error); 66731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 67731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Opened gralloc0 device %p", mDevice); 68731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 69731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 70731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I WuGralloc1On0Adapter::~Gralloc1On0Adapter() 71731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 72731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Destructing"); 73731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mDevice) { 74731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Closing gralloc0 device %p", mDevice); 75731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ::gralloc_close(mDevice); 76731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 77731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 78731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 79731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wuvoid Gralloc1On0Adapter::doGetCapabilities(uint32_t* outCount, 80b57dd2a00560d16937db6fd3426a7517c0d4bd6bChia-I Wu int32_t* /*outCapabilities*/) { 81939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *outCount = 0; 82731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 83731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 84731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_function_pointer_t Gralloc1On0Adapter::doGetFunction( 85731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t intDescriptor) 86731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 87731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu constexpr auto lastDescriptor = 88939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int32_t>(GRALLOC1_LAST_FUNCTION); 89731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (intDescriptor < 0 || intDescriptor > lastDescriptor) { 90731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("Invalid function descriptor"); 91731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return nullptr; 92731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 93731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 94731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto descriptor = 95731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_cast<gralloc1_function_descriptor_t>(intDescriptor); 96731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu switch (descriptor) { 97731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_DUMP: 98731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_DUMP>(dumpHook); 99731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_CREATE_DESCRIPTOR: 100731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_CREATE_DESCRIPTOR>(createDescriptorHook); 101731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR: 102731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_DESTROY_DESCRIPTOR>(destroyDescriptorHook); 103731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_SET_CONSUMER_USAGE: 104731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_SET_CONSUMER_USAGE>(setConsumerUsageHook); 105731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_SET_DIMENSIONS: 106731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_SET_DIMENSIONS>(setDimensionsHook); 107731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_SET_FORMAT: 108731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_SET_FORMAT>(setFormatHook); 109731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_SET_LAYER_COUNT: 110731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_SET_LAYER_COUNT>(setLayerCountHook); 111731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_SET_PRODUCER_USAGE: 112731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_SET_PRODUCER_USAGE>(setProducerUsageHook); 113731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_BACKING_STORE: 114731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_BACKING_STORE>( 115731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bufferHook<decltype(&Buffer::getBackingStore), 116731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getBackingStore, gralloc1_backing_store_t*>); 117731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_CONSUMER_USAGE: 118731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_CONSUMER_USAGE>(getConsumerUsageHook); 119731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_DIMENSIONS: 120731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_DIMENSIONS>( 121731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bufferHook<decltype(&Buffer::getDimensions), 122731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getDimensions, uint32_t*, uint32_t*>); 123731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_FORMAT: 124731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_FORMAT>( 125731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bufferHook<decltype(&Buffer::getFormat), 126731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getFormat, int32_t*>); 127731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_LAYER_COUNT: 128731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_LAYER_COUNT>( 129731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bufferHook<decltype(&Buffer::getLayerCount), 130731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getLayerCount, uint32_t*>); 131731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_PRODUCER_USAGE: 132731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_PRODUCER_USAGE>(getProducerUsageHook); 133731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_STRIDE: 134731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_STRIDE>( 135731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bufferHook<decltype(&Buffer::getStride), 136731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getStride, uint32_t*>); 137731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_ALLOCATE: 138731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mDevice != nullptr) { 139939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return asFP<GRALLOC1_PFN_ALLOCATE>(allocateHook); 140731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } else { 141731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return nullptr; 142731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 143731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_RETAIN: 144939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return asFP<GRALLOC1_PFN_RETAIN>(retainHook); 145731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_RELEASE: 146939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return asFP<GRALLOC1_PFN_RELEASE>(releaseHook); 147731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES: 148731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_GET_NUM_FLEX_PLANES>( 149731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bufferHook<decltype(&Buffer::getNumFlexPlanes), 150731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getNumFlexPlanes, uint32_t*>); 151731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_LOCK: 152731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_LOCK>( 153731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu lockHook<void*, &Gralloc1On0Adapter::lock>); 154731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_LOCK_FLEX: 155731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_LOCK_FLEX>( 156731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu lockHook<struct android_flex_layout, 157731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Gralloc1On0Adapter::lockFlex>); 158731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_UNLOCK: 159731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return asFP<GRALLOC1_PFN_UNLOCK>(unlockHook); 160731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu case GRALLOC1_FUNCTION_INVALID: 161731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("Invalid function descriptor"); 162731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return nullptr; 163731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 164731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 165731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("Unknown function descriptor: %d", intDescriptor); 166731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return nullptr; 167731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 168731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 169731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wuvoid Gralloc1On0Adapter::dump(uint32_t* outSize, char* outBuffer) 170731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 171731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("dump(%u (%p), %p", outSize ? *outSize : 0, outSize, outBuffer); 172731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 173731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!mDevice->dump) { 174731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // dump is optional on gralloc0 implementations 175731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outSize = 0; 176731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return; 177731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 178731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 179731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!outBuffer) { 180731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu constexpr int32_t BUFFER_LENGTH = 4096; 181731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu char buffer[BUFFER_LENGTH] = {}; 182731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mDevice->dump(mDevice, buffer, BUFFER_LENGTH); 183731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer[BUFFER_LENGTH - 1] = 0; // Ensure the buffer is null-terminated 184731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu size_t actualLength = std::strlen(buffer); 185731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mCachedDump.resize(actualLength); 186731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::copy_n(buffer, actualLength, mCachedDump.begin()); 187731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outSize = static_cast<uint32_t>(actualLength); 188731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } else { 189731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outSize = std::min(*outSize, 190731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_cast<uint32_t>(mCachedDump.size())); 191731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu outBuffer = std::copy_n(mCachedDump.cbegin(), *outSize, outBuffer); 192731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 193731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 194731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 195731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::createDescriptor( 196731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t* outDescriptor) 197731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 198731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto descriptorId = sNextBufferDescriptorId++; 199731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mDescriptorMutex); 200939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mDescriptors.emplace(descriptorId, std::make_shared<Descriptor>()); 201731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 202731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Created descriptor %" PRIu64, descriptorId); 203731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 204731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outDescriptor = descriptorId; 205731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 206731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 207731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 208731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::destroyDescriptor( 209731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptor) 210731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 211731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Destroying descriptor %" PRIu64, descriptor); 212731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 213731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mDescriptorMutex); 214731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mDescriptors.count(descriptor) == 0) { 215731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_BAD_DESCRIPTOR; 216731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 217731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 218731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mDescriptors.erase(descriptor); 219731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 220731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 221731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 222731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I WuGralloc1On0Adapter::Buffer::Buffer(buffer_handle_t handle, 223731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_backing_store_t store, const Descriptor& descriptor, 224939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint32_t stride, uint32_t numFlexPlanes, bool wasAllocated) 225731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu : mHandle(handle), 226731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mReferenceCount(1), 227731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mStore(store), 228731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mDescriptor(descriptor), 229731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mStride(stride), 230939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mNumFlexPlanes(numFlexPlanes), 231731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mWasAllocated(wasAllocated) {} 232731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 233731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::allocate( 234939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu gralloc1_buffer_descriptor_t id, 235731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Descriptor>& descriptor, 236731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t* outBufferHandle) 237731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 238939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu ALOGV("allocate(%" PRIu64 ")", id); 239731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 240731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // If this function is being called, it's because we handed out its function 241731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // pointer, which only occurs when mDevice has been loaded successfully and 242731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // we are permitted to allocate 243731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 24466ee1771a66afae08b2b8d5aad51c86cade347eeJesse Hall int usage = android_convertGralloc1To0Usage( 24566ee1771a66afae08b2b8d5aad51c86cade347eeJesse Hall descriptor->producerUsage, descriptor->consumerUsage); 246731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t handle = nullptr; 247731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int stride = 0; 248731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Calling alloc(%p, %u, %u, %i, %u)", mDevice, descriptor->width, 249731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu descriptor->height, descriptor->format, usage); 250731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = mDevice->alloc(mDevice, 251731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_cast<int>(descriptor->width), 252731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_cast<int>(descriptor->height), descriptor->format, 253731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu usage, &handle, &stride); 254731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (error != 0) { 255731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("gralloc0 allocation failed: %d (%s)", error, 256731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu strerror(-error)); 257731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NO_RESOURCES; 258731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 259731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 260939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_SET_USAGES, 261939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu handle, 262939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int>(descriptor->producerUsage), 263939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int>(descriptor->consumerUsage)); 264939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 265939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint64_t backingStore = 0; 266939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_BACKING_STORE, 267939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu handle, &backingStore); 268939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int numFlexPlanes = 0; 269939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_NUM_FLEX_PLANES, 270939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu handle, &numFlexPlanes); 271939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 272731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outBufferHandle = handle; 273939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu auto buffer = std::make_shared<Buffer>(handle, backingStore, 274939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *descriptor, stride, numFlexPlanes, true); 275731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 276731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mBufferMutex); 277731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mBuffers.emplace(handle, std::move(buffer)); 278731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 279731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 280731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 281731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 282939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wuint32_t Gralloc1On0Adapter::allocateHook(gralloc1_device* device, 283939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint32_t numDescriptors, 284939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu const gralloc1_buffer_descriptor_t* descriptors, 285939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu buffer_handle_t* outBuffers) 286731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 287939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (!outBuffers) { 288939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return GRALLOC1_ERROR_UNDEFINED; 289939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 290939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 291731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto adapter = getAdapter(device); 292731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 293939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu gralloc1_error_t error = GRALLOC1_ERROR_NONE; 294939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint32_t i; 295939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu for (i = 0; i < numDescriptors; i++) { 296939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu auto descriptor = adapter->getDescriptor(descriptors[i]); 297939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (!descriptor) { 298939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu error = GRALLOC1_ERROR_BAD_DESCRIPTOR; 299939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu break; 300939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 301939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 302939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu buffer_handle_t bufferHandle = nullptr; 303939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu error = adapter->allocate(descriptors[i], descriptor, &bufferHandle); 304939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (error != GRALLOC1_ERROR_NONE) { 305939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu break; 306939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 307939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 308939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu outBuffers[i] = bufferHandle; 309731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 310731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 311939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (error == GRALLOC1_ERROR_NONE) { 312939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (numDescriptors > 1) { 313939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu error = GRALLOC1_ERROR_NOT_SHARED; 314939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 315939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } else { 316939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu for (uint32_t j = 0; j < i; j++) { 317939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu adapter->release(adapter->getBuffer(outBuffers[j])); 318939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu outBuffers[j] = nullptr; 319939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 320731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 321731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 322731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return error; 323731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 324731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 325731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::retain( 326731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Buffer>& buffer) 327731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 328731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mBufferMutex); 329731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer->retain(); 330731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 331731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 332731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 333731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::release( 334731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Buffer>& buffer) 335731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 336731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mBufferMutex); 337731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!buffer->release()) { 338731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 339731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 340731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 341731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t handle = buffer->getHandle(); 342731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (buffer->wasAllocated()) { 343731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Calling free(%p)", handle); 344731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int result = mDevice->free(mDevice, handle); 345731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 346731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("gralloc0 free failed: %d", result); 347731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 348731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } else { 349731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("Calling unregisterBuffer(%p)", handle); 350731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int result = mModule->unregisterBuffer(mModule, handle); 351731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 352731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("gralloc0 unregister failed: %d", result); 353731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 354731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 355731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 356731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu mBuffers.erase(handle); 357731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 358731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 359731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 360939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wugralloc1_error_t Gralloc1On0Adapter::retain(buffer_handle_t bufferHandle) 361731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 362939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu ALOGV("retain(%p)", bufferHandle); 363731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 364731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mBufferMutex); 365939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 366939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (mBuffers.count(bufferHandle) != 0) { 367939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mBuffers[bufferHandle]->retain(); 368731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 369731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 370731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 371939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu ALOGV("Calling registerBuffer(%p)", bufferHandle); 372939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int result = mModule->registerBuffer(mModule, bufferHandle); 373731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 374731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("gralloc0 register failed: %d", result); 375731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NO_RESOURCES; 376731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 377731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 378939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint64_t backingStore = 0; 379939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_BACKING_STORE, 380939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &backingStore); 381939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 382939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int numFlexPlanes = 0; 383939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_NUM_FLEX_PLANES, 384939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &numFlexPlanes); 385939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 386939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int stride = 0; 387939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_STRIDE, 388939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &stride); 389939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 390939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int width = 0; 391939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int height = 0; 392939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 393939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int producerUsage = 0; 394939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int consumerUsage = 0; 395939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_DIMENSIONS, 396939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &width, &height); 397939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_FORMAT, 398939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &format); 399939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_PRODUCER_USAGE, 400939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &producerUsage); 401939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mModule->perform(mModule, GRALLOC1_ADAPTER_PERFORM_GET_CONSUMER_USAGE, 402939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu bufferHandle, &consumerUsage); 403939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 404939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu Descriptor descriptor; 405939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu descriptor.setDimensions(width, height); 406939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu descriptor.setFormat(format); 407731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu descriptor.setProducerUsage( 408939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<gralloc1_producer_usage_t>(producerUsage)); 409731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu descriptor.setConsumerUsage( 410939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<gralloc1_consumer_usage_t>(consumerUsage)); 411939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 412939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu auto buffer = std::make_shared<Buffer>(bufferHandle, backingStore, 413939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu descriptor, stride, numFlexPlanes, false); 414939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu mBuffers.emplace(bufferHandle, std::move(buffer)); 415731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 416731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 417731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 418939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wustatic void syncWaitForever(int fd, const char* logname) 419939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu{ 420939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (fd < 0) { 421939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return; 422939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 423939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 424939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu const int warningTimeout = 3500; 425939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu const int error = sync_wait(fd, warningTimeout); 426939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (error < 0 && errno == ETIME) { 427939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu ALOGE("%s: fence %d didn't signal in %u ms", logname, fd, 428939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu warningTimeout); 429939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu sync_wait(fd, -1); 430939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 431939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu} 432939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 433731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::lock( 434731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Buffer>& buffer, 435731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_producer_usage_t producerUsage, 436731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t consumerUsage, 437731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const gralloc1_rect_t& accessRegion, void** outData, 438939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int acquireFence) 439731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 440731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mMinorVersion >= 3) { 441731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int result = mModule->lockAsync(mModule, buffer->getHandle(), 44266ee1771a66afae08b2b8d5aad51c86cade347eeJesse Hall android_convertGralloc1To0Usage(producerUsage, consumerUsage), 443731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu accessRegion.left, accessRegion.top, accessRegion.width, 444939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.height, outData, acquireFence); 445731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 446731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_UNSUPPORTED; 447731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 448731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } else { 449939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu syncWaitForever(acquireFence, "Gralloc1On0Adapter::lock"); 450939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 451731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int result = mModule->lock(mModule, buffer->getHandle(), 45266ee1771a66afae08b2b8d5aad51c86cade347eeJesse Hall android_convertGralloc1To0Usage(producerUsage, consumerUsage), 453731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu accessRegion.left, accessRegion.top, accessRegion.width, 454731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu accessRegion.height, outData); 455731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGV("gralloc0 lock returned %d", result); 456731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 457731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_UNSUPPORTED; 458939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } else if (acquireFence >= 0) { 459939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu close(acquireFence); 460731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 461731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 462731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 463731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 464731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 465731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::lockFlex( 466731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Buffer>& buffer, 467731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_producer_usage_t producerUsage, 468731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t consumerUsage, 469939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu const gralloc1_rect_t& accessRegion, 470939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu struct android_flex_layout* outFlex, 471939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int acquireFence) 472731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 473939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (mMinorVersion >= 3) { 474939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int result = mModule->perform(mModule, 475939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu GRALLOC1_ADAPTER_PERFORM_LOCK_FLEX, 476939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu buffer->getHandle(), 477939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int>(producerUsage), 478939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int>(consumerUsage), 479939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.left, 480939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.top, 481939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.width, 482939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.height, 483939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu outFlex, acquireFence); 484731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 485731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_UNSUPPORTED; 486731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 487939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } else { 488939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu syncWaitForever(acquireFence, "Gralloc1On0Adapter::lockFlex"); 489939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 490939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int result = mModule->perform(mModule, 491939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu GRALLOC1_ADAPTER_PERFORM_LOCK_FLEX, 492939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu buffer->getHandle(), 493939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int>(producerUsage), 494939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static_cast<int>(consumerUsage), 495939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.left, 496939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.top, 497939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.width, 498939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu accessRegion.height, 499939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu outFlex, -1); 500731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 501731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_UNSUPPORTED; 502939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } else if (acquireFence >= 0) { 503939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu close(acquireFence); 504731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 505731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 506731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 507731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 508731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 509731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 510731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wugralloc1_error_t Gralloc1On0Adapter::unlock( 511731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Buffer>& buffer, 512939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int* outReleaseFence) 513731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 514731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mMinorVersion >= 3) { 515731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int fenceFd = -1; 516731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int result = mModule->unlockAsync(mModule, buffer->getHandle(), 517731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &fenceFd); 518731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 519731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu close(fenceFd); 520731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("gralloc0 unlockAsync failed: %d", result); 521731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } else { 522939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *outReleaseFence = fenceFd; 523731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 524731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } else { 525731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int result = mModule->unlock(mModule, buffer->getHandle()); 526731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (result != 0) { 527731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("gralloc0 unlock failed: %d", result); 528939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } else { 529939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *outReleaseFence = -1; 530731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 531731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 532731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 533731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 534731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 535731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wustd::shared_ptr<Gralloc1On0Adapter::Descriptor> 536731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I WuGralloc1On0Adapter::getDescriptor(gralloc1_buffer_descriptor_t descriptorId) 537731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 538731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mDescriptorMutex); 539731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mDescriptors.count(descriptorId) == 0) { 540731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return nullptr; 541731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 542731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 543731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return mDescriptors[descriptorId]; 544731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 545731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 546731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wustd::shared_ptr<Gralloc1On0Adapter::Buffer> Gralloc1On0Adapter::getBuffer( 547731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle) 548731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 549731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::lock_guard<std::mutex> lock(mBufferMutex); 550731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (mBuffers.count(bufferHandle) == 0) { 551731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return nullptr; 552731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 553731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 554731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return mBuffers[bufferHandle]; 555731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} 556731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 557731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wustd::atomic<gralloc1_buffer_descriptor_t> 558731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu Gralloc1On0Adapter::sNextBufferDescriptorId(1); 559731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 560939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu} // namespace hardware 561731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} // namespace android 562