16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 16e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 170594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h> 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <hardware/hwcomposer.h> 196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <BufferManager.h> 2030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu#include <DrmConfig.h> 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 256a6081a46a83da606cf21548879b37695adc7e1fAndy QiuBufferManager::BufferManager() 26eb726af21649d79ed720bdf329e0849270995c45Andy Qiu : mGrallocModule(NULL), 27eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mAllocDev(NULL), 2830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mFrameBuffers(), 29eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBufferPool(NULL), 30eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBuffer(NULL), 31eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBufferLock(), 326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized(false) 336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 34e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 376a6081a46a83da606cf21548879b37695adc7e1fAndy QiuBufferManager::~BufferManager() 386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 39e2ad4c047651d4442f6a0e002290016d45e9201afu jin WARN_IF_NOT_DEINIT(); 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool BufferManager::initCheck() const 436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mInitialized; 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool BufferManager::initialize() 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 49e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // create buffer pool 52cf69645a7a038ffa3cb5c2fb1e38618219d8f2feJackie Li mBufferPool = new BufferCache(DEFAULT_BUFFER_POOL_SIZE); 536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mBufferPool) { 544157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to create gralloc buffer cache"); 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // init gralloc module 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu hw_module_t const* module; 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module)) { 6130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu DEINIT_AND_RETURN_FALSE("failed to get gralloc module"); 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGrallocModule = (gralloc_module_t*)module; 6430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 6530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu gralloc_open(module, &mAllocDev); 6630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!mAllocDev) { 674157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("failed to open alloc device"); 6830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu } 6930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 70eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // create a dummy data buffer 71eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBuffer = createDataBuffer(mGrallocModule, 0); 72eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mDataBuffer) { 73eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_RETURN_FALSE("failed to create data buffer"); 74eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mInitialized = true; 776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 80e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Livoid BufferManager::deinitialize() 816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 82e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li mInitialized = false; 836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 8430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (mBufferPool) { 8530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu // unmap & delete all cached buffer mappers 8630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu for (size_t i = 0; i < mBufferPool->getCacheSize(); i++) { 8730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu BufferMapper *mapper = mBufferPool->getMapper(i); 88eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 89eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 90e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 9130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 9230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu delete mBufferPool; 93eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBufferPool = NULL; 94e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 95e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 9630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu for (size_t j = 0; j < mFrameBuffers.size(); j++) { 9730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu BufferMapper *mapper = mFrameBuffers.valueAt(j); 9830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mapper->unmap(); 9930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu delete mapper; 10030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu } 10130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mFrameBuffers.clear(); 10230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 10330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (mAllocDev) { 10430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu gralloc_close(mAllocDev); 10530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mAllocDev = NULL; 10630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu } 107eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 108eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mDataBuffer) { 109eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mDataBuffer; 110eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBuffer = NULL; 111eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 112e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li} 113e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 114e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Livoid BufferManager::dump(Dump& d) 115e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li{ 116569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li d.append("Buffer Manager status: pool size %d\n", mBufferPool->getCacheSize()); 117569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li d.append("-------------------------------------------------------------\n"); 118569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li for (size_t i = 0; i < mBufferPool->getCacheSize(); i++) { 119569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li BufferMapper *mapper = mBufferPool->getMapper(i); 120569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li d.append("Buffer %d: handle %#x, (%dx%d), format %d, refCount %d\n", 121569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li i, 122569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mapper->getHandle(), 123569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mapper->getWidth(), 124569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mapper->getHeight(), 125569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mapper->getFormat(), 126569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li mapper->getRef()); 127569c4d797688db12498ad1b91cd9d5ed48bfcfe5Jackie Li } 128e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return; 1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 131eb726af21649d79ed720bdf329e0849270995c45Andy QiuDataBuffer* BufferManager::lockDataBuffer(uint32_t handle) 132eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 133eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBufferLock.lock(); 134eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBuffer->resetBuffer(handle); 135eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mDataBuffer; 136eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 137eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 1380594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelvoid BufferManager::unlockDataBuffer(DataBuffer * /* buffer */) 139eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 140eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mDataBufferLock.unlock(); 141eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 142eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 1436a6081a46a83da606cf21548879b37695adc7e1fAndy QiuDataBuffer* BufferManager::get(uint32_t handle) 1446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return createDataBuffer(mGrallocModule, handle); 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 148eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid BufferManager::put(DataBuffer *buffer) 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 150eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete buffer; 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1536a6081a46a83da606cf21548879b37695adc7e1fAndy QiuBufferMapper* BufferManager::map(DataBuffer& buffer) 1546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 1566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu BufferMapper* mapper; 1576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 158e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 1591b7d29a3e8fa94e87a803f534701143b519edb6bSandeep Ramankutty Mutex::Autolock _l(mLock); 1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu //try to get mapper from pool 1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mapper = mBufferPool->getMapper(buffer.getKey()); 162eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 163eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // increase mapper ref count 164eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->incRef(); 165eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mapper; 166eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 167eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 168eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // create a new buffer mapper and add it to pool 169eb726af21649d79ed720bdf329e0849270995c45Andy Qiu do { 1704157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("new buffer, will add it"); 1716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mapper = createBufferMapper(mGrallocModule, buffer); 1726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mapper) { 1734157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate mapper"); 174eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 1756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu ret = mapper->map(); 1776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!ret) { 1784157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map"); 1796db7b748f82dc0330c026c7ffa9ad6d8cda24517Zhi Jin delete mapper; 1806db7b748f82dc0330c026c7ffa9ad6d8cda24517Zhi Jin mapper = NULL; 181eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 183e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li ret = mBufferPool->addMapper(buffer.getKey(), mapper); 184e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (!ret) { 1854157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to add mapper"); 186eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 187e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 188eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // increase mapper ref count 189eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->incRef(); 190eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mapper; 191eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } while (0); 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 193eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 194eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 195eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 196eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 197eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 198eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return NULL; 1996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 201eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid BufferManager::unmap(BufferMapper *mapper) 2026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 2031b7d29a3e8fa94e87a803f534701143b519edb6bSandeep Ramankutty Mutex::Autolock _l(mLock); 204eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mapper) { 2054157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid mapper"); 2066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return; 2076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 2096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // unmap & remove this mapper from buffer when refCount = 0 210eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int refCount = mapper->decRef(); 211eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (refCount < 0) { 2124157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid ref count"); 213eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } else if (!refCount) { 2146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // remove mapper from buffer pool 215eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBufferPool->removeMapper(mapper); 216eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 217eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 2186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 2196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 2206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 22130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiuuint32_t BufferManager::allocFrameBuffer(int width, int height, int *stride) 22230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu{ 22330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu RETURN_NULL_IF_NOT_INIT(); 22430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 2259332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu if (!mAllocDev) { 2264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("Alloc device is not available"); 2279332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu return 0; 2289332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu } 2299332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu 23030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (!width || !height || !stride) { 2314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid input parameter"); 23230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return 0; 23330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu } 23430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 2354157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ILOGTRACE("size of frame buffer to create: %dx%d", width, height); 23630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu uint32_t handle = 0; 23730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu status_t err = mAllocDev->alloc( 23830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mAllocDev, 23930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu width, 24030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu height, 24130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu DrmConfig::getFrameBufferFormat(), 2423f1974031c88750a14adc8f2f49538837238abf9Lin Xie 0, // GRALLOC_USAGE_HW_FB 24330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu (buffer_handle_t *)&handle, 24430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu stride); 24530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 24630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (err != 0) { 2474157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate frame buffer, error = %d", err); 24830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return 0; 24930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu } 25030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 251eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer *buffer = NULL; 252eb726af21649d79ed720bdf329e0849270995c45Andy Qiu BufferMapper *mapper = NULL; 25330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 254eb726af21649d79ed720bdf329e0849270995c45Andy Qiu do { 255eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buffer = lockDataBuffer(handle); 256eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!buffer) { 2574157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get data buffer, handle = %#x", handle); 258eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 259eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 260eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 261eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = createBufferMapper(mGrallocModule, *buffer); 262eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mapper) { 2634157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to create buffer mapper"); 264eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 265eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 266eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 2673555e1ff071400446170ddc209bbb9fa0e40c502fu jin uint32_t fbHandle; 2683555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (!(fbHandle = mapper->getFbHandle(0))) { 2694157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get Fb handle"); 2703555e1ff071400446170ddc209bbb9fa0e40c502fu jin break; 2713555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 272eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 27310f4b9cb650ce851d3ccf3ab100483ca264fc46efu jin mFrameBuffers.add(fbHandle, mapper); 274eb726af21649d79ed720bdf329e0849270995c45Andy Qiu unlockDataBuffer(buffer); 27510f4b9cb650ce851d3ccf3ab100483ca264fc46efu jin return fbHandle; 276eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } while (0); 27730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 278eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling, release all allocated resources 279eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (buffer) { 280eb726af21649d79ed720bdf329e0849270995c45Andy Qiu unlockDataBuffer(buffer); 281eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 282eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 283eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 284eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 285eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mAllocDev->free(mAllocDev, (buffer_handle_t)handle); 286eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 28730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu} 28830c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 2893555e1ff071400446170ddc209bbb9fa0e40c502fu jinvoid BufferManager::freeFrameBuffer(uint32_t fbHandle) 29030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu{ 29130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu RETURN_VOID_IF_NOT_INIT(); 2929332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu 2939332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu if (!mAllocDev) { 2944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("Alloc device is not available"); 2959332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu return; 2969332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu } 2979332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu 2983555e1ff071400446170ddc209bbb9fa0e40c502fu jin ssize_t index = mFrameBuffers.indexOfKey(fbHandle); 29930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu if (index < 0) { 3004157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid kernel handle"); 30130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu return; 30230c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu } 30330c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 30430c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu BufferMapper *mapper = mFrameBuffers.valueAt(index); 30530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu uint32_t handle = mapper->getHandle(); 3063555e1ff071400446170ddc209bbb9fa0e40c502fu jin mapper->putFbHandle(); 30730c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu delete mapper; 3083555e1ff071400446170ddc209bbb9fa0e40c502fu jin mFrameBuffers.removeItem(fbHandle); 30930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu mAllocDev->free(mAllocDev, (buffer_handle_t)handle); 31030c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu} 31130c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu 312d248396b4f48861e1e27c5e316c776121ab44938mamatha balguriuint32_t BufferManager::allocGrallocBuffer(uint32_t width, uint32_t height, uint32_t format, uint32_t usage) 313d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{ 314d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri RETURN_NULL_IF_NOT_INIT(); 315d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 3169332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu if (!mAllocDev) { 3174157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("Alloc device is not available"); 3189332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu return 0; 3199332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu } 3209332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu 321d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (!width || !height) { 3224157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid input parameter"); 323d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return 0; 324d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 325d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 3264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ILOGTRACE("size of graphic buffer to create: %dx%d", width, height); 327d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri uint32_t handle = 0; 328d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri int stride; 329d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri status_t err = mAllocDev->alloc( 330d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri mAllocDev, 331d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri width, 332d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri height, 333d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri format, 334d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri usage, 335d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri (buffer_handle_t *)&handle, 336d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri &stride); 337d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (err != 0) { 3384157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate gralloc buffer, error = %d", err); 339d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return 0; 340d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 341d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 342d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return handle; 343d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri} 344d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 345d248396b4f48861e1e27c5e316c776121ab44938mamatha balgurivoid BufferManager::freeGrallocBuffer(uint32_t handle) 346d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{ 347d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri RETURN_VOID_IF_NOT_INIT(); 3489332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu if (!mAllocDev) { 3494157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("Alloc device is not available"); 3509332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu return; 3519332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu } 3529332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu 353d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (handle) 354d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri mAllocDev->free(mAllocDev, (buffer_handle_t)handle); 355d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri} 356d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 3576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 3586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 359