liboverlay: Refactor, bug-fixes, upgrade.
* Fix memory leak during copying pipe objects.
* Remove unused / unnecessary code.
* setMemoryId API is merged with queueBuffer.
* setParameter API is setTransform now.
* Rotator upgraded to:
--Allow different rotator hardware types.
--Remove dependency on MDP code.
--Allocate memory only during first playback,
close when the associated pipe is closed.
* Have single commit implementation.
* Include new format types.
* Remove WAIT and CHANNEL enums and usage. Replace BypassPipe with
GenericPipe. Client expected to set alignments and parameters.
Add transform combination enums.
* Allow APIs to be called in any order. Do transform calcs in commit.
Move ext type setter and getter functions.
* Add calculations for 180 transform.
* Add secure session support in rotator
* Implement all rotations in terms of H flip, V flip and 90 rotation.
Change-Id: I34a9a2a0f1255b3467a0abbaa254d0b584e901ce
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index 09499c0..2cdd003 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -23,11 +23,11 @@
namespace ovutils = overlay::utils;
namespace overlay {
-bool MdpCtrl::open(uint32_t fbnum) {
- // FD open
+bool MdpCtrl::init(uint32_t fbnum) {
+ // FD init
if(!utils::openDev(mFd, fbnum,
- Res::devTemplate, O_RDWR)){
- ALOGE("Ctrl failed to open fbnum=%d", fbnum);
+ Res::fbPath, O_RDWR)){
+ ALOGE("Ctrl failed to init fbnum=%d", fbnum);
return false;
}
return true;
@@ -36,12 +36,15 @@
void MdpCtrl::reset() {
utils::memset0(mOVInfo);
utils::memset0(mLkgo);
- mOVInfo.id = -1;
- mLkgo.id = -1;
+ mOVInfo.id = MSMFB_NEW_REQUEST;
+ mLkgo.id = MSMFB_NEW_REQUEST;
+ mOrientation = utils::OVERLAY_TRANSFORM_0;
+ mRotUsed = false;
}
bool MdpCtrl::close() {
- if(-1 == static_cast<int>(mOVInfo.id)) return true;
+ if(MSMFB_NEW_REQUEST == static_cast<int>(mOVInfo.id))
+ return true;
if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) {
ALOGE("MdpCtrl close error in unset");
return false;
@@ -53,6 +56,86 @@
return true;
}
+bool MdpCtrl::setSource(const utils::PipeArgs& args) {
+
+ setSrcWhf(args.whf);
+
+ //TODO These are hardcoded. Can be moved out of setSource.
+ mOVInfo.alpha = 0xff;
+ mOVInfo.transp_mask = 0xffffffff;
+
+ //TODO These calls should ideally be a part of setPipeParams API
+ setFlags(args.mdpFlags);
+ setZ(args.zorder);
+ setIsFg(args.isFg);
+ return true;
+}
+
+bool MdpCtrl::setCrop(const utils::Dim& d) {
+ setSrcRectDim(d);
+ return true;
+}
+
+bool MdpCtrl::setPosition(const overlay::utils::Dim& d,
+ int fbw, int fbh)
+{
+ ovutils::Dim dim(d);
+ ovutils::Dim ovsrcdim = getSrcRectDim();
+ // Scaling of upto a max of 20 times supported
+ if(dim.w >(ovsrcdim.w * ovutils::HW_OV_MAGNIFICATION_LIMIT)){
+ dim.w = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.w;
+ dim.x = (fbw - dim.w) / 2;
+ }
+ if(dim.h >(ovsrcdim.h * ovutils::HW_OV_MAGNIFICATION_LIMIT)) {
+ dim.h = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.h;
+ dim.y = (fbh - dim.h) / 2;
+ }
+
+ setDstRectDim(dim);
+ return true;
+}
+
+bool MdpCtrl::setTransform(const utils::eTransform& orient,
+ const bool& rotUsed) {
+ mOrientation = orient;
+ int rot = utils::getMdpOrient(orient);
+ setUserData(rot);
+ //Rotator can be requested by client even if layer has 0 orientation.
+ mRotUsed = rotUsed;
+ return true;
+}
+
+void MdpCtrl::doTransform() {
+ adjustSrcWhf(mRotUsed);
+ setRotationFlags();
+ //180 will be H + V
+ //270 will be H + V + 90
+ if(mOrientation & utils::OVERLAY_TRANSFORM_FLIP_H) {
+ overlayTransFlipH();
+ }
+ if(mOrientation & utils::OVERLAY_TRANSFORM_FLIP_V) {
+ overlayTransFlipV();
+ }
+ if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90) {
+ overlayTransRot90();
+ }
+}
+
+bool MdpCtrl::set() {
+ //deferred calcs, so APIs could be called in any order.
+ doTransform();
+ if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
+ ALOGE("MdpCtrl failed to setOverlay, restoring last known "
+ "good ov info");
+ mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
+ mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
+ this->restore();
+ return false;
+ }
+ this->save();
+ return true;
+}
+
bool MdpCtrl::getScreenInfo(overlay::utils::ScreenInfo& info) {
fb_fix_screeninfo finfo;
if (!mdp_wrapper::getFScreenInfo(mFd.getFD(), finfo)) {
@@ -81,193 +164,24 @@
return true;
}
-// that is the second part of original setParameter function
-void MdpCtrl::setSrcFormat(const utils::Whf& whf) {
-
- //By default mdp src format is the same as buffer's
- mOVInfo.src.format = whf.format;
-
- //If rotation is used and input formats are tiled then output of rotator is
- //non-tiled.
- // FIXME mRotInfo.enable = 1; for enable
- if (getUserData()) { // if rotations enabled in MdpCtrl
- if (whf.format == MDP_Y_CRCB_H2V2_TILE)
- mOVInfo.src.format = MDP_Y_CRCB_H2V2;
- else if (whf.format == MDP_Y_CBCR_H2V2_TILE)
- mOVInfo.src.format = MDP_Y_CBCR_H2V2;
- return;
+//Adjust width, height, format if rotator is used.
+void MdpCtrl::adjustSrcWhf(const bool& rotUsed) {
+ if(rotUsed) {
+ utils::Whf whf = getSrcWhf();
+ if(whf.format == MDP_Y_CRCB_H2V2_TILE ||
+ whf.format == MDP_Y_CBCR_H2V2_TILE) {
+ whf.w = utils::alignup(whf.w, 64);
+ whf.h = utils::alignup(whf.h, 32);
+ }
+ //For example: If original format is tiled, rotator outputs non-tiled,
+ //so update mdp's src fmt to that.
+ whf.format = utils::getRotOutFmt(whf.format);
+ setSrcWhf(whf);
}
-
-}
-
-bool MdpCtrl::set() {
- if(!this->ovChanged()) {
- return true; // nothing todo here.
- }
-
- if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
- ALOGE("MdpCtrl failed to setOverlay, restoring last known "
- "good ov info");
- mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
- mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
- this->restore();
- // FIXME, do we need to set the old one?
- return false;
- }
- this->save();
- return true;
-}
-
-bool MdpCtrl::setPosition(const overlay::utils::Dim& d,
- int fbw, int fbh)
-{
- // Validatee against FB size
- if(!d.check(fbw, fbh)) {
- ALOGE("MdpCtrl setPosition failed dest dim violate screen limits");
- return false;
- }
-
- ovutils::Dim dim(d);
- ovutils::Dim ovsrcdim = getSrcRectDim();
- // Scaling of upto a max of 8 times supported
- if(dim.w >(ovsrcdim.w * ovutils::HW_OV_MAGNIFICATION_LIMIT)){
- dim.w = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.w;
- dim.x = (fbw - dim.w) / 2;
- }
- if(dim.h >(ovsrcdim.h * ovutils::HW_OV_MAGNIFICATION_LIMIT)) {
- dim.h = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.h;
- dim.y = (fbh - dim.h) / 2;
- }
-
- //dim.even_out();
- setDstRectDim(dim);
- return true;
-}
-
-void MdpCtrl::updateSource(RotatorBase* r,
- const utils::PipeArgs& args,
- const utils::ScreenInfo& info) {
- utils::Whf whf(args.whf);
- mOVInfo.src.width = whf.w;
- mOVInfo.src.height = whf.h;
- mOVInfo.src_rect.x = 0;
- mOVInfo.src_rect.y = 0;
- mOVInfo.dst_rect.x = 0;
- mOVInfo.dst_rect.y = 0;
- mOVInfo.dst_rect.w = whf.w;
- mOVInfo.dst_rect.h = whf.h;
- mOVInfo.src.format = whf.format;
-
- if(whf.format == MDP_Y_CRCB_H2V2_TILE ||
- (whf.format == MDP_Y_CBCR_H2V2_TILE)) {
- // passing by value, setInfo fills it and return by val
- mOVInfo = r->setInfo(args, mOVInfo);
- } else {
- mOVInfo.src_rect.w = whf.w;
- mOVInfo.src_rect.h = whf.h;
- }
-
- if (whf.w > info.mFBWidth)
- mOVInfo.dst_rect.w = info.mFBWidth;
- if (whf.h > info.mFBHeight)
- mOVInfo.dst_rect.h = info.mFBHeight;
- mSize = whf.size;
-}
-
-
-bool MdpCtrl::setInfo(RotatorBase* r,
- const utils::PipeArgs& args,
- const utils::ScreenInfo& info)
-{
- // new request
- utils::Whf whf(args.whf);
- mOVInfo.id = MSMFB_NEW_REQUEST;
-
- updateSource(r, args, info);
-
- setUserData(0);
- mOVInfo.alpha = 0xff;
- mOVInfo.transp_mask = 0xffffffff;
- setZ(args.zorder);
- setFlags(args.mdpFlags);
- setWait(args.wait);
- setIsFg(args.isFg);
- mSize = whf.size;
- return true;
-}
-
-bool MdpCtrl::setCrop(const utils::Dim& cdim) {
- utils::Dim d(cdim);
- const utils::Whf ovwhf = getSrcWhf();
- int udata = getUserData();
- switch(udata) {
- case MDP_ROT_NOP:
- break; // nothing to do here
- case MDP_ROT_90:
- case MDP_ROT_90 | MDP_FLIP_UD:
- case MDP_ROT_90 | MDP_FLIP_LR:
- {
- if (ovwhf.w < (d.y + d.h)) {
- ALOGE("MdpCtrl setCrop failed ROT 90 udata=%d",
- udata);
- d.dump();
- this->dump();
- return false;
- }
- uint32_t tmp = d.x;
- d.x = ovwhf.w - (d.y + d.h);
- d.y = tmp;
- utils::swap(d.w, d.h);
- }break;
- case MDP_ROT_270:
- {
- if (ovwhf.h < (d.x + d.w)) {
- ALOGE("MdpCtrl setCrop failed ROT 270 udata=%d",
- udata);
- d.dump();
- this->dump();
- return false;
- }
- uint32_t tmp = d.y;
- d.y = ovwhf.h - (d.x + d.w);
- d.x = tmp;
- utils::swap(d.w, d.h);
- }break;
- case MDP_ROT_180:
- {
- if ((ovwhf.h < (d.y + d.h)) ||
- (ovwhf.w < ( d.x + d.w))) {
- ALOGE("MdpCtrl setCrop failed ROT 180 udata=%d",
- udata);
- d.dump();
- this->dump();
- return false;
- }
- d.x = ovwhf.w - (d.x + d.w);
- d.y = ovwhf.h - (d.y + d.h);
- }break;
- default:
- if(!(udata & (MDP_FLIP_UD | MDP_FLIP_LR))) {
- ALOGE("MdpCtrl setCrop unknown rot %d", udata);
- return false;
- }
- }
-
- if(getSrcRectDim() == d) {
- return true; // Nothing to do here
- }
-
- utils::normalizeCrop(d.x, d.w);
- utils::normalizeCrop(d.y, d.h);
-
- setSrcRectDim(d);
-
- return true;
}
void MdpCtrl::dump() const {
ALOGE("== Dump MdpCtrl start ==");
- ALOGE("size=%d", mSize);
mFd.dump();
mdp_wrapper::dump("mOVInfo", mOVInfo);
ALOGE("== Dump MdpCtrl end ==");