1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2008 The Android Open Source Project 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License"); 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License. 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * http://www.apache.org/licenses/LICENSE-2.0 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS, 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License. 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL) 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <limits.h> 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <errno.h> 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <pthread.h> 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <unistd.h> 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <string.h> 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <stdarg.h> 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/mman.h> 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/stat.h> 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/types.h> 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/ioctl.h> 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/log.h> 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/atomic.h> 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <utils/Trace.h> 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hardware/hardware.h> 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hardware/gralloc.h> 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 3886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu#include <gralloc1-adapter.h> 3986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gralloc_priv.h" 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gr.h" 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "alloc_controller.h" 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "memalloc.h" 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <qdMetaData.h> 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace gralloc; 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Return the type of allocator - 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// these are used for mapping/unmapping 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic IMemAlloc* getAllocator(int flags) 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IMemAlloc* memalloc; 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IAllocController* alloc_ctrl = IAllocController::getInstance(); 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memalloc = alloc_ctrl->getAllocator(flags); 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return memalloc; 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 60b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmedstatic int gralloc_map_metadata(buffer_handle_t handle) { 61b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed private_handle_t* hnd = (private_handle_t*)handle; 62b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed hnd->base_metadata = 0; 63b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed IMemAlloc* memalloc = getAllocator(hnd->flags) ; 64b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed void *mappedAddress = MAP_FAILED; 65b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed unsigned int size = 0; 66b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) { 67b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed mappedAddress = MAP_FAILED; 68b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 69b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed int ret = memalloc->map_buffer(&mappedAddress, size, 70b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed hnd->offset_metadata, hnd->fd_metadata); 71b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed if(ret || mappedAddress == MAP_FAILED) { 72b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed ALOGE("Could not mmap metadata for handle %p, fd=%d (%s)", 73b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed hnd, hnd->fd_metadata, strerror(errno)); 74b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed return -errno; 75b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed } 76b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed hnd->base_metadata = uint64_t(mappedAddress) + hnd->offset_metadata; 77b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed } 78b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed return 0; 79b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed} 80b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int gralloc_map(gralloc_module_t const* module, 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle) 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!module) 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)handle; 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int size = 0; 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = 0; 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IMemAlloc* memalloc = getAllocator(hnd->flags) ; 9205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed void *mappedAddress = MAP_FAILED; 9305d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed hnd->base = 0; 9405d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed 9505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed // Dont map framebuffer and secure buffers 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) && 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) { 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin size = hnd->size; 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = memalloc->map_buffer(&mappedAddress, size, 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->offset, hnd->fd); 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(err || mappedAddress == MAP_FAILED) { 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Could not mmap handle %p, fd=%d (%s)", 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin handle, hnd->fd, strerror(errno)); 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -errno; 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->base = uint64_t(mappedAddress) + hnd->offset; 108b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed } else { 109b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed // Cannot map secure buffers or framebuffers, but still need to map 110b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed // metadata for secure buffers. 111b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed // If mapping a secure buffers fails, the framework needs to get 112b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed // an error code. 11351b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed err = -EACCES; 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 11605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed //Allow mapping of metadata for all buffers including secure ones, but not 11705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed //of framebuffer 118b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed int metadata_err = gralloc_map_metadata(handle); 119b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed if(!err) { 120b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed err = metadata_err; 121f026d04dde743a0524235ae57e2ce8ac5364d44bSteve Pfetsch } 122b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed return err; 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int gralloc_unmap(gralloc_module_t const* module, 126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle) 127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 12905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed int err = -EINVAL; 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!module) 13105d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed return err; 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)handle; 13405d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed IMemAlloc* memalloc = getAllocator(hnd->flags) ; 13505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed if(!memalloc) 13605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed return err; 13705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed 13805d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed if(hnd->base) { 13905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset); 14005d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed if (err) { 141abe67dd75cce255d3449ce9af5fa37109c83444eColin Cross ALOGE("Could not unmap memory at address %p, %s", (void*) hnd->base, 14205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed strerror(errno)); 14305d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed return -errno; 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 14505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed hnd->base = 0; 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 14705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed 14805d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed if(hnd->base_metadata) { 14905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed unsigned int size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 15005d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed err = memalloc->unmap_buffer((void*)hnd->base_metadata, 15105d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed size, hnd->offset_metadata); 15205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed if (err) { 15305d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed ALOGE("Could not unmap memory at address %p, %s", 154abe67dd75cce255d3449ce9af5fa37109c83444eColin Cross (void*) hnd->base_metadata, strerror(errno)); 15505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed return -errno; 15605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed } 15705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed hnd->base_metadata = 0; 15805d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed } 15905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic pthread_mutex_t sMapLock = PTHREAD_MUTEX_INITIALIZER; 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_register_buffer(gralloc_module_t const* module, 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle) 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!module || private_handle_t::validate(handle) < 0) 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 17551b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed 17651b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed int err = gralloc_map(module, handle); 17751b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed /* Do not fail register_buffer for secure buffers*/ 17851b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed if (err == -EACCES) 17951b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed err = 0; 18051b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed return err; 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_unregister_buffer(gralloc_module_t const* module, 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle) 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!module || private_handle_t::validate(handle) < 0) 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the buffer has been mapped during a lock operation, it's time 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * to un-map it. It's an error to be here with a locked buffer. 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * NOTE: the framebuffer is handled differently and is never unmapped. 19405d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed * Also base and base_metadata are reset. 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 19605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed return gralloc_unmap(module, handle); 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint terminateBuffer(gralloc_module_t const* module, 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd) 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!module) 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the buffer has been mapped during a lock operation, it's time 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * to un-map it. It's an error to be here with a locked buffer. 20905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed * NOTE: the framebuffer is handled differently and is never unmapped. 21005d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed * Also base and base_metadata are reset. 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 21205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed return gralloc_unmap(module, hnd); 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int gralloc_map_and_invalidate (gralloc_module_t const* module, 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle, int usage) 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!module || private_handle_t::validate(handle) < 0) 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = 0; 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)handle; 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) { 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (hnd->base == 0) { 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // we need to map for real 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin pthread_mutex_t* const lock = &sMapLock; 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin pthread_mutex_lock(lock); 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = gralloc_map(module, handle); 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin pthread_mutex_unlock(lock); 231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION and 233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->flags & private_handle_t::PRIV_FLAGS_CACHED) { 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Invalidate if CPU reads in software and there are non-CPU 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //writers. No need to do this for the metadata buffer as it is 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //only read/written in software. 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if ((usage & GRALLOC_USAGE_SW_READ_MASK) and 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (hnd->flags & private_handle_t::PRIV_FLAGS_NON_CPU_WRITER)) 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IMemAlloc* memalloc = getAllocator(hnd->flags) ; 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = memalloc->clean_buffer((void*)hnd->base, 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->size, hnd->offset, hnd->fd, 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin CACHE_INVALIDATE); 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Mark the buffer to be flushed after CPU write. 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_SW_WRITE_MASK) { 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH; 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_lock(gralloc_module_t const* module, 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle, int usage, 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int /*l*/, int /*t*/, int /*w*/, int /*h*/, 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void** vaddr) 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)handle; 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = gralloc_map_and_invalidate(module, handle, usage); 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!err) 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *vaddr = (void*)hnd->base; 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_lock_ycbcr(gralloc_module_t const* module, 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle, int usage, 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int /*l*/, int /*t*/, int /*w*/, int /*h*/, 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct android_ycbcr *ycbcr) 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)handle; 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = gralloc_map_and_invalidate(module, handle, usage); 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!err) 277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = getYUVPlaneInfo(hnd, ycbcr); 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_unlock(gralloc_module_t const* module, 282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle) 283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ATRACE_CALL(); 285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!module || private_handle_t::validate(handle) < 0) 286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = 0; 289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)handle; 290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IMemAlloc* memalloc = getAllocator(hnd->flags); 292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) { 293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = memalloc->clean_buffer((void*)hnd->base, 294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->size, hnd->offset, hnd->fd, 295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin CACHE_CLEAN); 296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH; 297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 30486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wustatic bool isYUV(private_handle_t* hnd) 30586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu{ 30686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu bool is_yuv; 30786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 30886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu switch (hnd->format) { 30986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu //Semiplanar 31086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCbCr_420_SP: 31186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCbCr_422_SP: 31286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 31386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: //Same as YCbCr_420_SP_VENUS 31486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCrCb_420_SP: 31586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCrCb_422_SP: 31686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: 31786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_NV21_ZSL: 31886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_RAW10: 31986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_RAW16: 32086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu //Planar 32186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YV12: 32286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu is_yuv = true; 32386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu break; 32486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu //Unsupported formats 32586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCbCr_422_I: 32686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCrCb_422_I: 32786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 32886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu default: 32986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu is_yuv = false; 33086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu break; 33186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } 33286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 33386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu return is_yuv; 33486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu} 33586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 33686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wustatic void ycbcr_to_flexible_layout(const struct android_ycbcr* ycbcr, 33786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu struct android_flex_layout* layout) 33886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu{ 33986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->format = FLEX_FORMAT_YCbCr; 34086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->num_planes = 3; 34186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 34286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu for (uint32_t i = 0; i < layout->num_planes; i++) { 34386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[i].bits_per_component = 8; 34486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[i].bits_used = 8; 34586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[i].h_increment = 1; 34686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[i].v_increment = 1; 34786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[i].h_subsampling = 2; 34886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[i].v_subsampling = 2; 34986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } 35086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 35186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[0].top_left = (uint8_t*)ycbcr->y; 35286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[0].component = FLEX_COMPONENT_Y; 35386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[0].v_increment = (int32_t)ycbcr->ystride; 35486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 35586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[1].top_left = (uint8_t*)ycbcr->cb; 35686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[1].component = FLEX_COMPONENT_Cb; 35786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[1].h_increment = (int32_t)ycbcr->chroma_step; 35886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[1].v_increment = (int32_t)ycbcr->cstride; 35986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 36086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[2].top_left = (uint8_t*)ycbcr->cr; 36186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[2].component = FLEX_COMPONENT_Cr; 36286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[2].h_increment = (int32_t)ycbcr->chroma_step; 36386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu layout->planes[2].v_increment = (int32_t)ycbcr->cstride; 36486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu} 36586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_perform(struct gralloc_module_t const* module, 367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int operation, ... ) 368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int res = -EINVAL; 370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin va_list args; 371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!module) 372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return res; 373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin va_start(args, operation); 375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch (operation) { 376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: 377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int fd = va_arg(args, int); 379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int size = va_arg(args, unsigned int); 380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int offset = va_arg(args, unsigned int); 381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void* base = va_arg(args, void*); 382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int width = va_arg(args, int); 383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int height = va_arg(args, int); 384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format = va_arg(args, int); 385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin native_handle_t** handle = va_arg(args, native_handle_t**); 387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)native_handle_create( 388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t::sNumFds, private_handle_t::sNumInts()); 389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->magic = private_handle_t::sMagic; 390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->fd = fd; 391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->flags = private_handle_t::PRIV_FLAGS_USES_ION; 392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->size = size; 393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->offset = offset; 394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->base = uint64_t(base) + offset; 395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->gpuaddr = 0; 396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->width = width; 397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->height = height; 398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->format = format; 399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *handle = (native_handle_t *)hnd; 400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_STRIDE: 405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int width = va_arg(args, int); 407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format = va_arg(args, int); 408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *stride = va_arg(args, int *); 409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int alignedw = 0, alignedh = 0; 410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 0, format, 0, alignedw, alignedh); 412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *stride = alignedw; 413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE: 417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = va_arg(args, private_handle_t*); 419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *stride = va_arg(args, int *); 420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (private_handle_t::validate(hnd)) { 421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return res; 422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *stride = metadata->bufferDim.sliceWidth; 426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *stride = hnd->width; 428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 430054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 431054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 432054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE: 433054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 434054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = va_arg(args, private_handle_t*); 435054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *stride = va_arg(args, int *); 436054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *height = va_arg(args, int *); 437054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (private_handle_t::validate(hnd)) { 438054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return res; 439054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 440054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 441054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 442054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *stride = metadata->bufferDim.sliceWidth; 443054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *height = metadata->bufferDim.sliceHeight; 444054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 445054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *stride = hnd->width; 446054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *height = hnd->height; 447054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 448054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 449054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 450054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 451054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES: 452054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 453054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int width = va_arg(args, int); 454054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int height = va_arg(args, int); 455054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format = va_arg(args, int); 456054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int usage = va_arg(args, int); 457054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *alignedWidth = va_arg(args, int *); 458054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *alignedHeight = va_arg(args, int *); 459054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *tileEnabled = va_arg(args,int *); 460054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *tileEnabled = isMacroTileEnabled(format, usage); 461054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 462054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin height, format, usage, *alignedWidth, *alignedHeight); 463054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 464054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 465054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 466054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE: 467054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 468054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = va_arg(args, private_handle_t*); 469054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *color_space = va_arg(args, int *); 470054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (private_handle_t::validate(hnd)) { 471054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return res; 472054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 473054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 474054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(metadata && metadata->operation & UPDATE_COLOR_SPACE) { 475054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *color_space = metadata->colorSpace; 476054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 477054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 478054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 479054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 480054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO: 481054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 482054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = va_arg(args, private_handle_t*); 483054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin android_ycbcr* ycbcr = va_arg(args, struct android_ycbcr *); 484054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!private_handle_t::validate(hnd)) { 485054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = getYUVPlaneInfo(hnd, ycbcr); 486054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 487054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 488054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 489054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case GRALLOC_MODULE_PERFORM_GET_MAP_SECURE_BUFFER_INFO: 490054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin { 491054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = va_arg(args, private_handle_t*); 492054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *map_secure_buffer = va_arg(args, int *); 493054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (private_handle_t::validate(hnd)) { 494054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return res; 495054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 496054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 497054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(metadata && metadata->operation & MAP_SECURE_BUFFER) { 498054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *map_secure_buffer = metadata->mapSecureBuffer; 499054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin res = 0; 500054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 501054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *map_secure_buffer = 0; 502054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 503054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } break; 504054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 50586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_REAL_MODULE_API_VERSION_MINOR: 50686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 50786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outMinorVersion = va_arg(args, int*); 50886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outMinorVersion = 1; // GRALLOC_MODULE_API_VERSION_0_1 50986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 51086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 51186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_SET_USAGES: 51286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 51386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 51486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto producerUsage = va_arg(args, int); 51586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto consumerUsage = va_arg(args, int); 51686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu hnd->producer_usage = producerUsage; 51786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu hnd->consumer_usage = consumerUsage; 51886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 51986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 52086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_DIMENSIONS: 52186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 52286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 52386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outWidth = va_arg(args, int*); 52486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outHeight = va_arg(args, int*); 52586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outWidth = hnd->original_width; 52686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outHeight = hnd->height; 52786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 52886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 52986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_FORMAT: 53086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 53186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 53286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outFormat = va_arg(args, int*); 53386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outFormat = hnd->original_format; 53486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 53586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 53686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_PRODUCER_USAGE: 53786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 53886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 53986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outUsage = va_arg(args, int*); 54086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outUsage = hnd->producer_usage; 54186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 54286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 54386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_CONSUMER_USAGE: 54486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 54586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 54686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outUsage = va_arg(args, int*); 54786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outUsage = hnd->consumer_usage; 54886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 54986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 55086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_BACKING_STORE: 55186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 55286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 55386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outBackingStore = va_arg(args, uint64_t*); 55486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outBackingStore = hnd->backing_store; 55586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 55686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 55786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_NUM_FLEX_PLANES: 55886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 55986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 56086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outNumFlexPlanes = va_arg(args, int*); 56186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 56286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu (void) hnd; 56386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu // for simpilicity 56486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outNumFlexPlanes = 4; 56586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 56686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 56786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_GET_STRIDE: 56886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 56986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 57086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outStride = va_arg(args, int*); 57186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu *outStride = hnd->width; 57286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 57386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 57486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu case GRALLOC1_ADAPTER_PERFORM_LOCK_FLEX: 57586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu { 57686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = va_arg(args, private_handle_t*); 57786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto producerUsage = va_arg(args, int); 57886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto consumerUsage = va_arg(args, int); 57986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto left = va_arg(args, int); 58086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto top = va_arg(args, int); 58186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto width = va_arg(args, int); 58286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto height = va_arg(args, int); 58386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto outLayout = va_arg(args, android_flex_layout*); 58486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu // always -1 58586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto acquireFence = va_arg(args, int); 58686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu (void) acquireFence; 58786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 58886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu // TODO lock RGB as a flexible format 58986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu if (!isYUV(hnd)) { 59086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu return -EINVAL; 59186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } 59286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 59386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu struct android_ycbcr ycbcr; 59486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu res = gralloc_lock_ycbcr(module, hnd, 59586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu producerUsage | consumerUsage, 59686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu left, top, width, height, &ycbcr); 59786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu if (res != 0) { 59886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu return res; 59986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } 60086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 60186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu ycbcr_to_flexible_layout(&ycbcr, outLayout); 60286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu } break; 60386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 604054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin default: 605054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 606054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 607054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin va_end(args); 608054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return res; 609054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 610