blob: 55e2787696151fb2440131a3c65a6257240ca23a [file] [log] [blame]
Naseer Ahmed29a26812012-06-14 00:56:20 -07001/*
2* Copyright (C) 2008 The Android Open Source Project
Raj kamal23f69b22012-11-17 00:20:55 +05303* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
Naseer Ahmed29a26812012-06-14 00:56:20 -07004*
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
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800133 bool setTransform(const utils::eTransform& orient);
134
135 /* set whether rotator can be used */
136 void setRotatorUsed(const bool& rotUsed);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700137
Naseer Ahmed29a26812012-06-14 00:56:20 -0700138 /* given a dim and w/h, set overlay dim */
139 bool setPosition(const utils::Dim& dim, int w, int h);
140
141 /* using user_data, sets/unsets roationvalue in mdp flags */
142 void setRotationFlags();
143
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800144 /* Perform transformation calculations */
145 void doTransform();
146
147 /* Performs downscale calculations */
148 void doDownscale(int dscale_factor);
149
150 /* Get downscale factor */
151 int getDownscalefactor();
152
Raj kamal23f69b22012-11-17 00:20:55 +0530153 /* Update the src format */
154 void updateSrcformat(const uint32_t& inputsrcFormat);
155
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800156 /* dump state of the object */
157 void dump() const;
158
159 /* Return the dump in the specified buffer */
160 void getDump(char *buf, size_t len);
161
Naseer Ahmed29a26812012-06-14 00:56:20 -0700162private:
163
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700164 /* helper functions for overlayTransform */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700165 void overlayTransFlipH();
166 void overlayTransFlipV();
167 void overlayTransRot90();
168
169 utils::eTransform mOrientation; //Holds requested orientation
170 bool mRotUsed; //whether rotator should be used even if requested
171 //orientation is 0.
172
Naseer Ahmed29a26812012-06-14 00:56:20 -0700173 /* last good known ov info */
174 mdp_overlay mLkgo;
175
176 /* Actual overlay mdp structure */
177 mdp_overlay mOVInfo;
178
179 /* FD for the mdp fbnum */
180 OvFD mFd;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700181};
182
183
184/* MDP 3D related ctrl */
185class MdpCtrl3D {
186public:
187 /* ctor reset data */
188 MdpCtrl3D();
189 /* calls MSMFB_OVERLAY_3D */
190 bool close();
191 /* set w/h. format is ignored*/
192 void setWh(const utils::Whf& whf);
193 /* set is_3d calls MSMFB_OVERLAY_3D */
194 bool useVirtualFB();
195 /* set fd to be used in ioctl */
196 void setFd(int fd);
197 /* dump */
198 void dump() const;
199private:
200 /* reset */
201 void reset();
202 /* actual MSM 3D info */
203 msmfb_overlay_3d m3DOVInfo;
204 /* FD for the mdp 3D */
205 OvFD mFd;
206};
207
208/* MDP data */
209class MdpData {
210public:
211 /* ctor reset data */
212 explicit MdpData();
213
214 /* dtor close*/
215 ~MdpData();
216
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700217 /* init FD */
218 bool init(uint32_t fbnum);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700219
220 /* memset0 the underlying mdp object */
221 void reset();
222
223 /* close fd, and reset */
224 bool close();
225
Naseer Ahmed29a26812012-06-14 00:56:20 -0700226 /* set id of mdp data */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700227 void setPipeId(int id);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700228
229 /* return ses id of data */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700230 int getPipeId() const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700231
232 /* get underlying fd*/
233 int getFd() const;
234
235 /* get memory_id */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700236 int getSrcMemoryId() const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700237
238 /* calls wrapper play */
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700239 bool play(int fd, uint32_t offset);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700240
Naseer Ahmed29a26812012-06-14 00:56:20 -0700241 /* dump state of the object */
242 void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800243
244 /* Return the dump in the specified buffer */
245 void getDump(char *buf, size_t len);
246
Naseer Ahmed29a26812012-06-14 00:56:20 -0700247private:
248
249 /* actual overlay mdp data */
250 msmfb_overlay_data mOvData;
251
252 /* fd to mdp fbnum */
253 OvFD mFd;
254};
255
256//--------------Inlines---------------------------------
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700257namespace {
258// just a helper func for common operations x-(y+z)
259int compute(uint32_t x, uint32_t y, uint32_t z) {
260 return x-(y+z);
261}
262}
Naseer Ahmed29a26812012-06-14 00:56:20 -0700263
264///// MdpCtrl //////
265
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700266inline MdpCtrl::MdpCtrl() {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700267 reset();
268}
269
270inline MdpCtrl::~MdpCtrl() {
271 close();
272}
273
274inline int MdpCtrl::getOrient() const {
275 return getUserData();
276}
277
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700278inline int MdpCtrl::getPipeId() const {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700279 return mOVInfo.id;
280}
281
282inline int MdpCtrl::getFd() const {
283 return mFd.getFD();
284}
285
286inline int MdpCtrl::getFlags() const {
287 return mOVInfo.flags;
288}
289
290inline void MdpCtrl::setFlags(int f) {
291 mOVInfo.flags = f;
292}
293
294inline void MdpCtrl::setZ(overlay::utils::eZorder z) {
295 mOVInfo.z_order = z;
296}
297
Naseer Ahmed29a26812012-06-14 00:56:20 -0700298inline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) {
299 mOVInfo.is_fg = isFg;
300}
301
302inline bool MdpCtrl::ovChanged() const {
303 // 0 means same
304 if(0 == ::memcmp(&mOVInfo, &mLkgo, sizeof (mdp_overlay))) {
305 return false;
306 }
307 return true;
308}
309
310inline void MdpCtrl::save() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700311 if(static_cast<ssize_t>(mOVInfo.id) == MSMFB_NEW_REQUEST) {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700312 ALOGE("MdpCtrl current ov has id -1, will not save");
Naseer Ahmed29a26812012-06-14 00:56:20 -0700313 return;
314 }
315 mLkgo = mOVInfo;
316}
317
318inline void MdpCtrl::restore() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700319 if(static_cast<ssize_t>(mLkgo.id) == MSMFB_NEW_REQUEST) {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700320 ALOGE("MdpCtrl Lkgo ov has id -1, will not restore");
Naseer Ahmed29a26812012-06-14 00:56:20 -0700321 return;
322 }
323 mOVInfo = mLkgo;
324}
325
326inline overlay::utils::Whf MdpCtrl::getSrcWhf() const {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700327 return utils::Whf( mOVInfo.src.width,
328 mOVInfo.src.height,
329 mOVInfo.src.format);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700330}
331
332inline void MdpCtrl::setSrcWhf(const overlay::utils::Whf& whf) {
333 mOVInfo.src.width = whf.w;
334 mOVInfo.src.height = whf.h;
335 mOVInfo.src.format = whf.format;
336}
337
338inline overlay::utils::Dim MdpCtrl::getSrcRectDim() const {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700339 return utils::Dim( mOVInfo.src_rect.x,
340 mOVInfo.src_rect.y,
341 mOVInfo.src_rect.w,
342 mOVInfo.src_rect.h);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700343}
344
345inline void MdpCtrl::setSrcRectDim(const overlay::utils::Dim d) {
346 mOVInfo.src_rect.x = d.x;
347 mOVInfo.src_rect.y = d.y;
348 mOVInfo.src_rect.w = d.w;
349 mOVInfo.src_rect.h = d.h;
350}
351
352inline overlay::utils::Dim MdpCtrl::getDstRectDim() const {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700353 return utils::Dim( mOVInfo.dst_rect.x,
354 mOVInfo.dst_rect.y,
355 mOVInfo.dst_rect.w,
356 mOVInfo.dst_rect.h);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700357}
358
359inline void MdpCtrl::setDstRectDim(const overlay::utils::Dim d) {
360 mOVInfo.dst_rect.x = d.x;
361 mOVInfo.dst_rect.y = d.y;
362 mOVInfo.dst_rect.w = d.w;
363 mOVInfo.dst_rect.h = d.h;
364}
365
366inline int MdpCtrl::getUserData() const { return mOVInfo.user_data[0]; }
367
368inline void MdpCtrl::setUserData(int v) { mOVInfo.user_data[0] = v; }
369
370inline void MdpCtrl::setRotationFlags() {
371 const int u = getUserData();
372 if (u == MDP_ROT_90 || u == MDP_ROT_270)
373 mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
374 else
375 mOVInfo.flags &= ~MDP_SOURCE_ROTATED_90;
376}
377
Naseer Ahmed29a26812012-06-14 00:56:20 -0700378inline void MdpCtrl::swapSrcWH() {
379 utils::swap(mOVInfo.src.width,
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700380 mOVInfo.src.height);
381}
Naseer Ahmed29a26812012-06-14 00:56:20 -0700382
383inline void MdpCtrl::swapSrcRectWH() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700384 utils::swap(mOVInfo.src_rect.w,
385 mOVInfo.src_rect.h);
386}
387
388inline void MdpCtrl::overlayTransFlipH()
389{
390 utils::Dim d = getSrcRectDim();
391 utils::Whf whf = getSrcWhf();
392 d.x = compute(whf.w, d.x, d.w);
393 setSrcRectDim(d);
394}
395
396inline void MdpCtrl::overlayTransFlipV()
397{
398 utils::Dim d = getSrcRectDim();
399 utils::Whf whf = getSrcWhf();
400 d.y = compute(whf.h, d.y, d.h);
401 setSrcRectDim(d);
402}
403
404inline void MdpCtrl::overlayTransRot90()
405{
406 utils::Dim d = getSrcRectDim();
407 utils::Whf whf = getSrcWhf();
408 int tmp = d.x;
409 d.x = compute(whf.h,
410 d.y,
411 d.h);
412 d.y = tmp;
413 setSrcRectDim(d);
414 swapSrcWH();
415 swapSrcRectWH();
416}
417
Naseer Ahmed29a26812012-06-14 00:56:20 -0700418
419/////// MdpCtrl3D //////
420
421inline MdpCtrl3D::MdpCtrl3D() { reset(); }
422inline bool MdpCtrl3D::close() {
423 if (m3DOVInfo.is_3d) {
424 m3DOVInfo.is_3d = 0;
425 if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
426 ALOGE("MdpCtrl3D close failed set3D with 0");
427 return false;
428 }
429 }
430 reset();
431 return true;
432}
433inline void MdpCtrl3D::reset() {
434 utils::memset0(m3DOVInfo);
435}
436
437inline void MdpCtrl3D::setFd(int fd) {
438 mFd.copy(fd);
439 OVASSERT(mFd.valid(), "MdpCtrl3D setFd, FD should be valid");
440}
441
442inline void MdpCtrl3D::setWh(const utils::Whf& whf) {
443 // ignore fmt. Needed for useVirtualFB callflow
444 m3DOVInfo.width = whf.w;
445 m3DOVInfo.height = whf.h;
446}
447
448inline bool MdpCtrl3D::useVirtualFB() {
449 if(!m3DOVInfo.is_3d) {
450 m3DOVInfo.is_3d = 1;
451 if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
452 ALOGE("MdpCtrl3D close failed set3D with 0");
453 return false;
454 }
455 }
456 return true;
457}
458
459/////// MdpData //////
460
461inline MdpData::MdpData() { reset(); }
462
463inline MdpData::~MdpData() { close(); }
464
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700465inline bool MdpData::init(uint32_t fbnum) {
466 // FD init
467 if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){
468 ALOGE("Ctrl failed to init fbnum=%d", fbnum);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700469 return false;
470 }
471 return true;
472}
473
474inline void MdpData::reset() {
475 overlay::utils::memset0(mOvData);
476 mOvData.data.memory_id = -1;
477}
478
479inline bool MdpData::close() {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700480 reset();
Saurabh Shah8e1ae952012-08-15 12:15:14 -0700481 return mFd.close();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700482}
483
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700484inline int MdpData::getSrcMemoryId() const { return mOvData.data.memory_id; }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700485
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700486inline void MdpData::setPipeId(int id) { mOvData.id = id; }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700487
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700488inline int MdpData::getPipeId() const { return mOvData.id; }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700489
490inline int MdpData::getFd() const { return mFd.getFD(); }
491
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700492inline bool MdpData::play(int fd, uint32_t offset) {
493 mOvData.data.memory_id = fd;
494 mOvData.data.offset = offset;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700495 if(!mdp_wrapper::play(mFd.getFD(), mOvData)){
496 ALOGE("MdpData failed to play");
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700497 dump();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700498 return false;
499 }
500 return true;
501}
502
Naseer Ahmed29a26812012-06-14 00:56:20 -0700503} // overlay
504
505#endif // OVERLAY_MDP_H