1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2010 The Android Open Source Project 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2011-2014 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 1886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu#include <atomic> 1986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <limits.h> 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <unistd.h> 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <fcntl.h> 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/properties.h> 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/mman.h> 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gr.h" 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gpu.h" 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "memalloc.h" 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "alloc_controller.h" 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <qdMetaData.h> 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace gralloc; 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define SZ_1M 0x100000 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 3686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wustatic uint64_t next_backing_store_id() 3786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu{ 3886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu static std::atomic<uint64_t> next_id(1); 3986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu return next_id++; 4086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu} 4186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjingpu_context_t::gpu_context_t(const private_module_t* module, 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IAllocController* alloc_ctrl ) : 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mAllocCtrl(alloc_ctrl) 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Zero out the alloc_device_t 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(static_cast<alloc_device_t*>(this), 0, sizeof(alloc_device_t)); 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Initialize the procs 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin common.tag = HARDWARE_DEVICE_TAG; 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin common.version = 0; 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin common.module = const_cast<hw_module_t*>(&module->base.common); 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin common.close = gralloc_close; 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin alloc = gralloc_alloc; 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin free = gralloc_free; 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_alloc_buffer(unsigned int size, int usage, 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t* pHandle, int bufferType, 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format, int width, int height) 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = 0; 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int flags = 0; 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin size = roundUpToPageSize(size); 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin alloc_data data; 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.offset = 0; 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.fd = -1; 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.base = 0; 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(format == HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED) 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.align = 8192; 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin else 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.align = getpagesize(); 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* force 1MB alignment selectively for secure buffers, MDP5 onwards */ 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef MDSS_TARGET 774f6feb11ede2708eac46d8c96d9ca2fc10b96a44Naseer Ahmed if (usage & GRALLOC_USAGE_PROTECTED) { 78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.align = ALIGN((int) data.align, SZ_1M); 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin size = ALIGN(size, data.align); 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.size = size; 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.pHandle = (uintptr_t) pHandle; 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = mAllocCtrl->allocate(data, usage); 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!err) { 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* allocate memory for enhancement data */ 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin alloc_data eData; 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eData.fd = -1; 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eData.base = 0; 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eData.offset = 0; 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eData.size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eData.pHandle = data.pHandle; 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eData.align = getpagesize(); 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int eDataUsage = GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP; 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int eDataErr = mAllocCtrl->allocate(eData, eDataUsage); 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE_IF(eDataErr, "gralloc failed for eDataErr=%s", 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin strerror(-eDataErr)); 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY) { 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY; 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ColorSpace_t colorSpace = ITU_R_601; 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_ITU_R_601; 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (bufferType == BUFFER_TYPE_VIDEO) { 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_CAMERA_WRITE) { 109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef MDSS_TARGET 110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin colorSpace = ITU_R_601_FR; 111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_ITU_R_601_FR; 112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#else 113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Per the camera spec ITU 709 format should be set only for 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // video encoding. 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // It should be set to ITU 601 full range format for any other 116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // camera buffer 117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // 118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_CAMERA_MASK) { 119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) { 120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_ITU_R_709; 121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin colorSpace = ITU_R_709; 122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_ITU_R_601_FR; 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin colorSpace = ITU_R_601_FR; 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER ) { 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_VIDEO_ENCODER; 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_CAMERA_WRITE) { 136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_CAMERA_WRITE; 137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_CAMERA_READ) { 140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_CAMERA_READ; 141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_COMPOSER) { 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_HW_COMPOSER; 145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_USAGE_HW_TEXTURE) { 148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_HW_TEXTURE; 149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY) { 152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_SECURE_DISPLAY; 153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(isMacroTileEnabled(format, usage)) { 156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_TILE_RENDERED; 157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (isUBwcEnabled(format, usage)) { 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_UBWC_ALIGNED; 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) { 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_CPU_RENDERED; 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & (GRALLOC_USAGE_HW_VIDEO_ENCODER | 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_HW_CAMERA_WRITE | 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_HW_RENDER | 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_HW_FB)) { 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_NON_CPU_WRITER; 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(false == data.uncached) { 175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= private_handle_t::PRIV_FLAGS_CACHED; 176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= data.allocType; 179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint64_t eBaseAddr = (uint64_t)(eData.base) + eData.offset; 180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t *hnd = new private_handle_t(data.fd, size, flags, 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bufferType, format, width, height, eData.fd, eData.offset, 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin eBaseAddr); 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->offset = data.offset; 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->base = (uint64_t)(data.base) + data.offset; 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->gpuaddr = 0; 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setMetaData(hnd, UPDATE_COLOR_SPACE, (void*) &colorSpace); 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *pHandle = hnd; 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE_IF(err, "gralloc failed err=%s", strerror(-err)); 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid gpu_context_t::getGrallocInformationFromFormat(int inputFormat, 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int *bufferType) 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *bufferType = BUFFER_TYPE_VIDEO; 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 202ba008b62daf056bc4322ee3693e6e79eb000c4b0Arun Kumar K.R if (isUncompressedRgbFormat(inputFormat) == TRUE) { 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // RGB formats 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *bufferType = BUFFER_TYPE_UI; 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_alloc_framebuffer_locked(int usage, 209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t* pHandle) 210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_module_t* m = reinterpret_cast<private_module_t*>(common.module); 212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // we don't support framebuffer allocations with graphics heap flags 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (usage & GRALLOC_HEAP_MASK) { 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (m->framebuffer == NULL) { 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Invalid framebuffer", __FUNCTION__); 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const unsigned int bufferMask = m->bufferMask; 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const uint32_t numBuffers = m->numBuffers; 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int bufferSize = m->finfo.line_length * m->info.yres; 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //adreno needs FB size to be page aligned 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bufferSize = roundUpToPageSize(bufferSize); 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (numBuffers == 1) { 231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // If we have only one buffer, we never use page-flipping. Instead, 232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // we return a regular buffer which will be memcpy'ed to the main 233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // screen when post is called. 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int newUsage = (usage & ~GRALLOC_USAGE_HW_FB) | GRALLOC_USAGE_HW_2D; 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return gralloc_alloc_buffer(bufferSize, newUsage, pHandle, BUFFER_TYPE_UI, 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin m->fbFormat, m->info.xres, m->info.yres); 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (bufferMask >= ((1LU<<numBuffers)-1)) { 240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // We ran out of buffers. 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -ENOMEM; 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // create a "fake" handle for it 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint64_t vaddr = uint64_t(m->framebuffer->base); 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // As GPU needs ION FD, the private handle is created 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // using ION fd and ION flags are set 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = new private_handle_t( 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin dup(m->framebuffer->fd), bufferSize, 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t::PRIV_FLAGS_USES_ION | 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t::PRIV_FLAGS_FRAMEBUFFER, 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin BUFFER_TYPE_UI, m->fbFormat, m->info.xres, 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin m->info.yres); 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // find a free slot 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for (uint32_t i=0 ; i<numBuffers ; i++) { 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if ((bufferMask & (1LU<<i)) == 0) { 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin m->bufferMask |= (uint32_t)(1LU<<i); 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vaddr += bufferSize; 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->base = vaddr; 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->offset = (unsigned int)(vaddr - m->framebuffer->base); 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *pHandle = hnd; 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_alloc_framebuffer(int usage, 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t* pHandle) 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_module_t* m = reinterpret_cast<private_module_t*>(common.module); 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin pthread_mutex_lock(&m->lock); 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = gralloc_alloc_framebuffer_locked(usage, pHandle); 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin pthread_mutex_unlock(&m->lock); 277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::alloc_impl(int w, int h, int format, int usage, 281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t* pHandle, int* pStride, 282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int bufferSize) { 283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!pHandle || !pStride) 284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int size; 287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int alignedw, alignedh; 288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int grallocFormat = format; 289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int bufferType; 290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //If input format is HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED then based on 292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //the usage bits, gralloc assigns a format. 293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED || 294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin grallocFormat = HAL_PIXEL_FORMAT_NV12_ENCODEABLE; //NV12 297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin else if((usage & GRALLOC_USAGE_HW_CAMERA_MASK) 298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin == GRALLOC_USAGE_HW_CAMERA_ZSL) 299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin grallocFormat = HAL_PIXEL_FORMAT_NV21_ZSL; //NV21 ZSL 300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin else if(usage & GRALLOC_USAGE_HW_CAMERA_READ) 301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; //NV21 302516f7082460f7fcef8ba1ac9e8e13d5949c28370Ranjith Kagathi Ananda else if(usage & GRALLOC_USAGE_HW_CAMERA_WRITE) { 303516f7082460f7fcef8ba1ac9e8e13d5949c28370Ranjith Kagathi Ananda if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 304d1201a9e62b798cc72f4466662026b7829be86e6Nagesh Subba Reddy grallocFormat = HAL_PIXEL_FORMAT_NV21_ZSL; //NV21 305516f7082460f7fcef8ba1ac9e8e13d5949c28370Ranjith Kagathi Ananda } else { 306516f7082460f7fcef8ba1ac9e8e13d5949c28370Ranjith Kagathi Ananda grallocFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS; //NV12 preview 307516f7082460f7fcef8ba1ac9e8e13d5949c28370Ranjith Kagathi Ananda } 308516f7082460f7fcef8ba1ac9e8e13d5949c28370Ranjith Kagathi Ananda } else if(usage & GRALLOC_USAGE_HW_COMPOSER) 309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //XXX: If we still haven't set a format, default to RGBA8888 310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin grallocFormat = HAL_PIXEL_FORMAT_RGBA_8888; 311d1201a9e62b798cc72f4466662026b7829be86e6Nagesh Subba Reddy else if(format == HAL_PIXEL_FORMAT_YCbCr_420_888) 312d1201a9e62b798cc72f4466662026b7829be86e6Nagesh Subba Reddy //If no other usage flags are detected, default the 313d1201a9e62b798cc72f4466662026b7829be86e6Nagesh Subba Reddy //flexible YUV format to NV21_ZSL 314d1201a9e62b798cc72f4466662026b7829be86e6Nagesh Subba Reddy grallocFormat = HAL_PIXEL_FORMAT_NV21_ZSL; 315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin getGrallocInformationFromFormat(grallocFormat, &bufferType); 318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin size = getBufferSizeAndDimensions(w, h, grallocFormat, usage, alignedw, 319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin alignedh); 320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if ((unsigned int)size <= 0) 322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin size = (bufferSize >= size)? bufferSize : size; 324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool useFbMem = false; 326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin char property[PROPERTY_VALUE_MAX]; 327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if((usage & GRALLOC_USAGE_HW_FB) && 328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (property_get("debug.gralloc.map_fb_memory", property, NULL) > 0) && 329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin useFbMem = true; 332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = 0; 335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(useFbMem) { 336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = gralloc_alloc_framebuffer(usage, pHandle); 337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = gralloc_alloc_buffer(size, usage, pHandle, bufferType, 339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin grallocFormat, alignedw, alignedh); 340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (err < 0) { 343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 345054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 34686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu auto hnd = (private_handle_t*) *pHandle; 34786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu hnd->backing_store = next_backing_store_id(); 34886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu hnd->original_width = w; 34986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu hnd->original_format = format; 35086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu 351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *pStride = alignedw; 352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::free_impl(private_handle_t const* hnd) { 356054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_module_t* m = reinterpret_cast<private_module_t*>(common.module); 357054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) { 358054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const unsigned int bufferSize = m->finfo.line_length * m->info.yres; 359054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int index = (unsigned int) ((hnd->base - m->framebuffer->base) 360054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin / bufferSize); 361054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin m->bufferMask &= (uint32_t)~(1LU<<index); 362054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 364054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin terminateBuffer(&m->base, const_cast<private_handle_t*>(hnd)); 365054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin IMemAlloc* memalloc = mAllocCtrl->getAllocator(hnd->flags); 366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err = memalloc->free_buffer((void*)hnd->base, hnd->size, 367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->offset, hnd->fd); 368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(err) 369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // free the metadata space 371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = memalloc->free_buffer((void*)hnd->base_metadata, 373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin size, hnd->offset_metadata, 374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin hnd->fd_metadata); 375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (err) 376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return err; 377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delete hnd; 379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_alloc(alloc_device_t* dev, int w, int h, int format, 383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int usage, buffer_handle_t* pHandle, 384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int* pStride) 385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!dev) { 387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin gpu_context_t* gpu = reinterpret_cast<gpu_context_t*>(dev); 390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return gpu->alloc_impl(w, h, format, usage, pHandle, pStride, 0); 391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_alloc_size(alloc_device_t* dev, int w, int h, 393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int format, int usage, 394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t* pHandle, int* pStride, 395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int bufferSize) 396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!dev) { 398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin gpu_context_t* gpu = reinterpret_cast<gpu_context_t*>(dev); 401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return gpu->alloc_impl(w, h, format, usage, pHandle, pStride, bufferSize); 402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_free(alloc_device_t* dev, 406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin buffer_handle_t handle) 407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (private_handle_t::validate(handle) < 0) 409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle); 412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin gpu_context_t* gpu = reinterpret_cast<gpu_context_t*>(dev); 413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return gpu->free_impl(hnd); 414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gpu_context_t::gralloc_close(struct hw_device_t *dev) 419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin gpu_context_t* ctx = reinterpret_cast<gpu_context_t*>(dev); 421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx) { 422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* TODO: keep a list of all buffer_handle_t created, and free them 423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * all here. 424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delete ctx; 426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 430