18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/* 28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License"); 58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License. 68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at 78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// http://www.apache.org/licenses/LICENSE-2.0 98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software 118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS, 128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and 148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License. 158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/ 168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcTrace.h> 188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <hardware/hwcomposer.h> 198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <BufferManager.h> 20a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan#include <hal_public.h> 218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <DrmConfig.h> 228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android { 248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel { 258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolBufferManager::BufferManager() 27a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan : mGralloc(NULL), 288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mFrameBuffers(), 298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBufferPool(NULL), 308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDataBuffer(NULL), 318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDataBufferLock(), 328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mInitialized(false) 338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolBufferManager::~BufferManager() 388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WARN_IF_NOT_DEINIT(); 408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool BufferManager::initCheck() const 438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return mInitialized; 458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool BufferManager::initialize() 488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // create buffer pool 528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBufferPool = new BufferCache(DEFAULT_BUFFER_POOL_SIZE); 538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mBufferPool) { 548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to create gralloc buffer cache"); 558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // init gralloc module 59a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan if (gralloc_open_img(&mGralloc)) { 608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DEINIT_AND_RETURN_FALSE("failed to get gralloc module"); 618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // create a dummy data buffer 643413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan mDataBuffer = createDataBuffer(0); 658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mDataBuffer) { 668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DEINIT_AND_RETURN_FALSE("failed to create data buffer"); 678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mInitialized = true; 708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::deinitialize() 748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mInitialized = false; 768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mBufferPool) { 788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // unmap & delete all cached buffer mappers 798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (size_t i = 0; i < mBufferPool->getCacheSize(); i++) { 808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BufferMapper *mapper = mBufferPool->getMapper(i); 818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->unmap(); 828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mBufferPool; 868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBufferPool = NULL; 878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (size_t j = 0; j < mFrameBuffers.size(); j++) { 908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BufferMapper *mapper = mFrameBuffers.valueAt(j); 918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->unmap(); 928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mFrameBuffers.clear(); 958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 96a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan if (mGralloc) { 97a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan gralloc_close_img(mGralloc); 98a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan mGralloc = NULL; 998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mDataBuffer) { 1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mDataBuffer; 1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDataBuffer = NULL; 1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::dump(Dump& d) 1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol d.append("Buffer Manager status: pool size %d\n", mBufferPool->getCacheSize()); 1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol d.append("-------------------------------------------------------------\n"); 1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (uint32_t i = 0; i < mBufferPool->getCacheSize(); i++) { 1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BufferMapper *mapper = mBufferPool->getMapper(i); 1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol d.append("Buffer %d: handle %#x, (%dx%d), format %d, refCount %d\n", 1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol i, 1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->getHandle(), 1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->getWidth(), 1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->getHeight(), 1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->getFormat(), 1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->getRef()); 1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolDataBuffer* BufferManager::lockDataBuffer(buffer_handle_t handle) 1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDataBufferLock.lock(); 1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDataBuffer->resetBuffer(handle); 1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return mDataBuffer; 1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::unlockDataBuffer(DataBuffer *buffer) 1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDataBufferLock.unlock(); 1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolDataBuffer* BufferManager::get(buffer_handle_t handle) 1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1383413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan return createDataBuffer(handle); 1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::put(DataBuffer *buffer) 1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete buffer; 1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolBufferMapper* BufferManager::map(DataBuffer& buffer) 1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret; 1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BufferMapper* mapper; 1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CTRACE(); 1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Mutex::Autolock _l(mLock); 1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol //try to get mapper from pool 1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper = mBufferPool->getMapper(buffer.getKey()); 1558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mapper) { 1568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // increase mapper ref count 1578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->incRef(); 1588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return mapper; 1598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // create a new buffer mapper and add it to pool 1628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol do { 1638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("new buffer, will add it"); 1643413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan mapper = createBufferMapper(buffer); 1658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mapper) { 1668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to allocate mapper"); 1678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 1688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = mapper->map(); 1708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!ret) { 1718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to map"); 1728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 1738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper = NULL; 1748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 1758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = mBufferPool->addMapper(buffer.getKey(), mapper); 1778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!ret) { 1788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to add mapper"); 1798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 1808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // increase mapper ref count 1828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->incRef(); 1838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return mapper; 1848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } while (0); 1858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // error handling 1878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mapper) { 1888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->unmap(); 1898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 1908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return NULL; 1928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::unmap(BufferMapper *mapper) 1958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Mutex::Autolock _l(mLock); 1978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mapper) { 1988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid mapper"); 1998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 2008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // unmap & remove this mapper from buffer when refCount = 0 2038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int refCount = mapper->decRef(); 2048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (refCount < 0) { 2058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid ref count"); 2068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else if (!refCount) { 2078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // remove mapper from buffer pool 2088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBufferPool->removeMapper(mapper); 2098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->unmap(); 2108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 2118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbuffer_handle_t BufferManager::allocFrameBuffer(int width, int height, int *stride) 2158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 2168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_NULL_IF_NOT_INIT(); 2178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 218a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan if (!mGralloc) { 2198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("Alloc device is not available"); 2208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 2218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!width || !height || !stride) { 2248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid input parameter"); 2258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 2268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ITRACE("size of frame buffer to create: %dx%d", width, height); 2298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buffer_handle_t handle = 0; 230a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan status_t err = gralloc_device_alloc_img( 231a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan mGralloc, 2328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width, 2338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height, 2348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DrmConfig::getFrameBufferFormat(), 2358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 0, // GRALLOC_USAGE_HW_FB 2368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &handle, 2378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride); 2388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (err != 0) { 2408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to allocate frame buffer, error = %d", err); 2418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 2428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DataBuffer *buffer = NULL; 2458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BufferMapper *mapper = NULL; 2468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol do { 2488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buffer = lockDataBuffer(handle); 2498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!buffer) { 2508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to get data buffer, handle = %p", handle); 2518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 2528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2543413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan mapper = createBufferMapper(*buffer); 2558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mapper) { 2568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to create buffer mapper"); 2578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 2588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buffer_handle_t fbHandle; 2618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!(fbHandle = mapper->getFbHandle(0))) { 2628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to get Fb handle"); 2638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 2648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mFrameBuffers.add(fbHandle, mapper); 2678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol unlockDataBuffer(buffer); 2688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return fbHandle; 2698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } while (0); 2708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // error handling, release all allocated resources 2728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (buffer) { 2738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol unlockDataBuffer(buffer); 2748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mapper) { 2768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 2778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 278a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan gralloc_device_free_img(mGralloc, handle); 2798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 2808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::freeFrameBuffer(buffer_handle_t fbHandle) 2838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 2848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_VOID_IF_NOT_INIT(); 2858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 286a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan if (!mGralloc) { 2878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("Alloc device is not available"); 2888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 2898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ssize_t index = mFrameBuffers.indexOfKey(fbHandle); 2928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (index < 0) { 2938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid kernel handle"); 2948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 2958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BufferMapper *mapper = mFrameBuffers.valueAt(index); 2988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buffer_handle_t handle = mapper->getHandle(); 2998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mapper->putFbHandle(); 3008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol delete mapper; 3018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mFrameBuffers.removeItem(fbHandle); 302a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan gralloc_device_free_img(mGralloc, handle); 3038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 3048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbuffer_handle_t BufferManager::allocGrallocBuffer(uint32_t width, uint32_t height, uint32_t format, uint32_t usage) 3068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 3078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_NULL_IF_NOT_INIT(); 3088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 309a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan if (!mGralloc) { 3108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("Alloc device is not available"); 3118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 3128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!width || !height) { 3158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid input parameter"); 3168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 3178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ITRACE("size of graphic buffer to create: %dx%d", width, height); 3208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buffer_handle_t handle = 0; 3218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int stride; 322a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan status_t err = gralloc_device_alloc_img( 323a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan mGralloc, 3248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width, 3258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height, 3268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol format, 3278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol usage, 3288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &handle, 3298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &stride); 3308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (err != 0) { 3318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to allocate gralloc buffer, error = %d", err); 3328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 3338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return handle; 3368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 3378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid BufferManager::freeGrallocBuffer(buffer_handle_t handle) 3398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 3408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol RETURN_VOID_IF_NOT_INIT(); 341a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan if (!mGralloc) { 3428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("Alloc device is not available"); 3438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return; 3448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (handle) 347a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan gralloc_device_free_img(mGralloc, handle); 3488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 3498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel 3518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android 352