blob: 29f8fd5a31e646d226408b31c568649af74a2b8e [file] [log] [blame]
Naseer Ahmed29a26812012-06-14 00:56:20 -07001/*
2* Copyright (C) 2008 The Android Open Source Project
3* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
4*
5* Licensed under the Apache License, Version 2.0 (the "License");
6* you may not use this file except in compliance with the License.
7* You may obtain a copy of the License at
8*
9* http://www.apache.org/licenses/LICENSE-2.0
10*
11* Unless required by applicable law or agreed to in writing, software
12* distributed under the License is distributed on an "AS IS" BASIS,
13* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14* See the License for the specific language governing permissions and
15* limitations under the License.
16*/
17
18#ifndef OVERLAY_MDP_H
19#define OVERLAY_MDP_H
20
21#include <linux/msm_mdp.h>
22
23#include "overlayUtils.h"
24#include "mdpWrapper.h"
25#include "overlayRotator.h"
26
27namespace overlay{
28
29class RotatorBase;
30
31/*
32* Mdp Ctrl holds corresponding fd and MDP related struct.
33* It is simple wrapper to MDP services
34* */
35class MdpCtrl {
36public:
37 /* ctor reset */
38 explicit MdpCtrl();
39
40 /* dtor close */
41 ~MdpCtrl();
42
43 /* Open underlying device using fbnum */
44 bool open(uint32_t fbnum);
45
46 /* unset overlay, reset and close fd */
47 bool close();
48
49 /* reset and set ov id to -1*/
50 void reset();
51
52 /* get orient / user_data[0] */
53 int getOrient() const;
54
55 /* returns session id */
56 int getId() const;
57
58 /* returns the fd associated to ctrl*/
59 int getFd() const;
60
61 /* Get screen info. out: info*/
62 bool getScreenInfo(utils::ScreenInfo& info);
63
64 /* overlay get */
65 bool get();
66
67 /* returns flags from mdp structure.
68 * Flags are WAIT/NOWAIT/PIPE SHARED*/
69 int getFlags() const;
70
71 /* set flags to mdp structure */
72 void setFlags(int f);
73
74 /* code taken from OverlayControlChannel::setOverlayInformation */
75 bool setInfo(RotatorBase* r,
76 const utils::PipeArgs& args,
77 const utils::ScreenInfo& info);
78
79 /* given whf, update src */
80 void updateSource(RotatorBase* r,
81 const utils::PipeArgs& args,
82 const utils::ScreenInfo& info);
83
84 /* set z order */
85 void setZ(utils::eZorder z);
86
87 /* set Wait/nowait */
88 void setWait(utils::eWait wait);
89
90 /* set isFg flag */
91 void setIsFg(utils::eIsFg isFg);
92
93 /* calls overlay set
94 * Set would always consult last good known ov instance.
95 * Only if it is different, set would actually exectue ioctl.
96 * On a sucess ioctl. last good known ov instance is updated */
97 bool set();
98
99 /* return a copy of src whf*/
100 utils::Whf getSrcWhf() const;
101
102 /* set src whf */
103 void setSrcWhf(const utils::Whf& whf);
104
105 /* set source format based on rot info */
106 void setSrcFormat(const utils::Whf& whf);
107
108 /* swap src w/h*/
109 void swapSrcWH();
110
111 /* swap src rect w/h */
112 void swapSrcRectWH();
113
114 /* returns a copy to src rect dim */
115 utils::Dim getSrcRectDim() const;
116
117 /* set src/dst rect dim */
118 void setSrcRectDim(const utils::Dim d);
119 void setDstRectDim(const utils::Dim d);
120
121 /* returns a copy ro dst rect dim */
122 utils::Dim getDstRectDim() const;
123
124 /* returns user_data[0]*/
125 int getUserData() const;
126
127 /* sets user_data[0] */
128 void setUserData(int v);
129
130 /* return true if current overlay is different
131 * than lask known good overlay */
132 bool ovChanged() const;
133
134 /* save mOVInfo to be last known good ov*/
135 void save();
136
137 /* restore last known good ov to be the current */
138 void restore();
139
140 /*
141 * Sets ROI, the unpadded region, for source buffer.
142 * Should be called before a setPosition, for small clips.
143 * Dim - ROI dimensions.
144 */
145 bool setCrop(const utils::Dim& d);
146
147 /* given a dim and w/h, set overlay dim */
148 bool setPosition(const utils::Dim& dim, int w, int h);
149
150 /* using user_data, sets/unsets roationvalue in mdp flags */
151 void setRotationFlags();
152
153 /* dump state of the object */
154 void dump() const;
155private:
156
157 /* last good known ov info */
158 mdp_overlay mLkgo;
159
160 /* Actual overlay mdp structure */
161 mdp_overlay mOVInfo;
162
163 /* FD for the mdp fbnum */
164 OvFD mFd;
165
166 /* cached size FIXME do we need it? */
167 uint32_t mSize;
168};
169
170
171/* MDP 3D related ctrl */
172class MdpCtrl3D {
173public:
174 /* ctor reset data */
175 MdpCtrl3D();
176 /* calls MSMFB_OVERLAY_3D */
177 bool close();
178 /* set w/h. format is ignored*/
179 void setWh(const utils::Whf& whf);
180 /* set is_3d calls MSMFB_OVERLAY_3D */
181 bool useVirtualFB();
182 /* set fd to be used in ioctl */
183 void setFd(int fd);
184 /* dump */
185 void dump() const;
186private:
187 /* reset */
188 void reset();
189 /* actual MSM 3D info */
190 msmfb_overlay_3d m3DOVInfo;
191 /* FD for the mdp 3D */
192 OvFD mFd;
193};
194
195/* MDP data */
196class MdpData {
197public:
198 /* ctor reset data */
199 explicit MdpData();
200
201 /* dtor close*/
202 ~MdpData();
203
204 /* open FD */
205 bool open(uint32_t fbnum);
206
207 /* memset0 the underlying mdp object */
208 void reset();
209
210 /* close fd, and reset */
211 bool close();
212
213 /* Set FD / memid */
214 void setMemoryId(int id);
215
216 /* set id of mdp data */
217 void setId(int id);
218
219 /* return ses id of data */
220 int getId() const;
221
222 /* get underlying fd*/
223 int getFd() const;
224
225 /* get memory_id */
226 int getMemoryId() const;
227
228 /* set offset in underlying mdp obj */
229 void setOffset(uint32_t o);
230
231 /* calls wrapper play */
232 bool play();
233
234 /* calls wrapper playWait */
235 bool playWait();
236
237 /* dump state of the object */
238 void dump() const;
239private:
240
241 /* actual overlay mdp data */
242 msmfb_overlay_data mOvData;
243
244 /* fd to mdp fbnum */
245 OvFD mFd;
246};
247
248//--------------Inlines---------------------------------
249namespace utils {
250 inline bool openDev(OvFD& fd, int fb,
251 const char* const s,
252 int flags) {
253 return overlay::open(fd, fb, Res::devTemplate, O_RDWR);
254 }
255}
256
257template <class T>
258 inline void init(T& t) {
259 memset(&t, 0, sizeof(T));
260 }
261
262///// MdpCtrl //////
263
264inline MdpCtrl::MdpCtrl() : mSize(0) {
265 reset();
266}
267
268inline MdpCtrl::~MdpCtrl() {
269 close();
270}
271
272inline int MdpCtrl::getOrient() const {
273 return getUserData();
274}
275
276inline int MdpCtrl::getId() const {
277 return mOVInfo.id;
278}
279
280inline int MdpCtrl::getFd() const {
281 return mFd.getFD();
282}
283
284inline int MdpCtrl::getFlags() const {
285 return mOVInfo.flags;
286}
287
288inline void MdpCtrl::setFlags(int f) {
289 mOVInfo.flags = f;
290}
291
292inline void MdpCtrl::setZ(overlay::utils::eZorder z) {
293 mOVInfo.z_order = z;
294}
295
296inline void MdpCtrl::setWait(overlay::utils::eWait wait) {
297 mOVInfo.flags = utils::setWait(wait, mOVInfo.flags);
298}
299
300inline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) {
301 mOVInfo.is_fg = isFg;
302}
303
304inline bool MdpCtrl::ovChanged() const {
305 // 0 means same
306 if(0 == ::memcmp(&mOVInfo, &mLkgo, sizeof (mdp_overlay))) {
307 return false;
308 }
309 return true;
310}
311
312inline void MdpCtrl::save() {
313 if(static_cast<ssize_t>(mOVInfo.id) == -1) {
314 ALOGE("MdpCtrl current ov has id -1, will not save");
315 // FIXME dump both?
316 return;
317 }
318 mLkgo = mOVInfo;
319}
320
321inline void MdpCtrl::restore() {
322 if(static_cast<ssize_t>(mLkgo.id) == -1) {
323 ALOGE("MdpCtrl Lkgo ov has id -1, will not restore");
324 // FIXME dump both?
325 return;
326 }
327 mOVInfo = mLkgo;
328}
329
330inline overlay::utils::Whf MdpCtrl::getSrcWhf() const {
331 return utils::Whf(mOVInfo.src.width,
332 mOVInfo.src.height,
333 mOVInfo.src.format);
334}
335
336inline void MdpCtrl::setSrcWhf(const overlay::utils::Whf& whf) {
337 mOVInfo.src.width = whf.w;
338 mOVInfo.src.height = whf.h;
339 mOVInfo.src.format = whf.format;
340}
341
342inline overlay::utils::Dim MdpCtrl::getSrcRectDim() const {
343 return utils::Dim(mOVInfo.src_rect.x,
344 mOVInfo.src_rect.y,
345 mOVInfo.src_rect.w,
346 mOVInfo.src_rect.h);
347}
348
349inline void MdpCtrl::setSrcRectDim(const overlay::utils::Dim d) {
350 mOVInfo.src_rect.x = d.x;
351 mOVInfo.src_rect.y = d.y;
352 mOVInfo.src_rect.w = d.w;
353 mOVInfo.src_rect.h = d.h;
354}
355
356inline overlay::utils::Dim MdpCtrl::getDstRectDim() const {
357 return utils::Dim(mOVInfo.dst_rect.x,
358 mOVInfo.dst_rect.y,
359 mOVInfo.dst_rect.w,
360 mOVInfo.dst_rect.h);
361}
362
363inline void MdpCtrl::setDstRectDim(const overlay::utils::Dim d) {
364 mOVInfo.dst_rect.x = d.x;
365 mOVInfo.dst_rect.y = d.y;
366 mOVInfo.dst_rect.w = d.w;
367 mOVInfo.dst_rect.h = d.h;
368}
369
370inline int MdpCtrl::getUserData() const { return mOVInfo.user_data[0]; }
371
372inline void MdpCtrl::setUserData(int v) { mOVInfo.user_data[0] = v; }
373
374inline void MdpCtrl::setRotationFlags() {
375 const int u = getUserData();
376 if (u == MDP_ROT_90 || u == MDP_ROT_270)
377 mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
378 else
379 mOVInfo.flags &= ~MDP_SOURCE_ROTATED_90;
380}
381
382
383inline void MdpCtrl::swapSrcWH() {
384 utils::swap(mOVInfo.src.width,
385 mOVInfo.src.height); }
386
387inline void MdpCtrl::swapSrcRectWH() {
388 utils::swap(mOVInfo.src_rect.h,
389 mOVInfo.src_rect.w); }
390
391/////// MdpCtrl3D //////
392
393inline MdpCtrl3D::MdpCtrl3D() { reset(); }
394inline bool MdpCtrl3D::close() {
395 if (m3DOVInfo.is_3d) {
396 m3DOVInfo.is_3d = 0;
397 if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
398 ALOGE("MdpCtrl3D close failed set3D with 0");
399 return false;
400 }
401 }
402 reset();
403 return true;
404}
405inline void MdpCtrl3D::reset() {
406 utils::memset0(m3DOVInfo);
407}
408
409inline void MdpCtrl3D::setFd(int fd) {
410 mFd.copy(fd);
411 OVASSERT(mFd.valid(), "MdpCtrl3D setFd, FD should be valid");
412}
413
414inline void MdpCtrl3D::setWh(const utils::Whf& whf) {
415 // ignore fmt. Needed for useVirtualFB callflow
416 m3DOVInfo.width = whf.w;
417 m3DOVInfo.height = whf.h;
418}
419
420inline bool MdpCtrl3D::useVirtualFB() {
421 if(!m3DOVInfo.is_3d) {
422 m3DOVInfo.is_3d = 1;
423 if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
424 ALOGE("MdpCtrl3D close failed set3D with 0");
425 return false;
426 }
427 }
428 return true;
429}
430
431/////// MdpData //////
432
433inline MdpData::MdpData() { reset(); }
434
435inline MdpData::~MdpData() { close(); }
436
437inline bool MdpData::open(uint32_t fbnum) {
438 // FD open
439 if(!utils::openDev(mFd, fbnum, Res::devTemplate, O_RDWR)){
440 ALOGE("Ctrl failed to open fbnum=%d", fbnum);
441 return false;
442 }
443 return true;
444}
445
446inline void MdpData::reset() {
447 overlay::utils::memset0(mOvData);
448 mOvData.data.memory_id = -1;
449}
450
451inline bool MdpData::close() {
452 if(-1 == mOvData.data.memory_id) return true;
453 reset();
454 if(!mFd.close()) {
455 return false;
456 }
457 return true;
458}
459
460inline void MdpData::setMemoryId(int id) { mOvData.data.memory_id = id; }
461inline int MdpData::getMemoryId() const { return mOvData.data.memory_id; }
462
463inline void MdpData::setId(int id) { mOvData.id = id; }
464
465inline int MdpData::getId() const { return mOvData.id; }
466
467inline int MdpData::getFd() const { return mFd.getFD(); }
468
469inline void MdpData::setOffset(uint32_t o) { mOvData.data.offset = o; }
470
471inline bool MdpData::play() {
472 if(!mdp_wrapper::play(mFd.getFD(), mOvData)){
473 ALOGE("MdpData failed to play");
474 return false;
475 }
476 return true;
477}
478
479inline bool MdpData::playWait() {
480 if(!mdp_wrapper::playWait(mFd.getFD(), mOvData)){
481 ALOGE("MdpData failed to playWait");
482 return false;
483 }
484 return true;
485}
486
487} // overlay
488
489#endif // OVERLAY_MDP_H