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