125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/*
225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Copyright (C) 2012 Intel Corporation.  All rights reserved.
325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Licensed under the Apache License, Version 2.0 (the "License");
525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * you may not use this file except in compliance with the License.
625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * You may obtain a copy of the License at
725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *      http://www.apache.org/licenses/LICENSE-2.0
925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
1025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Unless required by applicable law or agreed to in writing, software
1125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * distributed under the License is distributed on an "AS IS" BASIS,
1225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * See the License for the specific language governing permissions and
1425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * limitations under the License.
1525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
1625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */
1725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
1825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifndef __ISV_BUFMANAGER_H
1925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define __ISV_BUFMANAGER_H
2025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
2125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/RefBase.h>
2225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/Mutex.h>
2325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/Errors.h>
2425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/Vector.h>
2525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_worker.h"
26e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang#ifndef TARGET_VPP_USE_GEN
27e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang#include "hal_public.h"
28e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang#endif
2925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
3025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangusing namespace android;
3125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
3225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define ISV_BUFFER_MANAGER_DEBUG 0
3325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
3425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVWorker;
3525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
3625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVBuffer
3725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{
3825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangpublic:
3925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    typedef enum {
4025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        ISV_BUFFER_GRALLOC,
4125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        ISV_BUFFER_METADATA,
4225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    } ISV_BUFFERTYPE;
43e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang
44e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    typedef enum {
45e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        ISV_BUFFER_NEED_CLEAR       = 0x00000001,
46e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        ISV_BUFFER_CROP_CHANGED     = 0x00000002,
47e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    } ISV_BUFFERFLAG;
4825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangprivate:
4925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    //FIX ME: copy from ufo gralloc.h
5025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    typedef struct _ufo_buffer_details_t
5125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    {
5225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int width;       // \see alloc_device_t::alloc
5325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int height;      // \see alloc_device_t::alloc
5425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int format;      // \see alloc_device_t::alloc
5525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int usage;       // \see alloc_device_t::alloc
5625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int name;        // flink
5725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        uint32_t fb;     // framebuffer id
5825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int drmformat;   // drm format
5925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int pitch;       // buffer pitch (in bytes)
6025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int size;        // buffer size (in bytes)
6125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int allocWidth;  // allocated buffer width in pixels.
6225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int allocHeight; // allocated buffer height in lines.
6325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int allocOffsetX;// horizontal pixel offset to content origin within allocated buffer.
6425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        int allocOffsetY;// vertical line offset to content origin within allocated buffer.
6525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    } ufo_buffer_details_t;
6625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
6725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    enum
6825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    {
6925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        INTEL_UFO_GRALLOC_MODULE_PERFORM_GET_BO_INFO = 6 // (buffer_handle_t, buffer_info_t*)
7025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    };
7125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
7225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangpublic:
7325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ISVBuffer(sp<ISVWorker> worker,
74d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang            unsigned long buffer, unsigned long grallocHandle,
7525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            uint32_t width, uint32_t height,
7625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            uint32_t stride, uint32_t colorFormat,
77e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang            ISV_BUFFERTYPE type, uint32_t flag)
7825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        :mWorker(worker),
7925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mBuffer(buffer),
8025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mGrallocHandle(grallocHandle),
8125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mWidth(width),
8225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mHeight(height),
83e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mSurfaceHeight(0),
8425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mStride(stride),
8525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mColorFormat(colorFormat),
8625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mType(type),
87e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mSurface(-1),
88e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mFlags(flag),
89e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mpGralloc(NULL) {}
9025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
9125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ISVBuffer(sp<ISVWorker> worker,
92d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang            unsigned long buffer,
93e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang            ISV_BUFFERTYPE type,
94e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang            uint32_t flag)
9525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        :mWorker(worker),
9625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mBuffer(buffer),
9725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mGrallocHandle(0),
9825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mWidth(0),
9925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mHeight(0),
100e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mSurfaceHeight(0),
10125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mStride(0),
10225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mColorFormat(0),
10325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        mType(type),
104e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mSurface(-1),
105e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mFlags(flag),
106e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mpGralloc(NULL) {}
10725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
10825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ~ISVBuffer();
10925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
11025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // init buffer info
111d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    // FIXME: hackFormat is for VP9, should be removed in future
112d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    status_t initBufferInfo(uint32_t hackFormat);
11325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
11425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // get va surface
115d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    int32_t getSurface() { return mSurface; }
11625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // get buffer handle
117d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    unsigned long getHandle() { return mBuffer; }
118e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    // set/clear/get flag
119e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    uint32_t getFlags() { return mFlags; }
120e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    void setFlag(uint32_t flag) { mFlags |= flag; return; }
121e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    void unsetFlag(uint32_t flag) { mFlags &= ~flag; return; }
122e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    status_t clearIfNeed();
12325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
12425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangprivate:
125e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang
12625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    sp<ISVWorker> mWorker;
127d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    unsigned long mBuffer;
128d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    unsigned long mGrallocHandle;
12925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mWidth;
13025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mHeight;
131e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    uint32_t mSurfaceHeight;
13225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mStride;
13325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mColorFormat;
13425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ISV_BUFFERTYPE mType;
13525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    int32_t mSurface;
136e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    uint32_t mFlags;
137e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    gralloc_module_t* mpGralloc;
13825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang};
13925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
14025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVBufferManager: public RefBase
14125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{
14225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangpublic:
14325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ISVBufferManager()
14425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        :mWorker(NULL),
145e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mMetaDataMode(false),
146e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang        mNeedClearBuffers(false) {}
14725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
14825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ~ISVBufferManager() {}
14925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // set mBuffers size
15025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    status_t setBufferCount(int32_t size);
15125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
15225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // register/unregister ISVBuffers to mBuffers
15325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    status_t useBuffer(const sp<ANativeWindowBuffer> nativeBuffer);
154d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    status_t useBuffer(unsigned long handle);
155d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    status_t freeBuffer(unsigned long handle);
15625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
15725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // Map to ISVBuffer
158d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    ISVBuffer* mapBuffer(unsigned long handle);
15925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // set isv worker
16025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    void setWorker(sp<ISVWorker> worker) { mWorker = worker; }
16125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    void setMetaDataMode(bool metaDataMode) { mMetaDataMode = metaDataMode; }
162e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    // set buffer flag.
163e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    status_t setBuffersFlag(uint32_t flag);
16425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangprivate:
16525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    typedef enum {
16625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        GRALLOC_BUFFER_MODE = 0,
16725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        META_DATA_MODE = 1,
16825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    } ISV_WORK_MODE;
16925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
17025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    sp<ISVWorker> mWorker;
17125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mMetaDataMode;
17225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // VPP buffer queue
17325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    Vector<ISVBuffer*> mBuffers;
17425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    Mutex mBufferLock; // to protect access to mBuffers
175e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    bool mNeedClearBuffers;
17625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang};
17725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
17825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
17925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif //#define __ISV_BUFMANAGER_H
180