1 /* 2 // Copyright (c) 2014 Intel Corporation 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 */ 16 #ifndef VIRTUAL_DEVICE_H 17 #define VIRTUAL_DEVICE_H 18 19 #include <IDisplayDevice.h> 20 #include <SimpleThread.h> 21 #include <IVideoPayloadManager.h> 22 #include <utils/Condition.h> 23 #include <utils/Mutex.h> 24 #include <utils/Vector.h> 25 #include <utils/List.h> 26 #ifdef INTEL_WIDI 27 #include "IFrameServer.h" 28 #endif 29 #include <va/va.h> 30 #include <va/va_vpp.h> 31 32 namespace android { 33 namespace intel { 34 35 class Hwcomposer; 36 class DisplayPlaneManager; 37 class IVideoPayloadManager; 38 class SoftVsyncObserver; 39 40 #ifdef INTEL_WIDI 41 class VirtualDevice : public IDisplayDevice, public BnFrameServer { 42 #else 43 class VirtualDevice : public IDisplayDevice, public RefBase{ 44 #endif 45 protected: 46 class VAMappedHandle; 47 class VAMappedHandleObject; 48 struct CachedBuffer : public android::RefBase { 49 CachedBuffer(BufferManager *mgr, buffer_handle_t handle); 50 ~CachedBuffer(); 51 BufferManager *manager; 52 BufferMapper *mapper; 53 VAMappedHandle *vaMappedHandle; 54 buffer_handle_t cachedKhandle; 55 }; 56 struct HeldDecoderBuffer : public android::RefBase { 57 HeldDecoderBuffer(const sp<VirtualDevice>& vd, const android::sp<CachedBuffer>& cachedBuffer); 58 virtual ~HeldDecoderBuffer(); 59 android::sp<VirtualDevice> vd; 60 android::sp<CachedBuffer> cachedBuffer; 61 }; 62 #ifdef INTEL_WIDI 63 struct Configuration { 64 sp<IFrameTypeChangeListener> typeChangeListener; 65 sp<IFrameListener> frameListener; 66 FrameProcessingPolicy policy; 67 bool frameServerActive; 68 bool extendedModeEnabled; 69 bool forceNotifyFrameType; 70 bool forceNotifyBufferInfo; 71 }; 72 #endif 73 class BufferList { 74 public: 75 BufferList(VirtualDevice& vd, const char* name, uint32_t limit, uint32_t format, uint32_t usage); 76 buffer_handle_t get(uint32_t width, uint32_t height, sp<RefBase>* heldBuffer); 77 void clear(); 78 private: 79 struct HeldBuffer; 80 VirtualDevice& mVd; 81 const char* mName; 82 android::List<buffer_handle_t> mAvailableBuffers; 83 const uint32_t mLimit; 84 const uint32_t mFormat; 85 const uint32_t mUsage; 86 uint32_t mBuffersToCreate; 87 uint32_t mWidth; 88 uint32_t mHeight; 89 }; 90 struct Task; 91 struct RenderTask; 92 struct ComposeTask; 93 struct EnableVspTask; 94 struct DisableVspTask; 95 struct BlitTask; 96 struct FrameTypeChangedTask; 97 struct BufferInfoChangedTask; 98 struct OnFrameReadyTask; 99 100 Mutex mConfigLock; 101 #ifdef INTEL_WIDI 102 Configuration mCurrentConfig; 103 Configuration mNextConfig; 104 #endif 105 ssize_t mRgbLayer; 106 ssize_t mYuvLayer; 107 bool mProtectedMode; 108 109 buffer_handle_t mExtLastKhandle; 110 int64_t mExtLastTimestamp; 111 112 int64_t mRenderTimestamp; 113 114 Mutex mTaskLock; // for task queue and buffer lists 115 BufferList mCscBuffers; 116 BufferList mRgbUpscaleBuffers; 117 DECLARE_THREAD(WidiBlitThread, VirtualDevice); 118 Condition mRequestQueued; 119 Condition mRequestDequeued; 120 Vector< sp<Task> > mTasks; 121 122 // fence info 123 int mSyncTimelineFd; 124 unsigned mNextSyncPoint; 125 bool mExpectAcquireFences; 126 #ifdef INTEL_WIDI 127 FrameInfo mLastInputFrameInfo; 128 FrameInfo mLastOutputFrameInfo; 129 #endif 130 int32_t mVideoFramerate; 131 132 android::KeyedVector<buffer_handle_t, android::sp<CachedBuffer> > mMappedBufferCache; 133 android::Mutex mHeldBuffersLock; 134 android::KeyedVector<buffer_handle_t, android::sp<android::RefBase> > mHeldBuffers; 135 136 // VSP 137 bool mVspInUse; 138 bool mVspEnabled; 139 uint32_t mVspWidth; 140 uint32_t mVspHeight; 141 VADisplay va_dpy; 142 VAConfigID va_config; 143 VAContextID va_context; 144 VASurfaceID va_blank_yuv_in; 145 VASurfaceID va_blank_rgb_in; 146 android::KeyedVector<buffer_handle_t, android::sp<VAMappedHandleObject> > mVaMapCache; 147 148 bool mVspUpscale; 149 bool mDebugVspClear; 150 bool mDebugVspDump; 151 uint32_t mDebugCounter; 152 153 private: 154 android::sp<CachedBuffer> getMappedBuffer(buffer_handle_t handle); 155 156 bool sendToWidi(hwc_display_contents_1_t *display); 157 bool queueCompose(hwc_display_contents_1_t *display); 158 bool queueColorConvert(hwc_display_contents_1_t *display); 159 #ifdef INTEL_WIDI 160 bool handleExtendedMode(hwc_display_contents_1_t *display); 161 162 void queueFrameTypeInfo(const FrameInfo& inputFrameInfo); 163 void queueBufferInfo(const FrameInfo& outputFrameInfo); 164 #endif 165 void colorSwap(buffer_handle_t src, buffer_handle_t dest, uint32_t pixelCount); 166 void vspPrepare(uint32_t width, uint32_t height); 167 void vspEnable(uint32_t width, uint32_t height); 168 void vspDisable(); 169 void vspCompose(VASurfaceID videoIn, VASurfaceID rgbIn, VASurfaceID videoOut, 170 const VARectangle* surface_region, const VARectangle* output_region); 171 172 bool getFrameOfSize(uint32_t width, uint32_t height, const IVideoPayloadManager::MetaData& metadata, IVideoPayloadManager::Buffer& info); 173 void setMaxDecodeResolution(uint32_t width, uint32_t height); 174 175 public: 176 VirtualDevice(Hwcomposer& hwc); 177 virtual ~VirtualDevice(); 178 bool isFrameServerActive() const; 179 180 public: 181 virtual bool prePrepare(hwc_display_contents_1_t *display); 182 virtual bool prepare(hwc_display_contents_1_t *display); 183 virtual bool commit(hwc_display_contents_1_t *display, 184 IDisplayContext *context); 185 186 virtual bool vsyncControl(bool enabled); 187 virtual bool blank(bool blank); 188 virtual bool getDisplaySize(int *width, int *height); 189 virtual bool getDisplayConfigs(uint32_t *configs, 190 size_t *numConfigs); 191 virtual bool getDisplayAttributes(uint32_t config, 192 const uint32_t *attributes, 193 int32_t *values); 194 virtual bool compositionComplete(); 195 virtual bool initialize(); 196 virtual void deinitialize(); 197 virtual bool isConnected() const; 198 virtual const char* getName() const; 199 virtual int getType() const; 200 virtual void onVsync(int64_t timestamp); 201 virtual void dump(Dump& d); 202 virtual uint32_t getFpsDivider(); 203 #ifdef INTEL_WIDI 204 // IFrameServer methods 205 virtual android::status_t start(sp<IFrameTypeChangeListener> frameTypeChangeListener); 206 virtual android::status_t stop(bool isConnected); 207 /* TODO: 64-bit - this handle of size 32-bit is a problem for 64-bit */ 208 virtual android::status_t notifyBufferReturned(int handle); 209 virtual android::status_t setResolution(const FrameProcessingPolicy& policy, android::sp<IFrameListener> listener); 210 #endif 211 virtual bool setPowerMode(int mode); 212 virtual int getActiveConfig(); 213 virtual bool setActiveConfig(int index); 214 215 protected: 216 bool mInitialized; 217 Hwcomposer& mHwc; 218 IVideoPayloadManager *mPayloadManager; 219 SoftVsyncObserver *mVsyncObserver; 220 uint32_t mOrigContentWidth; 221 uint32_t mOrigContentHeight; 222 bool mFirstVideoFrame; 223 bool mLastConnectionStatus; 224 uint32_t mCachedBufferCapcity; 225 uint32_t mDecWidth; 226 uint32_t mDecHeight; 227 bool mIsForceCloneMode; 228 uint32_t mFpsDivider; 229 }; 230 231 } 232 } 233 234 #endif /* VIRTUAL_DEVICE_H */ 235