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