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*/
166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#ifndef BUFFERMANAGER_H_
176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#define BUFFERMANAGER_H_
186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/Dump.h>
206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <DataBuffer.h>
216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <BufferMapper.h>
220594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/buffers/BufferCache.h>
23eb726af21649d79ed720bdf329e0849270995c45Andy Qiu#include <utils/Mutex.h>
246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu// Gralloc Buffer Manager
296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuclass BufferManager {
306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiupublic:
316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    BufferManager();
326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    virtual ~BufferManager();
336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool initCheck() const;
35e2ad4c047651d4442f6a0e002290016d45e9201afu jin    virtual bool initialize();
36e2ad4c047651d4442f6a0e002290016d45e9201afu jin    virtual void deinitialize();
376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // dump interface
396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    void dump(Dump& d);
406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
41eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // lockDataBuffer and unlockDataBuffer must be used in serial
42eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // nested calling of them will cause a deadlock
43eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    DataBuffer* lockDataBuffer(uint32_t handle);
44eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void unlockDataBuffer(DataBuffer *buffer);
45eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
46eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // get and put interfaces are deprecated
47eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // use lockDataBuffer and unlockDataBuffer instead
486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    DataBuffer* get(uint32_t handle);
49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void put(DataBuffer *buffer);
506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // map/unmap a data buffer into/from display memory
526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    BufferMapper* map(DataBuffer& buffer);
53eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void unmap(BufferMapper *mapper);
54e2ad4c047651d4442f6a0e002290016d45e9201afu jin
55eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // frame buffer management
56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    //return 0 if allocation fails
57eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    virtual uint32_t allocFrameBuffer(int width, int height, int *stride);
58eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    virtual void freeFrameBuffer(uint32_t kHandle);
5930c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu
60d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    uint32_t allocGrallocBuffer(uint32_t width, uint32_t height, uint32_t format, uint32_t usage);
61d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    void freeGrallocBuffer(uint32_t handle);
62af3bf2227c951a59e2dcc44ab90790d247225375Andy Qiu    virtual bool blitGrallocBuffer(uint32_t srcHandle, uint32_t dstHandle,
63d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri                                  crop_t& srcCrop, uint32_t async) = 0;
646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuprotected:
653413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan    virtual DataBuffer* createDataBuffer(uint32_t handle) = 0;
663413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan    virtual BufferMapper* createBufferMapper(DataBuffer& buffer) = 0;
67d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri
68a96e082acbc128f06be3e9d71ed093f45744522dAlistair Strachan    const hw_device_t *mGralloc;
696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuprivate:
70cf69645a7a038ffa3cb5c2fb1e38618219d8f2feJackie Li    enum {
71cf69645a7a038ffa3cb5c2fb1e38618219d8f2feJackie Li        // make the buffer pool large enough
72cf69645a7a038ffa3cb5c2fb1e38618219d8f2feJackie Li        DEFAULT_BUFFER_POOL_SIZE = 128,
73cf69645a7a038ffa3cb5c2fb1e38618219d8f2feJackie Li    };
74e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu
7530c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    alloc_device_t *mAllocDev;
7630c19aca49c615368ae3bce961c431fa901e90b9Andy Qiu    KeyedVector<uint32_t, BufferMapper*> mFrameBuffers;
776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    BufferCache *mBufferPool;
78eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    DataBuffer *mDataBuffer;
79eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex mDataBufferLock;
801b7d29a3e8fa94e87a803f534701143b519edb6bSandeep Ramankutty    Mutex mLock;
816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    bool mInitialized;
826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu};
836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#endif /* BUFFERMANAGER_H_ */
88