blob: 9492ff1d999291e1e12e2f0578c9dfb031a9ef57 [file] [log] [blame]
Andy Qiu8a427142013-04-05 17:41:58 -07001/*
Prodyut Hazarikacd727f52014-07-23 19:34:42 -07002// 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*/
Andy Qiu8a427142013-04-05 17:41:58 -070016#ifndef VIRTUAL_DEVICE_H
17#define VIRTUAL_DEVICE_H
18
Andy Qiu8a427142013-04-05 17:41:58 -070019#include <IDisplayDevice.h>
Thierry Strudel0594c422014-07-14 14:54:55 -070020#include <common/base/SimpleThread.h>
Brian Rogers1384af52014-05-21 12:13:17 -070021#include <IVideoPayloadManager.h>
Brian Rogersc40736e2014-03-31 14:40:11 -070022#include <utils/Condition.h>
23#include <utils/Mutex.h>
Brian Rogers1384af52014-05-21 12:13:17 -070024#include <utils/Vector.h>
25
Ashish Singhi196e5bd2013-04-17 18:26:37 -070026#include "IFrameServer.h"
Andy Qiu8a427142013-04-05 17:41:58 -070027
Brian Rogers1384af52014-05-21 12:13:17 -070028#include <va/va.h>
29#include <va/va_vpp.h>
30
Andy Qiu8a427142013-04-05 17:41:58 -070031namespace android {
32namespace intel {
33
34class Hwcomposer;
35class DisplayPlaneManager;
Robert Crabtree2e984ef2013-05-07 14:27:47 -070036class IVideoPayloadManager;
Andy Qiu177b44e2013-11-07 18:03:02 -080037class SoftVsyncObserver;
Andy Qiu8a427142013-04-05 17:41:58 -070038
Ashish Singhi196e5bd2013-04-17 18:26:37 -070039class VirtualDevice : public IDisplayDevice, public BnFrameServer {
Ashish Singhi77b747d2013-04-26 14:30:05 -070040protected:
Brian Rogers1384af52014-05-21 12:13:17 -070041 class VAMappedHandle;
Robert Crabtree2e984ef2013-05-07 14:27:47 -070042 struct CachedBuffer : public android::RefBase {
mamatha balgurid2483962013-07-11 13:38:48 -070043 CachedBuffer(BufferManager *mgr, uint32_t handle);
Robert Crabtree2e984ef2013-05-07 14:27:47 -070044 ~CachedBuffer();
45 BufferManager *manager;
Robert Crabtree2e984ef2013-05-07 14:27:47 -070046 BufferMapper *mapper;
Brian Rogers1384af52014-05-21 12:13:17 -070047 VAMappedHandle *vaMappedHandle;
Robert Crabtree2e984ef2013-05-07 14:27:47 -070048 };
mamatha balgurid2483962013-07-11 13:38:48 -070049 struct HeldCscBuffer : public android::RefBase {
50 HeldCscBuffer(const android::sp<VirtualDevice>& vd, uint32_t handle);
51 virtual ~HeldCscBuffer();
52 android::sp<VirtualDevice> vd;
53 uint32_t handle;
54 };
55 struct HeldDecoderBuffer : public android::RefBase {
56 HeldDecoderBuffer(const sp<VirtualDevice>& vd, const android::sp<CachedBuffer>& cachedBuffer);
57 virtual ~HeldDecoderBuffer();
58 android::sp<VirtualDevice> vd;
59 android::sp<CachedBuffer> cachedBuffer;
60 };
Ashish Singhi77b747d2013-04-26 14:30:05 -070061 struct Configuration {
62 sp<IFrameTypeChangeListener> typeChangeListener;
63 sp<IFrameListener> frameListener;
64 FrameProcessingPolicy policy;
Brian Rogersf24ae212014-04-30 14:50:24 -070065 bool frameServerActive;
Ashish Singhi77b747d2013-04-26 14:30:05 -070066 bool extendedModeEnabled;
Robert Crabtree7d844a22013-08-27 14:00:15 -070067 bool forceNotifyFrameType;
68 bool forceNotifyBufferInfo;
Ashish Singhi77b747d2013-04-26 14:30:05 -070069 };
Brian Rogers1384af52014-05-21 12:13:17 -070070 struct Task;
71 struct RenderTask;
72 struct ComposeTask;
73 struct DisableVspTask;
74 struct BlitTask;
75 struct FrameTypeChangedTask;
76 struct BufferInfoChangedTask;
77 struct OnFrameReadyTask;
Brian Rogersf24ae212014-04-30 14:50:24 -070078 struct ied_block {
79 uint8_t data[16];
80 };
81 ied_block mBlackY;
82 ied_block mBlackUV;
83
Ashish Singhi77b747d2013-04-26 14:30:05 -070084 Mutex mConfigLock;
85 Configuration mCurrentConfig;
86 Configuration mNextConfig;
Brian Rogers1384af52014-05-21 12:13:17 -070087 ssize_t mRgbLayer;
88 ssize_t mYuvLayer;
89 bool mProtectedMode;
Ashish Singhi77b747d2013-04-26 14:30:05 -070090
91 uint32_t mExtLastKhandle;
92 int64_t mExtLastTimestamp;
93
mamatha balgurid2483962013-07-11 13:38:48 -070094 int64_t mRenderTimestamp;
Robert Crabtree2e984ef2013-05-07 14:27:47 -070095
mamatha balgurid2483962013-07-11 13:38:48 -070096 // colorspace conversion
97 Mutex mCscLock;
98 android::List<uint32_t> mAvailableCscBuffers;
99 int mCscBuffersToCreate;
100 uint32_t mCscWidth;
101 uint32_t mCscHeight;
102
Brian Rogers1384af52014-05-21 12:13:17 -0700103 // fence info
104 int mSyncTimelineFd;
105 unsigned mNextSyncPoint;
Brian Rogers1ad6b002014-06-06 18:47:39 -0700106 bool mExpectAcquireFences;
Brian Rogers1384af52014-05-21 12:13:17 -0700107
Brian Rogersc40736e2014-03-31 14:40:11 -0700108 // async blit info
109 DECLARE_THREAD(WidiBlitThread, VirtualDevice);
110 Condition mRequestQueued;
Brian Rogers1384af52014-05-21 12:13:17 -0700111 Condition mRequestDequeued;
112 Vector< sp<Task> > mTasks;
Brian Rogersf24ae212014-04-30 14:50:24 -0700113
mamatha balgurid2483962013-07-11 13:38:48 -0700114 FrameInfo mLastInputFrameInfo;
115 FrameInfo mLastOutputFrameInfo;
116
Robert Crabtreec2a96b12013-10-22 18:18:15 -0700117 int32_t mVideoFramerate;
118
mamatha balgurid2483962013-07-11 13:38:48 -0700119 android::KeyedVector<uint32_t, android::sp<CachedBuffer> > mMappedBufferCache;
Robert Crabtree2e984ef2013-05-07 14:27:47 -0700120 android::Mutex mHeldBuffersLock;
mamatha balgurid2483962013-07-11 13:38:48 -0700121 android::KeyedVector<uint32_t, android::sp<android::RefBase> > mHeldBuffers;
Robert Crabtree2e984ef2013-05-07 14:27:47 -0700122
Brian Rogers1384af52014-05-21 12:13:17 -0700123 // VSP
124 bool mVspInUse;
125 bool mVspEnabled;
126 VADisplay va_dpy;
127 VAConfigID va_config;
128 VAContextID va_context;
129 VASurfaceID va_video_in;
130
131 // scaling info
132 uint32_t mLastScaleWidth;
133 uint32_t mLastScaleHeight;
134
Robert Crabtree2e984ef2013-05-07 14:27:47 -0700135private:
Brian Rogers1384af52014-05-21 12:13:17 -0700136 uint32_t getCscBuffer(uint32_t width, uint32_t height);
Brian Rogersf24ae212014-04-30 14:50:24 -0700137 void clearCscBuffers();
mamatha balgurid2483962013-07-11 13:38:48 -0700138 android::sp<CachedBuffer> getMappedBuffer(uint32_t handle);
Brian Rogers1384af52014-05-21 12:13:17 -0700139
140 bool sendToWidi(hwc_display_contents_1_t *display);
141 bool queueCompose(hwc_display_contents_1_t *display);
142 bool queueColorConvert(hwc_display_contents_1_t *display);
143 bool handleExtendedMode(hwc_display_contents_1_t *display);
144 bool queueVideoCopy(hwc_display_contents_1_t *display);
145
146 void queueFrameTypeInfo(const FrameInfo& inputFrameInfo);
147 void queueBufferInfo(const FrameInfo& outputFrameInfo);
Robert Crabtree2e984ef2013-05-07 14:27:47 -0700148
Brian Rogersf24ae212014-04-30 14:50:24 -0700149 static void fill(uint8_t* ptr, const ied_block& data, size_t len);
Brian Rogers1384af52014-05-21 12:13:17 -0700150 void copyVideo(uint8_t* srcPtr, uint32_t srcWidth, uint32_t srcHeight, uint32_t srcStride,
151 uint8_t* destPtr, uint32_t destWidth, uint32_t destHeight,
152 uint32_t outX, uint32_t outY, uint32_t width, uint32_t height);
Brian Rogersfc3539e2014-05-19 20:16:21 -0700153 void colorSwap(buffer_handle_t src, buffer_handle_t dest, uint32_t pixelCount);
Brian Rogers1384af52014-05-21 12:13:17 -0700154 void vspEnable(uint32_t width, uint32_t height);
155 void vspDisable();
156 void vspCompose(VASurfaceID videoIn, VASurfaceID rgbIn, VASurfaceID videoOut);
Brian Rogersf24ae212014-04-30 14:50:24 -0700157
Andy Qiu8a427142013-04-05 17:41:58 -0700158public:
159 VirtualDevice(Hwcomposer& hwc, DisplayPlaneManager& dpm);
160 virtual ~VirtualDevice();
161
162public:
163 virtual bool prePrepare(hwc_display_contents_1_t *display);
164 virtual bool prepare(hwc_display_contents_1_t *display);
165 virtual bool commit(hwc_display_contents_1_t *display,
Andy Qiu4b834ce2013-04-09 18:23:20 -0700166 IDisplayContext *context);
Andy Qiu8a427142013-04-05 17:41:58 -0700167
Andy Qiueb726af2013-05-31 11:51:49 +0800168 virtual bool vsyncControl(bool enabled);
169 virtual bool blank(bool blank);
Andy Qiu0131f122013-07-19 14:51:20 -0700170 virtual bool getDisplaySize(int *width, int *height);
Andy Qiu8a427142013-04-05 17:41:58 -0700171 virtual bool getDisplayConfigs(uint32_t *configs,
172 size_t *numConfigs);
173 virtual bool getDisplayAttributes(uint32_t config,
174 const uint32_t *attributes,
175 int32_t *values);
176 virtual bool compositionComplete();
177 virtual bool initialize();
fu jine2ad4c02013-05-28 13:47:51 -0700178 virtual void deinitialize();
Andy Qiu8a427142013-04-05 17:41:58 -0700179 virtual bool isConnected() const;
180 virtual const char* getName() const;
181 virtual int getType() const;
Andy Qiu177b44e2013-11-07 18:03:02 -0800182 virtual void onVsync(int64_t timestamp);
Andy Qiu8a427142013-04-05 17:41:58 -0700183 virtual void dump(Dump& d);
184
Ashish Singhi196e5bd2013-04-17 18:26:37 -0700185 // IFrameServer methods
Arindam Roy82757462013-07-29 17:10:44 -0700186 virtual android::status_t start(sp<IFrameTypeChangeListener> frameTypeChangeListener);
Ashish Singhi196e5bd2013-04-17 18:26:37 -0700187 virtual android::status_t stop(bool isConnected);
188 virtual android::status_t notifyBufferReturned(int index);
Ashish Singhi77b747d2013-04-26 14:30:05 -0700189 virtual android::status_t setResolution(const FrameProcessingPolicy& policy, android::sp<IFrameListener> listener);
Andy Qiu8a427142013-04-05 17:41:58 -0700190protected:
Robert Crabtree2e984ef2013-05-07 14:27:47 -0700191 virtual IVideoPayloadManager* createVideoPayloadManager() = 0;
Andy Qiu8a427142013-04-05 17:41:58 -0700192
193protected:
194 bool mInitialized;
195 Hwcomposer& mHwc;
196 DisplayPlaneManager& mDisplayPlaneManager;
Robert Crabtree2e984ef2013-05-07 14:27:47 -0700197 IVideoPayloadManager *mPayloadManager;
Andy Qiu177b44e2013-11-07 18:03:02 -0800198 SoftVsyncObserver *mVsyncObserver;
Ashish Singhi3895d9b2013-11-04 14:43:33 -0800199 uint32_t mOrigContentWidth;
200 uint32_t mOrigContentHeight;
Robert Crabtree54565822013-12-10 17:02:03 -0800201 bool mFirstVideoFrame;
Brian Rogers1384af52014-05-21 12:13:17 -0700202 bool mLastConnectionStatus;
ljia58f33db82014-02-19 16:49:16 +0800203 uint32_t mCachedBufferCapcity;
Andy Qiu8a427142013-04-05 17:41:58 -0700204};
205
206}
207}
208
209#endif /* VIRTUAL_DEVICE_H */