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 17939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#ifndef ANDROID_HARDWARE_GRALLOC_1_ON_0_ADAPTER_H 18939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#define ANDROID_HARDWARE_GRALLOC_1_ON_0_ADAPTER_H 19731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 20731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <hardware/gralloc1.h> 21939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <log/log.h> 22731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 23939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <atomic> 24939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <memory> 25731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <mutex> 26731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <string> 27731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <unordered_map> 28939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <utility> 29731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 30731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wustruct gralloc_module_t; 31939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wustruct alloc_device_t; 32731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 33731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wunamespace android { 34939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wunamespace hardware { 35731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 36731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wuclass Gralloc1On0Adapter : public gralloc1_device_t 37731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{ 38731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wupublic: 39731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu Gralloc1On0Adapter(const hw_module_t* module); 40731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ~Gralloc1On0Adapter(); 41731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 42731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_device_t* getDevice() { 43731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<gralloc1_device_t*>(this); 44731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 45731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 46731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wuprivate: 47731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static inline Gralloc1On0Adapter* getAdapter(gralloc1_device_t* device) { 48731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<Gralloc1On0Adapter*>(device); 49731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 50731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 51939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static int closeHook(struct hw_device_t* device) { 52939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu delete getAdapter(reinterpret_cast<gralloc1_device_t*>(device)); 53939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return 0; 54939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 55939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu 56731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // getCapabilities 57731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 58731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu void doGetCapabilities(uint32_t* outCount, 59731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t* /*gralloc1_capability_t*/ outCapabilities); 60731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static void getCapabilitiesHook(gralloc1_device_t* device, 61731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint32_t* outCount, 62731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t* /*gralloc1_capability_t*/ outCapabilities) { 63731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu getAdapter(device)->doGetCapabilities(outCount, outCapabilities); 64731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 65731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 66731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // getFunction 67731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 68731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_function_pointer_t doGetFunction( 69731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t /*gralloc1_function_descriptor_t*/ descriptor); 70731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static gralloc1_function_pointer_t getFunctionHook( 71731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_device_t* device, 72731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t /*gralloc1_function_descriptor_t*/ descriptor) { 73731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return getAdapter(device)->doGetFunction(descriptor); 74731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 75731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 76731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // dump 77731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 78731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu void dump(uint32_t* outSize, char* outBuffer); 79731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static void dumpHook(gralloc1_device_t* device, uint32_t* outSize, 80731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu char* outBuffer) { 81731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return getAdapter(device)->dump(outSize, outBuffer); 82731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 83731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::string mCachedDump; 84731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 85731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Buffer descriptor lifecycle functions 86731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 87731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu struct Descriptor; 88731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 89731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t createDescriptor( 90731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t* outDescriptor); 91731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t createDescriptorHook(gralloc1_device_t* device, 92731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t* outDescriptor) { 93731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = getAdapter(device)->createDescriptor(outDescriptor); 94731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 95731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 96731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 97731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t destroyDescriptor(gralloc1_buffer_descriptor_t descriptor); 98731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t destroyDescriptorHook(gralloc1_device_t* device, 99731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptor) { 100731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = getAdapter(device)->destroyDescriptor(descriptor); 101731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 102731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 103731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 104731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Buffer descriptor modification functions 105731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 106731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu struct Descriptor : public std::enable_shared_from_this<Descriptor> { 107939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu Descriptor() 108939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu : width(0), 109731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu height(0), 110731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu format(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED), 111731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu layerCount(1), 112731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu producerUsage(GRALLOC1_PRODUCER_USAGE_NONE), 113731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu consumerUsage(GRALLOC1_CONSUMER_USAGE_NONE) {} 114731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 115731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t setDimensions(uint32_t w, uint32_t h) { 116731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu width = w; 117731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu height = h; 118731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 119731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 120731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 121731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t setFormat(int32_t f) { 122731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu format = f; 123731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 124731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 125731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 126731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t setLayerCount(uint32_t lc) { 127731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu layerCount = lc; 128731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 129731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 130731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 131731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t setProducerUsage(gralloc1_producer_usage_t usage) { 132731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu producerUsage = usage; 133731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 134731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 135731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 136731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t setConsumerUsage(gralloc1_consumer_usage_t usage) { 137731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu consumerUsage = usage; 138731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 139731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 140731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 141731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint32_t width; 142731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint32_t height; 143731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t format; 144731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint32_t layerCount; 145731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_producer_usage_t producerUsage; 146731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t consumerUsage; 147731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu }; 148731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 149731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu template <typename ...Args> 150731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t callDescriptorFunction(gralloc1_device_t* device, 151731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId, 152731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t (Descriptor::*member)(Args...), Args... args) { 153731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto descriptor = getAdapter(device)->getDescriptor(descriptorId); 154731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!descriptor) { 155731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_DESCRIPTOR); 156731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 157731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = ((*descriptor).*member)(std::forward<Args>(args)...); 158731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 159731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 160731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 161731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t setConsumerUsageHook(gralloc1_device_t* device, 162731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) { 163731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto usage = static_cast<gralloc1_consumer_usage_t>(intUsage); 164731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return callDescriptorFunction(device, descriptorId, 165731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Descriptor::setConsumerUsage, usage); 166731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 167731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 168731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t setDimensionsHook(gralloc1_device_t* device, 169731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId, uint32_t width, 170731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint32_t height) { 171731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return callDescriptorFunction(device, descriptorId, 172731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Descriptor::setDimensions, width, height); 173731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 174731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 175731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t setFormatHook(gralloc1_device_t* device, 176731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId, int32_t format) { 177731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return callDescriptorFunction(device, descriptorId, 178731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Descriptor::setFormat, format); 179731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 180731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 181731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t setLayerCountHook(gralloc1_device_t* device, 182731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId, uint32_t layerCount) { 183731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return callDescriptorFunction(device, descriptorId, 184731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Descriptor::setLayerCount, layerCount); 185731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 186731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 187731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t setProducerUsageHook(gralloc1_device_t* device, 188731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) { 189731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto usage = static_cast<gralloc1_producer_usage_t>(intUsage); 190731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return callDescriptorFunction(device, descriptorId, 191731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Descriptor::setProducerUsage, usage); 192731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 193731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 194731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Buffer handle query functions 195731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 196731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu class Buffer { 197731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu public: 198731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu Buffer(buffer_handle_t handle, gralloc1_backing_store_t store, 199731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const Descriptor& descriptor, uint32_t stride, 200939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint32_t numFlexPlanes, bool wasAllocated); 201731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 202731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t getHandle() const { return mHandle; } 203731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 204731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu void retain() { ++mReferenceCount; } 205731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 206731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Returns true if the reference count has dropped to 0, indicating that 207731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // the buffer needs to be released 208731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bool release() { return --mReferenceCount == 0; } 209731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 210731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bool wasAllocated() const { return mWasAllocated; } 211731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 212731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getBackingStore( 213731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_backing_store_t* outStore) const { 214731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outStore = mStore; 215731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 216731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 217731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 218731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getConsumerUsage( 219731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t* outUsage) const { 220731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outUsage = mDescriptor.consumerUsage; 221731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 222731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 223731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 224731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getDimensions(uint32_t* outWidth, 225731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint32_t* outHeight) const { 226731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outWidth = mDescriptor.width; 227731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outHeight = mDescriptor.height; 228731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 229731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 230731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 231731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getFormat(int32_t* outFormat) const { 232731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outFormat = mDescriptor.format; 233731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 234731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 235731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 236731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getLayerCount(uint32_t* outLayerCount) const { 237731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outLayerCount = mDescriptor.layerCount; 238731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 239731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 240731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 241731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getNumFlexPlanes(uint32_t* outNumPlanes) const { 242939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *outNumPlanes = mNumFlexPlanes; 243731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 244731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 245731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 246731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getProducerUsage( 247731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_producer_usage_t* outUsage) const { 248731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outUsage = mDescriptor.producerUsage; 249731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 250731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 251731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 252731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t getStride(uint32_t* outStride) const { 253731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outStride = mStride; 254731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return GRALLOC1_ERROR_NONE; 255731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 256731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 257731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu private: 258731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 259731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const buffer_handle_t mHandle; 260731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu size_t mReferenceCount; 261731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 262731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const gralloc1_backing_store_t mStore; 263731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const Descriptor mDescriptor; 264731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const uint32_t mStride; 265939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu const uint32_t mNumFlexPlanes; 266731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 267731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Whether this buffer allocated in this process (as opposed to just 268731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // being retained here), which determines whether to free or unregister 269731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // the buffer when this Buffer is released 270731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const bool mWasAllocated; 271731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu }; 272731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 273731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu template <typename ...Args> 274731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t callBufferFunction(gralloc1_device_t* device, 275731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle, 276731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t (Buffer::*member)(Args...) const, Args... args) { 277731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto buffer = getAdapter(device)->getBuffer(bufferHandle); 278731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!buffer) { 279731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 280731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 281731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = ((*buffer).*member)(std::forward<Args>(args)...); 282731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 283731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 284731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 285731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu template <typename MF, MF memFunc, typename ...Args> 286731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t bufferHook(gralloc1_device_t* device, 287731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle, Args... args) { 288731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return Gralloc1On0Adapter::callBufferFunction(device, bufferHandle, 289731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu memFunc, std::forward<Args>(args)...); 290731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 291731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 292731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t getConsumerUsageHook(gralloc1_device_t* device, 293731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle, uint64_t* outUsage) { 294731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto usage = GRALLOC1_CONSUMER_USAGE_NONE; 295731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = callBufferFunction(device, bufferHandle, 296731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getConsumerUsage, &usage); 297939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (error == GRALLOC1_ERROR_NONE) { 298731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outUsage = static_cast<uint64_t>(usage); 299731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 300731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return error; 301731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 302731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 303731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t getProducerUsageHook(gralloc1_device_t* device, 304731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle, uint64_t* outUsage) { 305731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto usage = GRALLOC1_PRODUCER_USAGE_NONE; 306731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = callBufferFunction(device, bufferHandle, 307731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu &Buffer::getProducerUsage, &usage); 308939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu if (error == GRALLOC1_ERROR_NONE) { 309731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *outUsage = static_cast<uint64_t>(usage); 310731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 311731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return error; 312731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 313731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 314731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Buffer management functions 315731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 316731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t allocate( 317939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu gralloc1_buffer_descriptor_t id, 318731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Descriptor>& descriptor, 319731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t* outBufferHandle); 320939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static int32_t allocateHook(gralloc1_device* device, 321939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu uint32_t numDescriptors, 322939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu const gralloc1_buffer_descriptor_t* descriptors, 323939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu buffer_handle_t* outBuffers); 324731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 325731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t retain(const std::shared_ptr<Buffer>& buffer); 326939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu gralloc1_error_t retain(buffer_handle_t bufferHandle); 327939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static int32_t retainHook(gralloc1_device_t* device, 328939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu buffer_handle_t bufferHandle) 329939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu { 330939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu auto adapter = getAdapter(device); 331939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu return adapter->retain(bufferHandle); 332939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu } 333731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 334939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu gralloc1_error_t release(const std::shared_ptr<Buffer>& buffer); 335939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu static int32_t releaseHook(gralloc1_device_t* device, 336731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle) { 337731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto adapter = getAdapter(device); 338731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 339731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto buffer = adapter->getBuffer(bufferHandle); 340731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!buffer) { 341731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 342731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 343731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 344939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu auto error = adapter->release(buffer); 345731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 346731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 347731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 348731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Buffer access functions 349731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 350731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t lock(const std::shared_ptr<Buffer>& buffer, 351731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_producer_usage_t producerUsage, 352731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t consumerUsage, 353731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const gralloc1_rect_t& accessRegion, void** outData, 354939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int acquireFence); 355731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t lockFlex(const std::shared_ptr<Buffer>& buffer, 356731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_producer_usage_t producerUsage, 357731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t consumerUsage, 358731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const gralloc1_rect_t& accessRegion, 359731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu struct android_flex_layout* outFlex, 360939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int acquireFence); 361731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 362731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu template <typename OUT, gralloc1_error_t (Gralloc1On0Adapter::*member)( 363731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const std::shared_ptr<Buffer>&, gralloc1_producer_usage_t, 364731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_consumer_usage_t, const gralloc1_rect_t&, OUT*, 365939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int)> 366731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t lockHook(gralloc1_device_t* device, 367731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle, 368731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint64_t /*gralloc1_producer_usage_t*/ uintProducerUsage, 369731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint64_t /*gralloc1_consumer_usage_t*/ uintConsumerUsage, 370731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const gralloc1_rect_t* accessRegion, OUT* outData, 371731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu int32_t acquireFenceFd) { 372731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto adapter = getAdapter(device); 373731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 374731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Exactly one of producer and consumer usage must be *_USAGE_NONE, 375731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // but we can't check this until the upper levels of the framework 376731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // correctly distinguish between producer and consumer usage 377731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu /* 378731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bool hasProducerUsage = 379731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uintProducerUsage != GRALLOC1_PRODUCER_USAGE_NONE; 380731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu bool hasConsumerUsage = 381731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uintConsumerUsage != GRALLOC1_CONSUMER_USAGE_NONE; 382731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (hasProducerUsage && hasConsumerUsage || 383731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu !hasProducerUsage && !hasConsumerUsage) { 384731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 385731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 386731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu */ 387731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 388731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto producerUsage = 389731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_cast<gralloc1_producer_usage_t>(uintProducerUsage); 390731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto consumerUsage = 391731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static_cast<gralloc1_consumer_usage_t>(uintConsumerUsage); 392731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 393731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!outData) { 394731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const auto producerCpuUsage = GRALLOC1_PRODUCER_USAGE_CPU_READ | 395731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu GRALLOC1_PRODUCER_USAGE_CPU_WRITE; 396731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if ((producerUsage & producerCpuUsage) != 0) { 397731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 398731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 399731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if ((consumerUsage & GRALLOC1_CONSUMER_USAGE_CPU_READ) != 0) { 400731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 401731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 402731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 403731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 404731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto buffer = adapter->getBuffer(bufferHandle); 405731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!buffer) { 406731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 407731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 408731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 409731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!accessRegion) { 410731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu ALOGE("accessRegion is null"); 411731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 412731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 413731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 414731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = ((*adapter).*member)(buffer, producerUsage, consumerUsage, 415939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *accessRegion, outData, acquireFenceFd); 416731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 417731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 418731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 419731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_error_t unlock(const std::shared_ptr<Buffer>& buffer, 420939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int* outReleaseFence); 421731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static int32_t unlockHook(gralloc1_device_t* device, 422731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu buffer_handle_t bufferHandle, int32_t* outReleaseFenceFd) { 423731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto adapter = getAdapter(device); 424731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 425731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto buffer = adapter->getBuffer(bufferHandle); 426731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (!buffer) { 427731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 428731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 429731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 430939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu int releaseFence = -1; 431731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu auto error = adapter->unlock(buffer, &releaseFence); 432731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu if (error == GRALLOC1_ERROR_NONE) { 433939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu *outReleaseFenceFd = releaseFence; 434731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 435731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu return static_cast<int32_t>(error); 436731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu } 437731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 438731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu // Adapter internals 439731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu const gralloc_module_t* mModule; 440731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu uint8_t mMinorVersion; 441731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu alloc_device_t* mDevice; 442731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 443731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::shared_ptr<Descriptor> getDescriptor( 444731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu gralloc1_buffer_descriptor_t descriptorId); 445731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::shared_ptr<Buffer> getBuffer(buffer_handle_t bufferHandle); 446731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 447731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu static std::atomic<gralloc1_buffer_descriptor_t> sNextBufferDescriptorId; 448731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::mutex mDescriptorMutex; 449731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::unordered_map<gralloc1_buffer_descriptor_t, 450731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::shared_ptr<Descriptor>> mDescriptors; 451731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::mutex mBufferMutex; 452731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu std::unordered_map<buffer_handle_t, std::shared_ptr<Buffer>> mBuffers; 453731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu}; 454731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 455939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu} // namespace hardware 456731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} // namespace android 457731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu 458939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#endif // ANDROID_HARDWARE_GRALLOC_1_ON_0_ADAPTER_H 459