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