overlayMdp.h revision a653efede03423aa840da24634f1ec6f20796f1e
1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Copyright (C) 2008 The Android Open Source Project
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Licensed under the Apache License, Version 2.0 (the "License");
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* you may not use this file except in compliance with the License.
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* You may obtain a copy of the License at
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      http://www.apache.org/licenses/LICENSE-2.0
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Unless required by applicable law or agreed to in writing, software
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* distributed under the License is distributed on an "AS IS" BASIS,
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* See the License for the specific language governing permissions and
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* limitations under the License.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*/
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef OVERLAY_MDP_H
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define OVERLAY_MDP_H
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <linux/msm_mdp.h>
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "overlayUtils.h"
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "mdpWrapper.h"
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "qdMetaData.h"
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef USES_POST_PROCESSING
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "lib-postproc.h"
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace overlay{
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Mdp Ctrl holds corresponding fd and MDP related struct.
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* It is simple wrapper to MDP services
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* */
36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass MdpCtrl {
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* ctor reset */
39a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    explicit MdpCtrl(const int& dpy);
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dtor close */
41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ~MdpCtrl();
42a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* init underlying device using fbnum for dpy */
43a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool init(const int& dpy);
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* unset overlay, reset and close fd */
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool close();
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* reset and set ov id to -1 / MSMFB_NEW_REQUEST */
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void reset();
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* calls overlay set
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * Set would always consult last good known ov instance.
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * Only if it is different, set would actually exectue ioctl.
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * On a sucess ioctl. last good known ov instance is updated */
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool set();
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Sets the source total width, height, format */
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setSource(const utils::PipeArgs& pargs);
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /*
56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * Sets ROI, the unpadded region, for source buffer.
57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * Dim - ROI dimensions.
58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     */
59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setCrop(const utils::Dim& d);
60a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* set color for mdp pipe */
61a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    void setColor(const uint32_t color);
62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setTransform(const utils::eTransform& orient);
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* given a dim and w/h, set overlay dim */
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setPosition(const utils::Dim& dim);
65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* using user_data, sets/unsets roationvalue in mdp flags */
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setRotationFlags();
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Performs downscale calculations */
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setDownscale(int dscale_factor);
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Update the src format with rotator's dest*/
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void updateSrcFormat(const uint32_t& rotDstFormat);
71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dump state of the object */
72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump() const;
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Return the dump in the specified buffer */
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void getDump(char *buf, size_t len);
75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns session id */
76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getPipeId() const;
77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns the fd associated to ctrl*/
78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getFd() const;
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns a copy ro dst rect dim */
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    utils::Dim getDstRectDim() const;
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns a copy to src rect dim */
82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    utils::Dim getSrcRectDim() const;
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* setVisualParam */
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool setVisualParams(const MetaData_t& data);
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
86a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    static bool validateAndSet(MdpCtrl* mdpCtrlArray[], const int& count,
87a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            const int& fbFd);
88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Perform transformation calculations */
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void doTransform();
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void doDownscale();
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* get orient / user_data[0] */
93a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int getOrient() const;
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns flags from mdp structure */
95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getFlags() const;
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set flags to mdp structure */
97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setFlags(int f);
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set z order */
99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setZ(utils::eZorder z);
100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set isFg flag */
101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setIsFg(utils::eIsFg isFg);
102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* return a copy of src whf*/
103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    utils::Whf getSrcWhf() const;
104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set plane alpha */
105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setPlaneAlpha(int planeAlpha);
106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set blending method */
107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setBlending(overlay::utils::eBlending blending);
108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set src whf */
110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setSrcWhf(const utils::Whf& whf);
111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set src/dst rect dim */
112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setSrcRectDim(const utils::Dim d);
113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setDstRectDim(const utils::Dim d);
114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns user_data[0]*/
115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getUserData() const;
116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* sets user_data[0] */
117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setUserData(int v);
118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    utils::eTransform mOrientation; //Holds requested orientation
120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Actual overlay mdp structure */
121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mdp_overlay   mOVInfo;
122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* FD for the mdp fbnum */
123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OvFD          mFd;
124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mDownscale;
125a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int mDpy;
126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef USES_POST_PROCESSING
128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* PP Compute Params */
129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct compute_params mParams;
130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* MDP 3D related ctrl */
135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass MdpCtrl3D {
136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* ctor reset data */
138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MdpCtrl3D();
139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* calls MSMFB_OVERLAY_3D */
140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool close();
141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set w/h. format is ignored*/
142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setWh(const utils::Whf& whf);
143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set is_3d calls MSMFB_OVERLAY_3D */
144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool useVirtualFB();
145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set fd to be used in ioctl */
146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setFd(int fd);
147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dump */
148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump() const;
149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* reset */
151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void reset();
152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* actual MSM 3D info */
153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    msmfb_overlay_3d m3DOVInfo;
154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* FD for the mdp 3D */
155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OvFD mFd;
156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* MDP data */
159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass MdpData {
160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* ctor reset data */
162a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    explicit MdpData(const int& dpy);
163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dtor close*/
164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ~MdpData();
165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* init FD */
166a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool init(const int& dpy);
167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* memset0 the underlying mdp object */
168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void reset();
169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* close fd, and reset */
170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool close();
171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* set id of mdp data */
172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setPipeId(int id);
173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* return ses id of data */
174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getPipeId() const;
175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* get underlying fd*/
176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getFd() const;
177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* get memory_id */
178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getSrcMemoryId() const;
179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* calls wrapper play */
180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool play(int fd, uint32_t offset);
181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dump state of the object */
182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump() const;
183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Return the dump in the specified buffer */
184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void getDump(char *buf, size_t len);
185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* actual overlay mdp data */
189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    msmfb_overlay_data mOvData;
190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* fd to mdp fbnum */
191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OvFD mFd;
192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//--------------Inlines---------------------------------
195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/////   MdpCtrl  //////
197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
198a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsoninline MdpCtrl::MdpCtrl(const int& dpy) {
199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    reset();
200a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    init(dpy);
201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline MdpCtrl::~MdpCtrl() {
204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    close();
205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpCtrl::getOrient() const {
208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return getUserData();
209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpCtrl::getPipeId() const {
212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return mOVInfo.id;
213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpCtrl::getFd() const {
216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return mFd.getFD();
217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpCtrl::getFlags() const {
220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return mOVInfo.flags;
221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setFlags(int f) {
224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.flags = f;
225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setZ(overlay::utils::eZorder z) {
228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.z_order = z;
229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) {
232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.is_fg = isFg;
233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setDownscale(int dscale) {
236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mDownscale = dscale;
237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setPlaneAlpha(int planeAlpha) {
240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.alpha = planeAlpha;
241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setBlending(overlay::utils::eBlending blending) {
244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch((int) blending) {
245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    case utils::OVERLAY_BLENDING_OPAQUE:
246ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mOVInfo.blend_op = BLEND_OP_OPAQUE;
247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        break;
248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    case utils::OVERLAY_BLENDING_PREMULT:
249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mOVInfo.blend_op = BLEND_OP_PREMULTIPLIED;
250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        break;
251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    case utils::OVERLAY_BLENDING_COVERAGE:
252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    default:
253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mOVInfo.blend_op = BLEND_OP_COVERAGE;
254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline overlay::utils::Whf MdpCtrl::getSrcWhf() const {
258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return utils::Whf(  mOVInfo.src.width,
259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.src.height,
260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.src.format);
261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setSrcWhf(const overlay::utils::Whf& whf) {
264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src.width  = whf.w;
265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src.height = whf.h;
266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src.format = whf.format;
267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline overlay::utils::Dim MdpCtrl::getSrcRectDim() const {
270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return utils::Dim(  mOVInfo.src_rect.x,
271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.src_rect.y,
272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.src_rect.w,
273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.src_rect.h);
274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setSrcRectDim(const overlay::utils::Dim d) {
277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src_rect.x = d.x;
278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src_rect.y = d.y;
279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src_rect.w = d.w;
280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.src_rect.h = d.h;
281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline overlay::utils::Dim MdpCtrl::getDstRectDim() const {
284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return utils::Dim(  mOVInfo.dst_rect.x,
285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.dst_rect.y,
286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.dst_rect.w,
287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                        mOVInfo.dst_rect.h);
288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setDstRectDim(const overlay::utils::Dim d) {
291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.dst_rect.x = d.x;
292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.dst_rect.y = d.y;
293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.dst_rect.w = d.w;
294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOVInfo.dst_rect.h = d.h;
295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpCtrl::getUserData() const { return mOVInfo.user_data[0]; }
298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setUserData(int v) { mOVInfo.user_data[0] = v; }
300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl::setRotationFlags() {
302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const int u = getUserData();
303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (u & MDP_ROT_90)
304ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson///////    MdpCtrl3D //////
308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline MdpCtrl3D::MdpCtrl3D() { reset(); }
310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool MdpCtrl3D::close() {
311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (m3DOVInfo.is_3d) {
312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        m3DOVInfo.is_3d = 0;
313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("MdpCtrl3D close failed set3D with 0");
315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return false;
316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    reset();
319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return true;
320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl3D::reset() {
322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    utils::memset0(m3DOVInfo);
323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl3D::setFd(int fd) {
326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mFd.copy(fd);
327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVASSERT(mFd.valid(), "MdpCtrl3D setFd, FD should be valid");
328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpCtrl3D::setWh(const utils::Whf& whf) {
331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // ignore fmt. Needed for useVirtualFB callflow
332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    m3DOVInfo.width = whf.w;
333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    m3DOVInfo.height = whf.h;
334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool MdpCtrl3D::useVirtualFB() {
337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(!m3DOVInfo.is_3d) {
338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        m3DOVInfo.is_3d = 1;
339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("MdpCtrl3D close failed set3D with 0");
341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return false;
342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return true;
345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson///////    MdpData   //////
348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
349a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsoninline MdpData::MdpData(const int& dpy) {
350a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    reset();
351a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    init(dpy);
352a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline MdpData::~MdpData() { close(); }
355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpData::reset() {
357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    overlay::utils::memset0(mOvData);
358ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOvData.data.memory_id = -1;
359ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool MdpData::close() {
362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    reset();
363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return mFd.close();
364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpData::getSrcMemoryId() const { return mOvData.data.memory_id; }
367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void MdpData::setPipeId(int id) { mOvData.id = id; }
369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpData::getPipeId() const { return mOvData.id; }
371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int MdpData::getFd() const { return mFd.getFD(); }
373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool MdpData::play(int fd, uint32_t offset) {
375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOvData.data.memory_id = fd;
376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mOvData.data.offset = offset;
377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(!mdp_wrapper::play(mFd.getFD(), mOvData)){
378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("MdpData failed to play");
379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dump();
380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return false;
381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return true;
383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // overlay
386ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif // OVERLAY_MDP_H
388