11e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza/* 21e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * Copyright 2016 The Android Open Source Project 31e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * 41e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 51e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * you may not use this file except in compliance with the License. 61e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * You may obtain a copy of the License at 71e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * 81e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 91e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * 101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * Unless required by applicable law or agreed to in writing, software 111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * See the License for the specific language governing permissions and 141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * limitations under the License. 151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza */ 161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#ifndef ANDROID_UI_GRALLOC_1_ON_0_ADAPTER_H 181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#define ANDROID_UI_GRALLOC_1_ON_0_ADAPTER_H 191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <ui/Fence.h> 211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <ui/GraphicBuffer.h> 221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <hardware/gralloc1.h> 241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 25923c0668eb2427bb148a56bd1ac7834cc371d5a0Dan Stoza#include <mutex> 261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <string> 271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <unordered_map> 281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <vector> 291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastruct gralloc_module_t; 311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// This is not an "official" capability (i.e., it is not found in gralloc1.h), 331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// but we will use it to detect that we are running through the adapter, which 341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// is capable of collaborating with GraphicBuffer such that queries on a 351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// buffer_handle_t succeed 361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_CAPABILITY_ON_ADAPTER = 371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static_cast<gralloc1_capability_t>(GRALLOC1_LAST_CAPABILITY + 1); 381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_FUNCTION_RETAIN_GRAPHIC_BUFFER = 401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static_cast<gralloc1_function_descriptor_t>(GRALLOC1_LAST_FUNCTION + 1); 411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_FUNCTION_ALLOCATE_WITH_ID = 421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static_cast<gralloc1_function_descriptor_t>(GRALLOC1_LAST_FUNCTION + 2); 431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_FUNCTION_LOCK_YCBCR = 441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static_cast<gralloc1_function_descriptor_t>(GRALLOC1_LAST_FUNCTION + 3); 451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_LAST_ADAPTER_FUNCTION = GRALLOC1_FUNCTION_LOCK_YCBCR; 461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozatypedef gralloc1_error_t (*GRALLOC1_PFN_RETAIN_GRAPHIC_BUFFER)( 481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_device_t* device, const android::GraphicBuffer* buffer); 491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozatypedef gralloc1_error_t (*GRALLOC1_PFN_ALLOCATE_WITH_ID)( 501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor, 511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_backing_store_t id, buffer_handle_t* outBuffer); 521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozatypedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_LOCK_YCBCR)( 531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_device_t* device, buffer_handle_t buffer, 541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint64_t /*gralloc1_producer_usage_t*/ producerUsage, 551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint64_t /*gralloc1_consumer_usage_t*/ consumerUsage, 561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_rect_t* accessRegion, struct android_ycbcr* outYCbCr, 571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t acquireFence); 581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozanamespace android { 601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozaclass Gralloc1On0Adapter : public gralloc1_device_t 621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza{ 631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozapublic: 641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza Gralloc1On0Adapter(const hw_module_t* module); 651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza ~Gralloc1On0Adapter(); 661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_device_t* getDevice() { 681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<gralloc1_device_t*>(this); 691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozaprivate: 721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static inline Gralloc1On0Adapter* getAdapter(gralloc1_device_t* device) { 731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<Gralloc1On0Adapter*>(device); 741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // getCapabilities 771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza void doGetCapabilities(uint32_t* outCount, 791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t* /*gralloc1_capability_t*/ outCapabilities); 801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static void getCapabilitiesHook(gralloc1_device_t* device, 811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint32_t* outCount, 821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t* /*gralloc1_capability_t*/ outCapabilities) { 831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza getAdapter(device)->doGetCapabilities(outCount, outCapabilities); 841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza }; 851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // getFunction 871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_function_pointer_t doGetFunction( 891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t /*gralloc1_function_descriptor_t*/ descriptor); 901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static gralloc1_function_pointer_t getFunctionHook( 911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_device_t* device, 921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t /*gralloc1_function_descriptor_t*/ descriptor) { 931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return getAdapter(device)->doGetFunction(descriptor); 941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // dump 971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza void dump(uint32_t* outSize, char* outBuffer); 991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static void dumpHook(gralloc1_device_t* device, uint32_t* outSize, 1001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza char* outBuffer) { 1011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return getAdapter(device)->dump(outSize, outBuffer); 1021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza std::string mCachedDump; 1041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Buffer descriptor lifecycle functions 1061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza class Descriptor; 1081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t createDescriptor( 1101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t* outDescriptor); 1111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t createDescriptorHook(gralloc1_device_t* device, 1121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t* outDescriptor) { 1131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = getAdapter(device)->createDescriptor(outDescriptor); 1141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 1151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t destroyDescriptor(gralloc1_buffer_descriptor_t descriptor); 1181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t destroyDescriptorHook(gralloc1_device_t* device, 1191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptor) { 1201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = getAdapter(device)->destroyDescriptor(descriptor); 1211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 1221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Buffer descriptor modification functions 1251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza struct Descriptor : public std::enable_shared_from_this<Descriptor> { 1271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza Descriptor(Gralloc1On0Adapter* adapter, 1281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t id) 1291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza : adapter(adapter), 1301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza id(id), 1311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza width(0), 1321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza height(0), 1331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza format(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED), 1341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza producerUsage(GRALLOC1_PRODUCER_USAGE_NONE), 1351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza consumerUsage(GRALLOC1_CONSUMER_USAGE_NONE) {} 1361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t setDimensions(uint32_t w, uint32_t h) { 1381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza width = w; 1391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza height = h; 1401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 1411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t setFormat(int32_t f) { 1441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza format = f; 1451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 1461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t setProducerUsage(gralloc1_producer_usage_t usage) { 1491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza producerUsage = usage; 1501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 1511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t setConsumerUsage(gralloc1_consumer_usage_t usage) { 1541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza consumerUsage = usage; 1551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 1561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza Gralloc1On0Adapter* const adapter; 1591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_buffer_descriptor_t id; 1601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint32_t width; 1621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint32_t height; 1631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t format; 1641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_producer_usage_t producerUsage; 1651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_consumer_usage_t consumerUsage; 1661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza }; 1671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza template <typename ...Args> 1691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t callDescriptorFunction(gralloc1_device_t* device, 1701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptorId, 1711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t (Descriptor::*member)(Args...), Args... args) { 1721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto descriptor = getAdapter(device)->getDescriptor(descriptorId); 1731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!descriptor) { 1741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_DESCRIPTOR); 1751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = ((*descriptor).*member)(std::forward<Args>(args)...); 1771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 1781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t setConsumerUsageHook(gralloc1_device_t* device, 1811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) { 1821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto usage = static_cast<gralloc1_consumer_usage_t>(intUsage); 1831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return callDescriptorFunction(device, descriptorId, 1841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza &Descriptor::setConsumerUsage, usage); 1851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t setDimensionsHook(gralloc1_device_t* device, 1881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptorId, uint32_t width, 1891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint32_t height) { 1901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return callDescriptorFunction(device, descriptorId, 1911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza &Descriptor::setDimensions, width, height); 1921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 1941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t setFormatHook(gralloc1_device_t* device, 1951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptorId, int32_t format) { 1961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return callDescriptorFunction(device, descriptorId, 1971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza &Descriptor::setFormat, format); 1981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 1991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t setProducerUsageHook(gralloc1_device_t* device, 2011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) { 2021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto usage = static_cast<gralloc1_producer_usage_t>(intUsage); 2031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return callDescriptorFunction(device, descriptorId, 2041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza &Descriptor::setProducerUsage, usage); 2051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Buffer handle query functions 2081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza class Buffer { 2101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza public: 2111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza Buffer(buffer_handle_t handle, gralloc1_backing_store_t store, 2121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const Descriptor& descriptor, uint32_t stride, 2131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza bool wasAllocated); 2141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t getHandle() const { return mHandle; } 2161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza void retain() { ++mReferenceCount; } 2181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Returns true if the reference count has dropped to 0, indicating that 2201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // the buffer needs to be released 2211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza bool release() { return --mReferenceCount == 0; } 2221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza bool wasAllocated() const { return mWasAllocated; } 2241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getBackingStore( 2261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_backing_store_t* outStore) const { 2271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outStore = mStore; 2281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getConsumerUsage( 2321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_consumer_usage_t* outUsage) const { 2331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outUsage = mDescriptor.consumerUsage; 2341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getDimensions(uint32_t* outWidth, 2381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint32_t* outHeight) const { 2391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outWidth = mDescriptor.width; 2401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outHeight = mDescriptor.height; 2411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getFormat(int32_t* outFormat) const { 2451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outFormat = mDescriptor.format; 2461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getNumFlexPlanes(uint32_t* outNumPlanes) const { 2501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // TODO: This is conservative, and we could do better by examining 2511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // the format, but it won't hurt anything for now 2521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outNumPlanes = 4; 2531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getProducerUsage( 2571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_producer_usage_t* outUsage) const { 2581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outUsage = mDescriptor.producerUsage; 2591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t getStride(uint32_t* outStride) const { 2631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outStride = mStride; 2641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return GRALLOC1_ERROR_NONE; 2651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza private: 2681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const buffer_handle_t mHandle; 2701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza size_t mReferenceCount; 2711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Since we're adapting to gralloc0, there will always be a 1:1 2731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // correspondence between buffer handles and backing stores, and the 2741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // backing store ID will be the same as the GraphicBuffer unique ID 2751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_backing_store_t mStore; 2761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const Descriptor mDescriptor; 2781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const uint32_t mStride; 2791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Whether this buffer allocated in this process (as opposed to just 2811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // being retained here), which determines whether to free or unregister 2821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // the buffer when this Buffer is released 2831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const bool mWasAllocated; 2841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza }; 2851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza template <typename ...Args> 2871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t callBufferFunction(gralloc1_device_t* device, 2881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle, 2891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t (Buffer::*member)(Args...) const, Args... args) { 2901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto buffer = getAdapter(device)->getBuffer(bufferHandle); 2911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!buffer) { 2921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 2931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = ((*buffer).*member)(std::forward<Args>(args)...); 2951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 2961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 2971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 2981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza template <typename MF, MF memFunc, typename ...Args> 2991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t bufferHook(gralloc1_device_t* device, 3001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle, Args... args) { 3011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return Gralloc1On0Adapter::callBufferFunction(device, bufferHandle, 3021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza memFunc, std::forward<Args>(args)...); 3031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t getConsumerUsageHook(gralloc1_device_t* device, 3061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle, uint64_t* outUsage) { 3071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto usage = GRALLOC1_CONSUMER_USAGE_NONE; 3081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = callBufferFunction(device, bufferHandle, 3091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza &Buffer::getConsumerUsage, &usage); 3101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (error != GRALLOC1_ERROR_NONE) { 3111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outUsage = static_cast<uint64_t>(usage); 3121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return error; 3141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t getProducerUsageHook(gralloc1_device_t* device, 3171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle, uint64_t* outUsage) { 3181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto usage = GRALLOC1_PRODUCER_USAGE_NONE; 3191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = callBufferFunction(device, bufferHandle, 3201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza &Buffer::getProducerUsage, &usage); 3211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (error != GRALLOC1_ERROR_NONE) { 3221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outUsage = static_cast<uint64_t>(usage); 3231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return error; 3251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Buffer management functions 3281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // We don't provide GRALLOC1_FUNCTION_ALLOCATE, since this should always be 3301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // called through GRALLOC1_FUNCTION_ALLOCATE_WITH_ID 3311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t allocate( 3321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const std::shared_ptr<Descriptor>& descriptor, 3331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_backing_store_t id, 3341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t* outBufferHandle); 3351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static gralloc1_error_t allocateWithIdHook(gralloc1_device_t* device, 3361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptors, 3371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_backing_store_t id, buffer_handle_t* outBuffer); 3381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t retain(const std::shared_ptr<Buffer>& buffer); 3401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t release(const std::shared_ptr<Buffer>& buffer); 3411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Member function pointer 'member' will either be retain or release 3431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza template <gralloc1_error_t (Gralloc1On0Adapter::*member)( 3441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const std::shared_ptr<Buffer>& buffer)> 3451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t managementHook(gralloc1_device_t* device, 3461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle) { 3471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto adapter = getAdapter(device); 3481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto buffer = adapter->getBuffer(bufferHandle); 3501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!buffer) { 3511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 3521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = ((*adapter).*member)(buffer); 3551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 3561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t retain(const GraphicBuffer* buffer); 3591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static gralloc1_error_t retainGraphicBufferHook(gralloc1_device_t* device, 3601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const GraphicBuffer* buffer) { 3611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto adapter = getAdapter(device); 3621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return adapter->retain(buffer); 3631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 3641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Buffer access functions 3661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t lock(const std::shared_ptr<Buffer>& buffer, 3681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_producer_usage_t producerUsage, 3691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_consumer_usage_t consumerUsage, 3701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_rect_t& accessRegion, void** outData, 3711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const sp<Fence>& acquireFence); 3721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t lockFlex(const std::shared_ptr<Buffer>& buffer, 3731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_producer_usage_t producerUsage, 3741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_consumer_usage_t consumerUsage, 3751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_rect_t& accessRegion, 3761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza struct android_flex_layout* outFlex, 3771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const sp<Fence>& acquireFence); 3781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t lockYCbCr(const std::shared_ptr<Buffer>& buffer, 3791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_producer_usage_t producerUsage, 3801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_consumer_usage_t consumerUsage, 3811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_rect_t& accessRegion, 3821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza struct android_ycbcr* outFlex, 3831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const sp<Fence>& acquireFence); 3841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza template <typename OUT, gralloc1_error_t (Gralloc1On0Adapter::*member)( 3861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const std::shared_ptr<Buffer>&, gralloc1_producer_usage_t, 3871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_consumer_usage_t, const gralloc1_rect_t&, OUT*, 3881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const sp<Fence>&)> 3891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t lockHook(gralloc1_device_t* device, 3901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle, 3911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint64_t /*gralloc1_producer_usage_t*/ uintProducerUsage, 3921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint64_t /*gralloc1_consumer_usage_t*/ uintConsumerUsage, 3931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc1_rect_t* accessRegion, OUT* outData, 3941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza int32_t acquireFenceFd) { 3951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto adapter = getAdapter(device); 3961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 3971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Exactly one of producer and consumer usage must be *_USAGE_NONE, 3981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // but we can't check this until the upper levels of the framework 3991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // correctly distinguish between producer and consumer usage 4001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza /* 4011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza bool hasProducerUsage = 4021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uintProducerUsage != GRALLOC1_PRODUCER_USAGE_NONE; 4031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza bool hasConsumerUsage = 4041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uintConsumerUsage != GRALLOC1_CONSUMER_USAGE_NONE; 4051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (hasProducerUsage && hasConsumerUsage || 4061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza !hasProducerUsage && !hasConsumerUsage) { 4071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 4081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza */ 4101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto producerUsage = 4121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static_cast<gralloc1_producer_usage_t>(uintProducerUsage); 4131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto consumerUsage = 4141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static_cast<gralloc1_consumer_usage_t>(uintConsumerUsage); 4151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!outData) { 4171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const auto producerCpuUsage = GRALLOC1_PRODUCER_USAGE_CPU_READ | 4181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza GRALLOC1_PRODUCER_USAGE_CPU_WRITE; 4191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (producerUsage & producerCpuUsage != 0) { 4201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 4211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (consumerUsage & GRALLOC1_CONSUMER_USAGE_CPU_READ != 0) { 4231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 4241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto buffer = adapter->getBuffer(bufferHandle); 4281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!buffer) { 4291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 4301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!accessRegion) { 4331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza ALOGE("accessRegion is null"); 4341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE); 4351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza sp<Fence> acquireFence{new Fence(acquireFenceFd)}; 4381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = ((*adapter).*member)(buffer, producerUsage, consumerUsage, 4391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *accessRegion, outData, acquireFence); 4401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 4411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_error_t unlock(const std::shared_ptr<Buffer>& buffer, 4441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza sp<Fence>* outReleaseFence); 4451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static int32_t unlockHook(gralloc1_device_t* device, 4461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza buffer_handle_t bufferHandle, int32_t* outReleaseFenceFd) { 4471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto adapter = getAdapter(device); 4481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto buffer = adapter->getBuffer(bufferHandle); 4501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (!buffer) { 4511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE); 4521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza sp<Fence> releaseFence = Fence::NO_FENCE; 4551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza auto error = adapter->unlock(buffer, &releaseFence); 4561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza if (error == GRALLOC1_ERROR_NONE) { 4571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *outReleaseFenceFd = releaseFence->dup(); 4581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza return static_cast<int32_t>(error); 4601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza } 4611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza // Adapter internals 4631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza const gralloc_module_t* mModule; 4641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza uint8_t mMinorVersion; 4651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza alloc_device_t* mDevice; 4661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza std::shared_ptr<Descriptor> getDescriptor( 4681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza gralloc1_buffer_descriptor_t descriptorId); 4691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza std::shared_ptr<Buffer> getBuffer(buffer_handle_t bufferHandle); 4701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza static std::atomic<gralloc1_buffer_descriptor_t> sNextBufferDescriptorId; 472923c0668eb2427bb148a56bd1ac7834cc371d5a0Dan Stoza std::mutex mDescriptorMutex; 4731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza std::unordered_map<gralloc1_buffer_descriptor_t, 4741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza std::shared_ptr<Descriptor>> mDescriptors; 475923c0668eb2427bb148a56bd1ac7834cc371d5a0Dan Stoza std::mutex mBufferMutex; 4761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza std::unordered_map<buffer_handle_t, std::shared_ptr<Buffer>> mBuffers; 4771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza}; 4781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza} // namespace android 4801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza 4811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#endif 482