alloc_controller.cpp revision 29a26818d7294055539167b2fbfdaa168bcf725c
1202a77d28ac251545f6f998a974690212309b927Iliyan Malchev/* 2202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. 3202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 4202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Redistribution and use in source and binary forms, with or without 5202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * modification, are permitted provided that the following conditions are 6202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * met: 7202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * * Redistributions of source code must retain the above copyright 8202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * notice, this list of conditions and the following disclaimer. 9202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * * Redistributions in binary form must reproduce the above 10202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * copyright notice, this list of conditions and the following 11202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * disclaimer in the documentation and/or other materials provided 12202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * with the distribution. 13202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * * Neither the name of Code Aurora Forum, Inc. nor the names of its 14202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * contributors may be used to endorse or promote products derived 15202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * from this software without specific prior written permission. 16202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * 17202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28202a77d28ac251545f6f998a974690212309b927Iliyan Malchev */ 29202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 30202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <cutils/log.h> 31202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <utils/RefBase.h> 32202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <fcntl.h> 33202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "gralloc_priv.h" 34202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "alloc_controller.h" 35202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "memalloc.h" 36202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "ionalloc.h" 3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "pmemalloc.h" 38202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "ashmemalloc.h" 39202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "gr.h" 4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "qcomutils/comptype.h" 41202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 42202a77d28ac251545f6f998a974690212309b927Iliyan Malchevusing namespace gralloc; 43202a77d28ac251545f6f998a974690212309b927Iliyan Malchevusing android::sp; 44202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedconst int GRALLOC_HEAP_MASK = GRALLOC_USAGE_PRIVATE_ADSP_HEAP | 4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP | 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_SMI_HEAP | 4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP | 4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | 5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_MM_HEAP | 5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP | 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_CAMERA_HEAP; 53202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 54202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 55202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//Common functions 5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic bool canFallback(int usage, bool triedSystem) 57202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 58202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // Fallback to system heap when alloc fails unless 59202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // 1. Composition type is MDP 60202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // 2. Alloc from system heap was already tried 61202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // 3. The heap type is requsted explicitly 62202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // 4. The heap type is protected 63202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // 5. The buffer is meant for external display only 64202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(QCCompositionType::getInstance().getCompositionType() & COMPOSITION_TYPE_MDP) 66202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return false; 67202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(triedSystem) 68202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return false; 6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(usage & (GRALLOC_HEAP_MASK | GRALLOC_USAGE_PROTECTED | 7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed GRALLOC_USAGE_PRIVATE_CP_BUFFER)) 71202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return false; 72202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & (GRALLOC_HEAP_MASK | GRALLOC_USAGE_EXTERNAL_ONLY)) 73202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return false; 74202a77d28ac251545f6f998a974690212309b927Iliyan Malchev //Return true by default 75202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return true; 76202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 77202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 78202a77d28ac251545f6f998a974690212309b927Iliyan Malchevstatic bool useUncached(int usage) 79202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 80202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // System heaps cannot be uncached 81202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & (GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP | 82202a77d28ac251545f6f998a974690212309b927Iliyan Malchev GRALLOC_USAGE_PRIVATE_IOMMU_HEAP)) 83202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return false; 84202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (usage & GRALLOC_USAGE_PRIVATE_UNCACHED) 85202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return true; 86202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return false; 87202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 88202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 89202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IAllocController> IAllocController::sController = NULL; 90202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IAllocController> IAllocController::getInstance(bool useMasterHeap) 91202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 92202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(sController == NULL) { 93202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#ifdef USE_ION 94202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sController = new IonController(); 95202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#else 96202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(useMasterHeap) 97202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sController = new PmemAshmemController(); 98202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else 99202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sController = new PmemKernelController(); 100202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#endif 101202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 102202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return sController; 103202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 104202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 105202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 106202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//-------------- IonController-----------------------// 107202a77d28ac251545f6f998a974690212309b927Iliyan MalchevIonController::IonController() 108202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 109202a77d28ac251545f6f998a974690212309b927Iliyan Malchev mIonAlloc = new IonAlloc(); 110202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 111202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 112202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint IonController::allocate(alloc_data& data, int usage, 11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int compositionType) 114202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 115202a77d28ac251545f6f998a974690212309b927Iliyan Malchev int ionFlags = 0; 116202a77d28ac251545f6f998a974690212309b927Iliyan Malchev int ret; 117202a77d28ac251545f6f998a974690212309b927Iliyan Malchev bool noncontig = false; 118202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 119202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.uncached = useUncached(usage); 12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.allocType = 0; 12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 122202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP) 123202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_HEAP(ION_SF_HEAP_ID); 124202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 125202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP) { 126202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_HEAP(ION_SYSTEM_HEAP_ID); 127202a77d28ac251545f6f998a974690212309b927Iliyan Malchev noncontig = true; 128202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 129202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 130202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_IOMMU_HEAP) 131202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID); 132202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 133202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_MM_HEAP) 134202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_HEAP(ION_CP_MM_HEAP_ID); 135202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 136202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP) 137202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_HEAP(ION_CP_WB_HEAP_ID); 138202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 139202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_CAMERA_HEAP) 140202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_HEAP(ION_CAMERA_HEAP_ID); 141202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 14229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(usage & GRALLOC_USAGE_PRIVATE_CP_BUFFER) 143202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags |= ION_SECURE; 144202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 145202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_DO_NOT_MAP) 14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.allocType |= private_handle_t::PRIV_FLAGS_NOT_MAPPED; 14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed else 14829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.allocType &= ~(private_handle_t::PRIV_FLAGS_NOT_MAPPED); 149202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 150202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // if no flags are set, default to 151202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // SF + IOMMU heaps, so that bypass can work 152202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // we can fall back to system heap if 153202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // we run out. 154202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(!ionFlags) 155202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ionFlags = ION_HEAP(ION_SF_HEAP_ID) | ION_HEAP(ION_IOMMU_HEAP_ID); 156202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 157202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.flags = ionFlags; 158202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mIonAlloc->alloc_buffer(data); 15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 160202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // Fallback 16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(ret < 0 && canFallback(usage, 162202a77d28ac251545f6f998a974690212309b927Iliyan Malchev (ionFlags & ION_SYSTEM_HEAP_ID))) 163202a77d28ac251545f6f998a974690212309b927Iliyan Malchev { 164202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGW("Falling back to system heap"); 165202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.flags = ION_HEAP(ION_SYSTEM_HEAP_ID); 166202a77d28ac251545f6f998a974690212309b927Iliyan Malchev noncontig = true; 167202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mIonAlloc->alloc_buffer(data); 168202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 169202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 170202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ret >= 0 ) { 17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.allocType |= private_handle_t::PRIV_FLAGS_USES_ION; 172202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(noncontig) 173202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM; 174202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ionFlags & ION_SECURE) 175202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType |= private_handle_t::PRIV_FLAGS_SECURE_BUFFER; 176202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 177202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 178202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return ret; 179202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 180202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 181202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IMemAlloc> IonController::getAllocator(int flags) 182202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 183202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sp<IMemAlloc> memalloc; 184202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (flags & private_handle_t::PRIV_FLAGS_USES_ION) { 185202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = mIonAlloc; 186202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } else { 187202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags); 188202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 189202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 190202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return memalloc; 191202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 192202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 193202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//-------------- PmemKernelController-----------------------// 19429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//XXX: Remove - we're not using pmem anymore 19529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#if 0 196202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemKernelController::PmemKernelController() 197202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 19829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mPmemAdspAlloc = new PmemKernelAlloc(DEVICE_PMEM_ADSP); 19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed // XXX: Right now, there is no need to maintain an instance 20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed // of the SMI allocator as we need it only in a few cases 201202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 202202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 203202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemKernelController::~PmemKernelController() 204202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 205202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 206202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 207202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint PmemKernelController::allocate(alloc_data& data, int usage, 20829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int compositionType) 209202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 210202a77d28ac251545f6f998a974690212309b927Iliyan Malchev int ret = 0; 211202a77d28ac251545f6f998a974690212309b927Iliyan Malchev bool adspFallback = false; 212202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (!(usage & GRALLOC_USAGE_PRIVATE_SMI_HEAP)) 213202a77d28ac251545f6f998a974690212309b927Iliyan Malchev adspFallback = true; 214202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 215202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // Try SMI first 216202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if ((usage & GRALLOC_USAGE_PRIVATE_SMI_HEAP) || 217202a77d28ac251545f6f998a974690212309b927Iliyan Malchev (usage & GRALLOC_USAGE_EXTERNAL_DISP) || 218202a77d28ac251545f6f998a974690212309b927Iliyan Malchev (usage & GRALLOC_USAGE_PROTECTED)) 219202a77d28ac251545f6f998a974690212309b927Iliyan Malchev { 220202a77d28ac251545f6f998a974690212309b927Iliyan Malchev int tempFd = open(DEVICE_PMEM_SMIPOOL, O_RDWR, 0); 221202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(tempFd > 0) { 222202a77d28ac251545f6f998a974690212309b927Iliyan Malchev close(tempFd); 223202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sp<IMemAlloc> memalloc; 224202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = new PmemKernelAlloc(DEVICE_PMEM_SMIPOOL); 225202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = memalloc->alloc_buffer(data); 226202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ret >= 0) 227202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return ret; 228202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else { 229202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(adspFallback) 230202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGW("Allocation from SMI failed, trying ADSP"); 231202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 232202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 233202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 234202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 235202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if ((usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP) || adspFallback) { 236202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mPmemAdspAlloc->alloc_buffer(data); 237202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 238202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return ret; 239202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 240202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 241202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IMemAlloc> PmemKernelController::getAllocator(int flags) 242202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 243202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sp<IMemAlloc> memalloc; 244202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP) 245202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = mPmemAdspAlloc; 246202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else { 247202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags); 248202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = NULL; 249202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 250202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 251202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return memalloc; 252202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 253202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 254202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//-------------- PmemAshmmemController-----------------------// 255202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 256202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemAshmemController::PmemAshmemController() 257202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 258202a77d28ac251545f6f998a974690212309b927Iliyan Malchev mPmemUserspaceAlloc = new PmemUserspaceAlloc(); 259202a77d28ac251545f6f998a974690212309b927Iliyan Malchev mAshmemAlloc = new AshmemAlloc(); 260202a77d28ac251545f6f998a974690212309b927Iliyan Malchev mPmemKernelCtrl = new PmemKernelController(); 261202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 262202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 263202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemAshmemController::~PmemAshmemController() 264202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 265202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 266202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 267202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint PmemAshmemController::allocate(alloc_data& data, int usage, 26829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int compositionType) 269202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 270202a77d28ac251545f6f998a974690212309b927Iliyan Malchev int ret = 0; 27129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.allocType = 0; 272202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 273202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // Make buffers cacheable by default 27429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.uncached = false; 275202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 276202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // Override if we explicitly need uncached buffers 277202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (usage & GRALLOC_USAGE_PRIVATE_UNCACHED) 278202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.uncached = true; 279202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 280202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // If ADSP or SMI is requested use the kernel controller 281202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & (GRALLOC_USAGE_PRIVATE_ADSP_HEAP| 282202a77d28ac251545f6f998a974690212309b927Iliyan Malchev GRALLOC_USAGE_PRIVATE_SMI_HEAP)) { 283202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mPmemKernelCtrl->allocate(data, usage, compositionType); 284202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ret < 0) 285202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGE("%s: Failed to allocate ADSP/SMI memory", __func__); 286202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else 287202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType = private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP; 288202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return ret; 289202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 290202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 291202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP) { 292202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mAshmemAlloc->alloc_buffer(data); 293202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ret >= 0) { 294202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType = private_handle_t::PRIV_FLAGS_USES_ASHMEM; 295202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM; 296202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 297202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return ret; 298202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 299202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 300202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // if no memory specific flags are set, 301202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // default to EBI heap, so that bypass 302202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // can work. We can fall back to system 303202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // heap if we run out. 304202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mPmemUserspaceAlloc->alloc_buffer(data); 305202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 306202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // Fallback 307202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ret >= 0 ) { 308202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType = private_handle_t::PRIV_FLAGS_USES_PMEM; 30929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } else if(ret < 0 && canFallback(usage, false)) { 310202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGW("Falling back to ashmem"); 311202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ret = mAshmemAlloc->alloc_buffer(data); 312202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(ret >= 0) { 313202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType = private_handle_t::PRIV_FLAGS_USES_ASHMEM; 314202a77d28ac251545f6f998a974690212309b927Iliyan Malchev data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM; 315202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 316202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 317202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 318202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return ret; 319202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 320202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 321202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IMemAlloc> PmemAshmemController::getAllocator(int flags) 322202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 323202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sp<IMemAlloc> memalloc; 324202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM) 325202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = mPmemUserspaceAlloc; 326202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP) 327202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = mPmemKernelCtrl->getAllocator(flags); 328202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else if (flags & private_handle_t::PRIV_FLAGS_USES_ASHMEM) 329202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = mAshmemAlloc; 330202a77d28ac251545f6f998a974690212309b927Iliyan Malchev else { 331202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags); 332202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc = NULL; 333202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 334202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 335202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return memalloc; 336202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 337202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#endif 338202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsize_t getBufferSizeAndDimensions(int width, int height, int format, 33929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int& alignedw, int &alignedh) 340202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 341202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size_t size; 342202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 343202a77d28ac251545f6f998a974690212309b927Iliyan Malchev alignedw = ALIGN(width, 32); 344202a77d28ac251545f6f998a974690212309b927Iliyan Malchev alignedh = ALIGN(height, 32); 345202a77d28ac251545f6f998a974690212309b927Iliyan Malchev switch (format) { 346202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_RGBA_8888: 347202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_RGBX_8888: 348202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_BGRA_8888: 349202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = alignedw * alignedh * 4; 350202a77d28ac251545f6f998a974690212309b927Iliyan Malchev break; 351202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_RGB_888: 352202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = alignedw * alignedh * 3; 353202a77d28ac251545f6f998a974690212309b927Iliyan Malchev break; 354202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_RGB_565: 355202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_RGBA_5551: 356202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_RGBA_4444: 357202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = alignedw * alignedh * 2; 358202a77d28ac251545f6f998a974690212309b927Iliyan Malchev break; 359202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 360202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // adreno formats 361202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: // NV21 362202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = ALIGN(alignedw*alignedh, 4096); 363202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size += ALIGN(2 * ALIGN(width/2, 32) * ALIGN(height/2, 32), 4096); 364202a77d28ac251545f6f998a974690212309b927Iliyan Malchev break; 365202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: // NV12 366202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // The chroma plane is subsampled, 367202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // but the pitch in bytes is unchanged 368202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // The GPU needs 4K alignment, but the video decoder needs 8K 369202a77d28ac251545f6f998a974690212309b927Iliyan Malchev alignedw = ALIGN(width, 128); 370202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = ALIGN( alignedw * alignedh, 8192); 371202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size += ALIGN( alignedw * ALIGN(height/2, 32), 8192); 372202a77d28ac251545f6f998a974690212309b927Iliyan Malchev break; 373202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 374202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_YCbCr_420_SP: 375202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_YCrCb_420_SP: 376202a77d28ac251545f6f998a974690212309b927Iliyan Malchev case HAL_PIXEL_FORMAT_YV12: 377202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if ((format == HAL_PIXEL_FORMAT_YV12) && ((width&1) || (height&1))) { 378202a77d28ac251545f6f998a974690212309b927Iliyan Malchev ALOGE("w or h is odd for the YV12 format"); 379202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return -EINVAL; 380202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 381202a77d28ac251545f6f998a974690212309b927Iliyan Malchev alignedw = ALIGN(width, 16); 382202a77d28ac251545f6f998a974690212309b927Iliyan Malchev alignedh = height; 383202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (HAL_PIXEL_FORMAT_NV12_ENCODEABLE == format) { 384202a77d28ac251545f6f998a974690212309b927Iliyan Malchev // The encoder requires a 2K aligned chroma offset. 385202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = ALIGN(alignedw*alignedh, 2048) + 38629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed (ALIGN(alignedw/2, 16) * (alignedh/2))*2; 387202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } else { 388202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = alignedw*alignedh + 389202a77d28ac251545f6f998a974690212309b927Iliyan Malchev (ALIGN(alignedw/2, 16) * (alignedh/2))*2; 390202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 391202a77d28ac251545f6f998a974690212309b927Iliyan Malchev size = ALIGN(size, 4096); 392202a77d28ac251545f6f998a974690212309b927Iliyan Malchev break; 39329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_422_SP: 39429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_422_SP: 39529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(width & 1) { 39629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("width is odd for the YUV422_SP format"); 39729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return -EINVAL; 39829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 39929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed alignedw = ALIGN(width, 16); 40029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed alignedh = height; 40129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed size = ALIGN(alignedw * alignedh * 2, 4096); 40229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed break; 403202a77d28ac251545f6f998a974690212309b927Iliyan Malchev default: 40429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("unrecognized pixel format: 0x%x", format); 405202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return -EINVAL; 406202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 407202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 408202a77d28ac251545f6f998a974690212309b927Iliyan Malchev return size; 409202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 410202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 411202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// Allocate buffer from width, height and format into a 412202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// private_handle_t. It is the responsibility of the caller 413202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// to free the buffer using the free_buffer function 414202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage) 415202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 41629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed alloc_data data; 41729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int alignedw, alignedh; 41829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed android::sp<gralloc::IAllocController> sAlloc = 41929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed gralloc::IAllocController::getInstance(false); 42029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.base = 0; 42129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.fd = -1; 42229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.offset = 0; 42329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.size = getBufferSizeAndDimensions(w, h, format, alignedw, alignedh); 42429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.align = getpagesize(); 42529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.uncached = useUncached(usage); 42629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int allocFlags = usage; 42729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 42829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int err = sAlloc->allocate(data, allocFlags, 0); 42929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (0 != err) { 43029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("%s: allocate failed", __FUNCTION__); 43129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return -ENOMEM; 43229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 43329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 43429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed private_handle_t* hnd = new private_handle_t(data.fd, data.size, 43529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed data.allocType, 0, format, alignedw, alignedh); 43629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hnd->base = (int) data.base; 43729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hnd->offset = data.offset; 43829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hnd->gpuaddr = 0; 43929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *pHnd = hnd; 44029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return 0; 441202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 442202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 443202a77d28ac251545f6f998a974690212309b927Iliyan Malchevvoid free_buffer(private_handle_t *hnd) 444202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{ 445202a77d28ac251545f6f998a974690212309b927Iliyan Malchev android::sp<gralloc::IAllocController> sAlloc = 446202a77d28ac251545f6f998a974690212309b927Iliyan Malchev gralloc::IAllocController::getInstance(false); 447202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if (hnd && hnd->fd > 0) { 448202a77d28ac251545f6f998a974690212309b927Iliyan Malchev sp<IMemAlloc> memalloc = sAlloc->getAllocator(hnd->flags); 449202a77d28ac251545f6f998a974690212309b927Iliyan Malchev memalloc->free_buffer((void*)hnd->base, hnd->size, hnd->offset, hnd->fd); 450202a77d28ac251545f6f998a974690212309b927Iliyan Malchev } 451202a77d28ac251545f6f998a974690212309b927Iliyan Malchev if(hnd) 452202a77d28ac251545f6f998a974690212309b927Iliyan Malchev delete hnd; 453202a77d28ac251545f6f998a974690212309b927Iliyan Malchev 454202a77d28ac251545f6f998a974690212309b927Iliyan Malchev} 455