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