• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *    * Redistributions of source code must retain the above copyright
8 *      notice, this list of conditions and the following disclaimer.
9 *    * Redistributions in binary form must reproduce the above
10 *      copyright notice, this list of conditions and the following
11 *      disclaimer in the documentation and/or other materials provided
12 *      with the distribution.
13 *    * Neither the name of The Linux Foundation nor the names of its
14 *      contributors may be used to endorse or promote products derived
15 *      from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 
30 #ifndef OVERLAY_CTRLDATA_H
31 #define OVERLAY_CTRLDATA_H
32 
33 #include "overlayUtils.h"
34 #include "overlayMdp.h"
35 #include "gralloc_priv.h" // INTERLACE_MASK
36 
37 namespace ovutils = overlay::utils;
38 
39 namespace overlay {
40 
41 /*
42 * Sequence to use:
43 * init
44 * start
45 * setXXX
46 * close
47 * */
48 class Ctrl : utils::NoCopy {
49 public:
50 
51     /* ctor */
52     explicit Ctrl();
53     /* dtor close */
54     ~Ctrl();
55     /* init fd etc*/
56     bool init(uint32_t fbnum);
57     /* close underlying mdp */
58     bool close();
59 
60     /* set source using whf, orient and wait flag */
61     void setSource(const utils::PipeArgs& args);
62     /* set crop info and pass it down to mdp */
63     void setCrop(const utils::Dim& d);
64     /* set orientation */
65     void setTransform(const utils::eTransform& p);
66     /* set mdp position using dim */
67     void setPosition(const utils::Dim& dim);
68     /* set mdp visual params using metadata */
69     bool setVisualParams(const MetaData_t &metadata);
70     /* mdp set overlay/commit changes */
71     bool commit();
72 
73     /* ctrl id */
74     int  getPipeId() const;
75     /* ctrl fd */
76     int  getFd() const;
77     /* retrieve crop data */
78     utils::Dim getCrop() const;
79     utils::Dim getPosition() const;
80     /* Set downscale */
81     void setDownscale(int dscale_factor);
82     /* Update the src format based on rotator's dest */
83     void updateSrcFormat(const uint32_t& rotDstFormat);
84     /* dump the state of the object */
85     void dump() const;
86     /* Return the dump in the specified buffer */
87     void getDump(char *buf, size_t len);
88 
89 private:
90     // mdp ctrl struct(info e.g.)
91     MdpCtrl mMdp;
92 };
93 
94 
95 class Data : utils::NoCopy {
96 public:
97     /* init, reset */
98     explicit Data();
99     /* calls close */
100     ~Data();
101     /* init fd etc */
102     bool init(uint32_t fbnum);
103     /* calls underlying mdp close */
104     bool close();
105     /* set overlay pipe id in the mdp struct */
106     void setPipeId(int id);
107     /* get overlay id in the mdp struct */
108     int getPipeId() const;
109     /* queue buffer to the overlay */
110     bool queueBuffer(int fd, uint32_t offset);
111     /* sump the state of the obj */
112     void dump() const;
113     /* Return the dump in the specified buffer */
114     void getDump(char *buf, size_t len);
115 
116 private:
117     // mdp data struct
118     MdpData mMdp;
119 };
120 
121 /* This class just creates a Ctrl Data pair to be used by a pipe.
122  * Although this was legacy design, this separation still makes sense, since we
123  * need to use the Ctrl channel in hwc_prepare (i.e config stage) and Data
124  * channel in hwc_set (i.e draw stage)
125  */
126 struct CtrlData {
127     Ctrl ctrl;
128     Data data;
129 };
130 
131 //-------------Inlines-------------------------------
132 
Ctrl()133 inline Ctrl::Ctrl() {
134     mMdp.reset();
135 }
136 
~Ctrl()137 inline Ctrl::~Ctrl() {
138     close();
139 }
140 
close()141 inline bool Ctrl::close() {
142     if(!mMdp.close())
143         return false;
144     return true;
145 }
146 
init(uint32_t fbnum)147 inline bool Ctrl::init(uint32_t fbnum) {
148     // MDP/FD init
149     if(!mMdp.init(fbnum)) {
150         ALOGE("Ctrl failed to init fbnum=%d", fbnum);
151         return false;
152     }
153     return true;
154 }
155 
setSource(const utils::PipeArgs & args)156 inline void Ctrl::setSource(const utils::PipeArgs& args)
157 {
158     mMdp.setSource(args);
159 }
160 
setPosition(const utils::Dim & dim)161 inline void Ctrl::setPosition(const utils::Dim& dim)
162 {
163     mMdp.setPosition(dim);
164 }
165 
setTransform(const utils::eTransform & orient)166 inline void Ctrl::setTransform(const utils::eTransform& orient)
167 {
168     mMdp.setTransform(orient);
169 }
170 
setCrop(const utils::Dim & d)171 inline void Ctrl::setCrop(const utils::Dim& d)
172 {
173     mMdp.setCrop(d);
174 }
175 
setVisualParams(const MetaData_t & metadata)176 inline bool Ctrl::setVisualParams(const MetaData_t &metadata)
177 {
178     if (!mMdp.setVisualParams(metadata)) {
179         ALOGE("Ctrl setVisualParams failed in MDP setVisualParams");
180         return false;
181     }
182     return true;
183 }
184 
dump()185 inline void Ctrl::dump() const {
186     ALOGE("== Dump Ctrl start ==");
187     mMdp.dump();
188     ALOGE("== Dump Ctrl end ==");
189 }
190 
commit()191 inline bool Ctrl::commit() {
192     if(!mMdp.set()) {
193         ALOGE("Ctrl commit failed set overlay");
194         return false;
195     }
196     return true;
197 }
198 
getPipeId()199 inline int Ctrl::getPipeId() const {
200     return mMdp.getPipeId();
201 }
202 
getFd()203 inline int Ctrl::getFd() const {
204     return mMdp.getFd();
205 }
206 
updateSrcFormat(const uint32_t & rotDstFmt)207 inline void Ctrl::updateSrcFormat(const uint32_t& rotDstFmt) {
208     mMdp.updateSrcFormat(rotDstFmt);
209 }
210 
getCrop()211 inline utils::Dim Ctrl::getCrop() const {
212     return mMdp.getSrcRectDim();
213 }
214 
getPosition()215 inline utils::Dim Ctrl::getPosition() const {
216     return mMdp.getDstRectDim();
217 }
218 
setDownscale(int dscale_factor)219 inline void Ctrl::setDownscale(int dscale_factor) {
220     mMdp.setDownscale(dscale_factor);
221 }
222 
getDump(char * buf,size_t len)223 inline void Ctrl::getDump(char *buf, size_t len) {
224     mMdp.getDump(buf, len);
225 }
226 
Data()227 inline Data::Data() {
228     mMdp.reset();
229 }
230 
~Data()231 inline Data::~Data() { close(); }
232 
setPipeId(int id)233 inline void Data::setPipeId(int id) { mMdp.setPipeId(id); }
234 
getPipeId()235 inline int Data::getPipeId() const { return mMdp.getPipeId(); }
236 
init(uint32_t fbnum)237 inline bool Data::init(uint32_t fbnum) {
238     if(!mMdp.init(fbnum)) {
239         ALOGE("Data cannot init mdp");
240         return false;
241     }
242     return true;
243 }
244 
close()245 inline bool Data::close() {
246     if(!mMdp.close()) {
247         ALOGE("Data close failed");
248         return false;
249     }
250     return true;
251 }
252 
queueBuffer(int fd,uint32_t offset)253 inline bool Data::queueBuffer(int fd, uint32_t offset) {
254     return mMdp.play(fd, offset);
255 }
256 
dump()257 inline void Data::dump() const {
258     ALOGE("== Dump Data MDP start ==");
259     mMdp.dump();
260     ALOGE("== Dump Data MDP end ==");
261 }
262 
getDump(char * buf,size_t len)263 inline void Data::getDump(char *buf, size_t len) {
264     mMdp.getDump(buf, len);
265 }
266 
267 } // overlay
268 
269 #endif
270