129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Copyright (C) 2008 The Android Open Source Project 3e33e6a894950f7d258d79bc48441575e2b0981dbRaj kamal* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Licensed under the Apache License, Version 2.0 (the "License"); 629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* you may not use this file except in compliance with the License. 729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* You may obtain a copy of the License at 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* http://www.apache.org/licenses/LICENSE-2.0 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Unless required by applicable law or agreed to in writing, software 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* distributed under the License is distributed on an "AS IS" BASIS, 1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* See the License for the specific language governing permissions and 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* limitations under the License. 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*/ 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#ifndef OVERLAY_MDP_H 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define OVERLAY_MDP_H 2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <linux/msm_mdp.h> 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayUtils.h" 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "mdpWrapper.h" 25e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#include "qdMetaData.h" 26e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#ifdef USES_POST_PROCESSING 27e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#include "lib-postproc.h" 28e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#endif 2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay{ 3129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Mdp Ctrl holds corresponding fd and MDP related struct. 3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* It is simple wrapper to MDP services 3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* */ 3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass MdpCtrl { 3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic: 3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* ctor reset */ 3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed explicit MdpCtrl(); 4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* dtor close */ 4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ~MdpCtrl(); 42f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed /* init underlying device using fbnum */ 43f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed bool init(uint32_t fbnum); 4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* unset overlay, reset and close fd */ 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed bool close(); 46f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed /* reset and set ov id to -1 / MSMFB_NEW_REQUEST */ 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void reset(); 4836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* calls overlay set 4936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah * Set would always consult last good known ov instance. 5036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah * Only if it is different, set would actually exectue ioctl. 5136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah * On a sucess ioctl. last good known ov instance is updated */ 5236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah bool set(); 5336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* Sets the source total width, height, format */ 5436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void setSource(const utils::PipeArgs& pargs); 5536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* 5636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah * Sets ROI, the unpadded region, for source buffer. 5736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah * Dim - ROI dimensions. 5836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah */ 5936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void setCrop(const utils::Dim& d); 6036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void setTransform(const utils::eTransform& orient); 6136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* given a dim and w/h, set overlay dim */ 6236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void setPosition(const utils::Dim& dim); 6336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* using user_data, sets/unsets roationvalue in mdp flags */ 6436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void setRotationFlags(); 6536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* Performs downscale calculations */ 6636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void setDownscale(int dscale_factor); 6736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* Update the src format with rotator's dest*/ 6836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void updateSrcFormat(const uint32_t& rotDstFormat); 6936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* dump state of the object */ 7036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void dump() const; 7136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* Return the dump in the specified buffer */ 7236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void getDump(char *buf, size_t len); 7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* returns session id */ 75f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed int getPipeId() const; 7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* returns the fd associated to ctrl*/ 7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int getFd() const; 7836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* returns a copy ro dst rect dim */ 7936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah utils::Dim getDstRectDim() const; 8036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* returns a copy to src rect dim */ 8136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah utils::Dim getSrcRectDim() const; 82e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah /* setVisualParam */ 83e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah bool setVisualParams(const MetaData_t& data); 8429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 8536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahprivate: 8636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* Perform transformation calculations */ 8736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void doTransform(); 8836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah void doDownscale(); 8936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah /* get orient / user_data[0] */ 9036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah int getOrient() const; 9129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* overlay get */ 9229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed bool get(); 93f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed /* returns flags from mdp structure */ 9429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int getFlags() const; 9529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set flags to mdp structure */ 9629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setFlags(int f); 9729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set z order */ 9829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setZ(utils::eZorder z); 9929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set isFg flag */ 10029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setIsFg(utils::eIsFg isFg); 10118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed /* return a copy of src whf*/ 10229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::Whf getSrcWhf() const; 10318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed /* set plane alpha */ 10418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed void setPlaneAlpha(int planeAlpha); 10518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed /* set blending method */ 10618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed void setBlending(overlay::utils::eBlending blending); 10718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed 10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set src whf */ 10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setSrcWhf(const utils::Whf& whf); 11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set src/dst rect dim */ 11129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setSrcRectDim(const utils::Dim d); 11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setDstRectDim(const utils::Dim d); 11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* returns user_data[0]*/ 11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int getUserData() const; 11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* sets user_data[0] */ 11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setUserData(int v); 11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* return true if current overlay is different 118f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * than last known good overlay */ 11929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed bool ovChanged() const; 12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* save mOVInfo to be last known good ov*/ 12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void save(); 12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* restore last known good ov to be the current */ 12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void restore(); 12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 125f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed utils::eTransform mOrientation; //Holds requested orientation 12629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* last good known ov info */ 12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mdp_overlay mLkgo; 12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* Actual overlay mdp structure */ 12929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mdp_overlay mOVInfo; 13029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* FD for the mdp fbnum */ 13129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OvFD mFd; 13236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah int mDownscale; 133e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#ifdef USES_POST_PROCESSING 134e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah /* PP Compute Params */ 135e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah struct compute_params mParams; 136e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah /* indicate if PP params have been changed */ 137e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah bool mPPChanged; 138e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#endif 13929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 14029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 14129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 14229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* MDP 3D related ctrl */ 14329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass MdpCtrl3D { 14429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic: 14529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* ctor reset data */ 14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed MdpCtrl3D(); 14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* calls MSMFB_OVERLAY_3D */ 14829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed bool close(); 14929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set w/h. format is ignored*/ 15029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setWh(const utils::Whf& whf); 15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set is_3d calls MSMFB_OVERLAY_3D */ 15229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed bool useVirtualFB(); 15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set fd to be used in ioctl */ 15429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void setFd(int fd); 15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* dump */ 15629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void dump() const; 15729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedprivate: 15829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* reset */ 15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void reset(); 16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* actual MSM 3D info */ 16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed msmfb_overlay_3d m3DOVInfo; 16229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* FD for the mdp 3D */ 16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OvFD mFd; 16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* MDP data */ 16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass MdpData { 16829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic: 16929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* ctor reset data */ 17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed explicit MdpData(); 17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* dtor close*/ 17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ~MdpData(); 173f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed /* init FD */ 174f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed bool init(uint32_t fbnum); 17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* memset0 the underlying mdp object */ 17629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void reset(); 17729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* close fd, and reset */ 17829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed bool close(); 17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* set id of mdp data */ 180f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed void setPipeId(int id); 18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* return ses id of data */ 182f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed int getPipeId() const; 18329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* get underlying fd*/ 18429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int getFd() const; 18529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* get memory_id */ 186f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed int getSrcMemoryId() const; 18729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* calls wrapper play */ 188f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed bool play(int fd, uint32_t offset); 18929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* dump state of the object */ 19029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed void dump() const; 191f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah /* Return the dump in the specified buffer */ 192f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah void getDump(char *buf, size_t len); 193f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah 19429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedprivate: 19529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 19629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* actual overlay mdp data */ 19729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed msmfb_overlay_data mOvData; 19829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* fd to mdp fbnum */ 19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OvFD mFd; 20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 20129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 20229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//--------------Inlines--------------------------------- 20329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 20429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed///// MdpCtrl ////// 20529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 206f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline MdpCtrl::MdpCtrl() { 20729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed reset(); 20829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 20929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 21029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpCtrl::~MdpCtrl() { 21129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed close(); 21229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 21329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 21429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getOrient() const { 21529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return getUserData(); 21629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 21729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 218f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline int MdpCtrl::getPipeId() const { 21929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return mOVInfo.id; 22029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 22129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 22229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getFd() const { 22329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return mFd.getFD(); 22429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 22529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 22629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getFlags() const { 22729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return mOVInfo.flags; 22829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 22929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 23029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setFlags(int f) { 23129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.flags = f; 23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 23329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setZ(overlay::utils::eZorder z) { 23529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.z_order = z; 23629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 23729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) { 23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.is_fg = isFg; 24029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 24129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 24236963690317abceae79621f14ba41ff62b3ff489Saurabh Shahinline void MdpCtrl::setDownscale(int dscale) { 24336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah mDownscale = dscale; 24436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah} 24536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 24618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedinline void MdpCtrl::setPlaneAlpha(int planeAlpha) { 24718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed mOVInfo.alpha = planeAlpha; 24818bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed} 24918bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed 25018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedinline void MdpCtrl::setBlending(overlay::utils::eBlending blending) { 251ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed#ifndef MDSS_TARGET 25218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed switch((int) blending) { 25318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed case utils::OVERLAY_BLENDING_OPAQUE: 25418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed mOVInfo.blend_op = BLEND_OP_OPAQUE; 25518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed break; 25618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed case utils::OVERLAY_BLENDING_PREMULT: 25718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed mOVInfo.blend_op = BLEND_OP_PREMULTIPLIED; 25818bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed break; 25918bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed case utils::OVERLAY_BLENDING_COVERAGE: 26018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed default: 26118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed mOVInfo.blend_op = BLEND_OP_COVERAGE; 26218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed } 263ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed#endif 26418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed} 26518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed 26629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpCtrl::ovChanged() const { 267e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#ifdef USES_POST_PROCESSING 268e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah // Some pp params are stored as pointer address, 269e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah // so can't compare their content directly. 270e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah if (mPPChanged) { 271e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah return true; 272e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah } 273e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#endif 27429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed // 0 means same 27529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(0 == ::memcmp(&mOVInfo, &mLkgo, sizeof (mdp_overlay))) { 27629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 27729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 27829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 27929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 28029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 28129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::save() { 282f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed if(static_cast<ssize_t>(mOVInfo.id) == MSMFB_NEW_REQUEST) { 28329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("MdpCtrl current ov has id -1, will not save"); 28429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 28529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 28629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mLkgo = mOVInfo; 28729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 28829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 28929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::restore() { 290f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed if(static_cast<ssize_t>(mLkgo.id) == MSMFB_NEW_REQUEST) { 29129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("MdpCtrl Lkgo ov has id -1, will not restore"); 29229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 29329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 29429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo = mLkgo; 29529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 29629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 29729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline overlay::utils::Whf MdpCtrl::getSrcWhf() const { 298f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed return utils::Whf( mOVInfo.src.width, 299f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.src.height, 300f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.src.format); 30129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 30229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 30329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setSrcWhf(const overlay::utils::Whf& whf) { 30429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src.width = whf.w; 30529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src.height = whf.h; 30629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src.format = whf.format; 30729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 30829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 30929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline overlay::utils::Dim MdpCtrl::getSrcRectDim() const { 310f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed return utils::Dim( mOVInfo.src_rect.x, 311f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.src_rect.y, 312f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.src_rect.w, 313f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.src_rect.h); 31429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 31529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 31629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setSrcRectDim(const overlay::utils::Dim d) { 31729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src_rect.x = d.x; 31829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src_rect.y = d.y; 31929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src_rect.w = d.w; 32029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.src_rect.h = d.h; 32129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 32229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 32329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline overlay::utils::Dim MdpCtrl::getDstRectDim() const { 324f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed return utils::Dim( mOVInfo.dst_rect.x, 325f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.dst_rect.y, 326f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.dst_rect.w, 327f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOVInfo.dst_rect.h); 32829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 32929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 33029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setDstRectDim(const overlay::utils::Dim d) { 33129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.dst_rect.x = d.x; 33229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.dst_rect.y = d.y; 33329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.dst_rect.w = d.w; 33429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.dst_rect.h = d.h; 33529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 33629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 33729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getUserData() const { return mOVInfo.user_data[0]; } 33829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 33929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setUserData(int v) { mOVInfo.user_data[0] = v; } 34029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 34129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setRotationFlags() { 34229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed const int u = getUserData(); 3430dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah if (u & MDP_ROT_90) 34429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOVInfo.flags |= MDP_SOURCE_ROTATED_90; 34529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 34629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 34729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/////// MdpCtrl3D ////// 34829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 34929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpCtrl3D::MdpCtrl3D() { reset(); } 35029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpCtrl3D::close() { 35129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (m3DOVInfo.is_3d) { 35229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed m3DOVInfo.is_3d = 0; 35329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) { 35429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("MdpCtrl3D close failed set3D with 0"); 35529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 35629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 35729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 35829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed reset(); 35929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 36029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 36129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl3D::reset() { 36229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::memset0(m3DOVInfo); 36329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 36429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 36529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl3D::setFd(int fd) { 36629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mFd.copy(fd); 36729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(mFd.valid(), "MdpCtrl3D setFd, FD should be valid"); 36829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 36929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 37029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl3D::setWh(const utils::Whf& whf) { 37129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed // ignore fmt. Needed for useVirtualFB callflow 37229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed m3DOVInfo.width = whf.w; 37329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed m3DOVInfo.height = whf.h; 37429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 37529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 37629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpCtrl3D::useVirtualFB() { 37729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!m3DOVInfo.is_3d) { 37829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed m3DOVInfo.is_3d = 1; 37929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) { 38029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("MdpCtrl3D close failed set3D with 0"); 38129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 38229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 38329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 38429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 38529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 38629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 38729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/////// MdpData ////// 38829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 38929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpData::MdpData() { reset(); } 39029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 39129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpData::~MdpData() { close(); } 39229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 393f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline bool MdpData::init(uint32_t fbnum) { 394f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed // FD init 395f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){ 396f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ALOGE("Ctrl failed to init fbnum=%d", fbnum); 39729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 39829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 39929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 40029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 40129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 40229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpData::reset() { 40329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed overlay::utils::memset0(mOvData); 40429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOvData.data.memory_id = -1; 40529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 40629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 40729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpData::close() { 40829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed reset(); 4098e1ae95d9dd49199bba1d7343ac7ffb842ddd10bSaurabh Shah return mFd.close(); 41029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 41129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 412f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline int MdpData::getSrcMemoryId() const { return mOvData.data.memory_id; } 41329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 414f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline void MdpData::setPipeId(int id) { mOvData.id = id; } 41529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 416f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline int MdpData::getPipeId() const { return mOvData.id; } 41729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 41829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpData::getFd() const { return mFd.getFD(); } 41929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 420f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline bool MdpData::play(int fd, uint32_t offset) { 421f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOvData.data.memory_id = fd; 422f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed mOvData.data.offset = offset; 42329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!mdp_wrapper::play(mFd.getFD(), mOvData)){ 42429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("MdpData failed to play"); 425f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed dump(); 42629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 42729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 42829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 42929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 43029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 43129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} // overlay 43229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 43329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif // OVERLAY_MDP_H 434