blob: 30bda79949d6463bd4cbd47c97e31f14adf62db2 [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"
Naseer Ahmed29a26812012-06-14 00:56:20 -070025
26namespace overlay{
27
Naseer Ahmed29a26812012-06-14 00:56:20 -070028/*
29* Mdp Ctrl holds corresponding fd and MDP related struct.
30* It is simple wrapper to MDP services
31* */
32class MdpCtrl {
33public:
34 /* ctor reset */
35 explicit MdpCtrl();
36
37 /* dtor close */
38 ~MdpCtrl();
39
Naseer Ahmedf48aef62012-07-20 09:05:53 -070040 /* init underlying device using fbnum */
41 bool init(uint32_t fbnum);
Naseer Ahmed29a26812012-06-14 00:56:20 -070042
43 /* unset overlay, reset and close fd */
44 bool close();
45
Naseer Ahmedf48aef62012-07-20 09:05:53 -070046 /* reset and set ov id to -1 / MSMFB_NEW_REQUEST */
Naseer Ahmed29a26812012-06-14 00:56:20 -070047 void reset();
48
49 /* get orient / user_data[0] */
50 int getOrient() const;
51
52 /* returns session id */
Naseer Ahmedf48aef62012-07-20 09:05:53 -070053 int getPipeId() const;
Naseer Ahmed29a26812012-06-14 00:56:20 -070054
55 /* returns the fd associated to ctrl*/
56 int getFd() const;
57
58 /* Get screen info. out: info*/
59 bool getScreenInfo(utils::ScreenInfo& info);
60
61 /* overlay get */
62 bool get();
63
Naseer Ahmedf48aef62012-07-20 09:05:53 -070064 /* returns flags from mdp structure */
Naseer Ahmed29a26812012-06-14 00:56:20 -070065 int getFlags() const;
66
67 /* set flags to mdp structure */
68 void setFlags(int f);
69
Naseer Ahmed29a26812012-06-14 00:56:20 -070070 /* set z order */
71 void setZ(utils::eZorder z);
72
Naseer Ahmed29a26812012-06-14 00:56:20 -070073 /* set isFg flag */
74 void setIsFg(utils::eIsFg isFg);
75
76 /* calls overlay set
77 * Set would always consult last good known ov instance.
78 * Only if it is different, set would actually exectue ioctl.
79 * On a sucess ioctl. last good known ov instance is updated */
80 bool set();
81
82 /* return a copy of src whf*/
83 utils::Whf getSrcWhf() const;
84
85 /* set src whf */
86 void setSrcWhf(const utils::Whf& whf);
87
Naseer Ahmedf48aef62012-07-20 09:05:53 -070088 /* adjust source width height format based on rot info */
89 void adjustSrcWhf(const bool& rotUsed);
Naseer Ahmed29a26812012-06-14 00:56:20 -070090
91 /* swap src w/h*/
92 void swapSrcWH();
93
94 /* swap src rect w/h */
95 void swapSrcRectWH();
96
97 /* returns a copy to src rect dim */
98 utils::Dim getSrcRectDim() const;
99
100 /* set src/dst rect dim */
101 void setSrcRectDim(const utils::Dim d);
102 void setDstRectDim(const utils::Dim d);
103
104 /* returns a copy ro dst rect dim */
105 utils::Dim getDstRectDim() const;
106
107 /* returns user_data[0]*/
108 int getUserData() const;
109
110 /* sets user_data[0] */
111 void setUserData(int v);
112
113 /* return true if current overlay is different
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700114 * than last known good overlay */
Naseer Ahmed29a26812012-06-14 00:56:20 -0700115 bool ovChanged() const;
116
117 /* save mOVInfo to be last known good ov*/
118 void save();
119
120 /* restore last known good ov to be the current */
121 void restore();
122
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700123 /* Sets the source total width, height, format */
124 bool setSource(const utils::PipeArgs& pargs);
125
Naseer Ahmed29a26812012-06-14 00:56:20 -0700126 /*
127 * Sets ROI, the unpadded region, for source buffer.
128 * Should be called before a setPosition, for small clips.
129 * Dim - ROI dimensions.
130 */
131 bool setCrop(const utils::Dim& d);
132
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700133 bool setTransform(const utils::eTransform& orient, const bool& rotUsed);
134
Naseer Ahmed29a26812012-06-14 00:56:20 -0700135 /* given a dim and w/h, set overlay dim */
136 bool setPosition(const utils::Dim& dim, int w, int h);
137
138 /* using user_data, sets/unsets roationvalue in mdp flags */
139 void setRotationFlags();
140
141 /* dump state of the object */
142 void dump() const;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700143
Naseer Ahmed29a26812012-06-14 00:56:20 -0700144private:
145
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700146 /* helper functions for overlayTransform */
147 void doTransform();
148 void overlayTransFlipH();
149 void overlayTransFlipV();
150 void overlayTransRot90();
151
152 utils::eTransform mOrientation; //Holds requested orientation
153 bool mRotUsed; //whether rotator should be used even if requested
154 //orientation is 0.
155
Naseer Ahmed29a26812012-06-14 00:56:20 -0700156 /* last good known ov info */
157 mdp_overlay mLkgo;
158
159 /* Actual overlay mdp structure */
160 mdp_overlay mOVInfo;
161
162 /* FD for the mdp fbnum */
163 OvFD mFd;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700164};
165
166
167/* MDP 3D related ctrl */
168class MdpCtrl3D {
169public:
170 /* ctor reset data */
171 MdpCtrl3D();
172 /* calls MSMFB_OVERLAY_3D */
173 bool close();
174 /* set w/h. format is ignored*/
175 void setWh(const utils::Whf& whf);
176 /* set is_3d calls MSMFB_OVERLAY_3D */
177 bool useVirtualFB();
178 /* set fd to be used in ioctl */
179 void setFd(int fd);
180 /* dump */
181 void dump() const;
182private:
183 /* reset */
184 void reset();
185 /* actual MSM 3D info */
186 msmfb_overlay_3d m3DOVInfo;
187 /* FD for the mdp 3D */
188 OvFD mFd;
189};
190
191/* MDP data */
192class MdpData {
193public:
194 /* ctor reset data */
195 explicit MdpData();
196
197 /* dtor close*/
198 ~MdpData();
199
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700200 /* init FD */
201 bool init(uint32_t fbnum);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700202
203 /* memset0 the underlying mdp object */
204 void reset();
205
206 /* close fd, and reset */
207 bool close();
208
Naseer Ahmed29a26812012-06-14 00:56:20 -0700209 /* set id of mdp data */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700210 void setPipeId(int id);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700211
212 /* return ses id of data */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700213 int getPipeId() const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700214
215 /* get underlying fd*/
216 int getFd() const;
217
218 /* get memory_id */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700219 int getSrcMemoryId() const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700220
221 /* calls wrapper play */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700222 bool play(int fd, uint32_t offset);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700223
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700224 /* calls wrapper waitForVsync */
225 bool waitForVsync();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700226
227 /* dump state of the object */
228 void dump() const;
229private:
230
231 /* actual overlay mdp data */
232 msmfb_overlay_data mOvData;
233
234 /* fd to mdp fbnum */
235 OvFD mFd;
236};
237
238//--------------Inlines---------------------------------
239namespace utils {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700240inline bool openDev(OvFD& fd, int fbnum,
241 const char* const devpath,
242 int flags) {
243 return overlay::open(fd, fbnum, devpath, flags);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700244}
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700245}
246namespace {
247// just a helper func for common operations x-(y+z)
248int compute(uint32_t x, uint32_t y, uint32_t z) {
249 return x-(y+z);
250}
251}
Naseer Ahmed29a26812012-06-14 00:56:20 -0700252
253///// MdpCtrl //////
254
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700255inline MdpCtrl::MdpCtrl() {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700256 reset();
257}
258
259inline MdpCtrl::~MdpCtrl() {
260 close();
261}
262
263inline int MdpCtrl::getOrient() const {
264 return getUserData();
265}
266
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700267inline int MdpCtrl::getPipeId() const {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700268 return mOVInfo.id;
269}
270
271inline int MdpCtrl::getFd() const {
272 return mFd.getFD();
273}
274
275inline int MdpCtrl::getFlags() const {
276 return mOVInfo.flags;
277}
278
279inline void MdpCtrl::setFlags(int f) {
280 mOVInfo.flags = f;
281}
282
283inline void MdpCtrl::setZ(overlay::utils::eZorder z) {
284 mOVInfo.z_order = z;
285}
286
Naseer Ahmed29a26812012-06-14 00:56:20 -0700287inline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) {
288 mOVInfo.is_fg = isFg;
289}
290
291inline bool MdpCtrl::ovChanged() const {
292 // 0 means same
293 if(0 == ::memcmp(&mOVInfo, &mLkgo, sizeof (mdp_overlay))) {
294 return false;
295 }
296 return true;
297}
298
299inline void MdpCtrl::save() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700300 if(static_cast<ssize_t>(mOVInfo.id) == MSMFB_NEW_REQUEST) {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700301 ALOGE("MdpCtrl current ov has id -1, will not save");
Naseer Ahmed29a26812012-06-14 00:56:20 -0700302 return;
303 }
304 mLkgo = mOVInfo;
305}
306
307inline void MdpCtrl::restore() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700308 if(static_cast<ssize_t>(mLkgo.id) == MSMFB_NEW_REQUEST) {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700309 ALOGE("MdpCtrl Lkgo ov has id -1, will not restore");
Naseer Ahmed29a26812012-06-14 00:56:20 -0700310 return;
311 }
312 mOVInfo = mLkgo;
313}
314
315inline overlay::utils::Whf MdpCtrl::getSrcWhf() const {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700316 return utils::Whf( mOVInfo.src.width,
317 mOVInfo.src.height,
318 mOVInfo.src.format);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700319}
320
321inline void MdpCtrl::setSrcWhf(const overlay::utils::Whf& whf) {
322 mOVInfo.src.width = whf.w;
323 mOVInfo.src.height = whf.h;
324 mOVInfo.src.format = whf.format;
325}
326
327inline overlay::utils::Dim MdpCtrl::getSrcRectDim() const {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700328 return utils::Dim( mOVInfo.src_rect.x,
329 mOVInfo.src_rect.y,
330 mOVInfo.src_rect.w,
331 mOVInfo.src_rect.h);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700332}
333
334inline void MdpCtrl::setSrcRectDim(const overlay::utils::Dim d) {
335 mOVInfo.src_rect.x = d.x;
336 mOVInfo.src_rect.y = d.y;
337 mOVInfo.src_rect.w = d.w;
338 mOVInfo.src_rect.h = d.h;
339}
340
341inline overlay::utils::Dim MdpCtrl::getDstRectDim() const {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700342 return utils::Dim( mOVInfo.dst_rect.x,
343 mOVInfo.dst_rect.y,
344 mOVInfo.dst_rect.w,
345 mOVInfo.dst_rect.h);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700346}
347
348inline void MdpCtrl::setDstRectDim(const overlay::utils::Dim d) {
349 mOVInfo.dst_rect.x = d.x;
350 mOVInfo.dst_rect.y = d.y;
351 mOVInfo.dst_rect.w = d.w;
352 mOVInfo.dst_rect.h = d.h;
353}
354
355inline int MdpCtrl::getUserData() const { return mOVInfo.user_data[0]; }
356
357inline void MdpCtrl::setUserData(int v) { mOVInfo.user_data[0] = v; }
358
359inline void MdpCtrl::setRotationFlags() {
360 const int u = getUserData();
361 if (u == MDP_ROT_90 || u == MDP_ROT_270)
362 mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
363 else
364 mOVInfo.flags &= ~MDP_SOURCE_ROTATED_90;
365}
366
Naseer Ahmed29a26812012-06-14 00:56:20 -0700367inline void MdpCtrl::swapSrcWH() {
368 utils::swap(mOVInfo.src.width,
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700369 mOVInfo.src.height);
370}
Naseer Ahmed29a26812012-06-14 00:56:20 -0700371
372inline void MdpCtrl::swapSrcRectWH() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700373 utils::swap(mOVInfo.src_rect.w,
374 mOVInfo.src_rect.h);
375}
376
377inline void MdpCtrl::overlayTransFlipH()
378{
379 utils::Dim d = getSrcRectDim();
380 utils::Whf whf = getSrcWhf();
381 d.x = compute(whf.w, d.x, d.w);
382 setSrcRectDim(d);
383}
384
385inline void MdpCtrl::overlayTransFlipV()
386{
387 utils::Dim d = getSrcRectDim();
388 utils::Whf whf = getSrcWhf();
389 d.y = compute(whf.h, d.y, d.h);
390 setSrcRectDim(d);
391}
392
393inline void MdpCtrl::overlayTransRot90()
394{
395 utils::Dim d = getSrcRectDim();
396 utils::Whf whf = getSrcWhf();
397 int tmp = d.x;
398 d.x = compute(whf.h,
399 d.y,
400 d.h);
401 d.y = tmp;
402 setSrcRectDim(d);
403 swapSrcWH();
404 swapSrcRectWH();
405}
406
Naseer Ahmed29a26812012-06-14 00:56:20 -0700407
408/////// MdpCtrl3D //////
409
410inline MdpCtrl3D::MdpCtrl3D() { reset(); }
411inline bool MdpCtrl3D::close() {
412 if (m3DOVInfo.is_3d) {
413 m3DOVInfo.is_3d = 0;
414 if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
415 ALOGE("MdpCtrl3D close failed set3D with 0");
416 return false;
417 }
418 }
419 reset();
420 return true;
421}
422inline void MdpCtrl3D::reset() {
423 utils::memset0(m3DOVInfo);
424}
425
426inline void MdpCtrl3D::setFd(int fd) {
427 mFd.copy(fd);
428 OVASSERT(mFd.valid(), "MdpCtrl3D setFd, FD should be valid");
429}
430
431inline void MdpCtrl3D::setWh(const utils::Whf& whf) {
432 // ignore fmt. Needed for useVirtualFB callflow
433 m3DOVInfo.width = whf.w;
434 m3DOVInfo.height = whf.h;
435}
436
437inline bool MdpCtrl3D::useVirtualFB() {
438 if(!m3DOVInfo.is_3d) {
439 m3DOVInfo.is_3d = 1;
440 if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
441 ALOGE("MdpCtrl3D close failed set3D with 0");
442 return false;
443 }
444 }
445 return true;
446}
447
448/////// MdpData //////
449
450inline MdpData::MdpData() { reset(); }
451
452inline MdpData::~MdpData() { close(); }
453
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700454inline bool MdpData::init(uint32_t fbnum) {
455 // FD init
456 if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){
457 ALOGE("Ctrl failed to init fbnum=%d", fbnum);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700458 return false;
459 }
460 return true;
461}
462
463inline void MdpData::reset() {
464 overlay::utils::memset0(mOvData);
465 mOvData.data.memory_id = -1;
466}
467
468inline bool MdpData::close() {
469 if(-1 == mOvData.data.memory_id) return true;
470 reset();
471 if(!mFd.close()) {
472 return false;
473 }
474 return true;
475}
476
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700477inline int MdpData::getSrcMemoryId() const { return mOvData.data.memory_id; }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700478
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700479inline void MdpData::setPipeId(int id) { mOvData.id = id; }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700480
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700481inline int MdpData::getPipeId() const { return mOvData.id; }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700482
483inline int MdpData::getFd() const { return mFd.getFD(); }
484
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700485inline bool MdpData::play(int fd, uint32_t offset) {
486 mOvData.data.memory_id = fd;
487 mOvData.data.offset = offset;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700488 if(!mdp_wrapper::play(mFd.getFD(), mOvData)){
489 ALOGE("MdpData failed to play");
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700490 dump();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700491 return false;
492 }
493 return true;
494}
495
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700496inline bool MdpData::waitForVsync() {
497 if(!mdp_wrapper::waitForVsync(mFd.getFD(), mOvData)){
498 ALOGE("%s failed", __FUNCTION__);
499 dump();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700500 return false;
501 }
502 return true;
503}
504
505} // overlay
506
507#endif // OVERLAY_MDP_H