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
37namespace ovutils = overlay::utils;
38
39namespace overlay {
40
41/*
42* Sequence to use:
43* init
44* start
45* setXXX
46* close
47* */
48class Ctrl : utils::NoCopy {
49public:
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
89private:
90    // mdp ctrl struct(info e.g.)
91    MdpCtrl mMdp;
92};
93
94
95class Data : utils::NoCopy {
96public:
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
116private:
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 */
126struct CtrlData {
127    Ctrl ctrl;
128    Data data;
129};
130
131//-------------Inlines-------------------------------
132
133inline Ctrl::Ctrl() {
134    mMdp.reset();
135}
136
137inline Ctrl::~Ctrl() {
138    close();
139}
140
141inline bool Ctrl::close() {
142    if(!mMdp.close())
143        return false;
144    return true;
145}
146
147inline 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
156inline void Ctrl::setSource(const utils::PipeArgs& args)
157{
158    mMdp.setSource(args);
159}
160
161inline void Ctrl::setPosition(const utils::Dim& dim)
162{
163    mMdp.setPosition(dim);
164}
165
166inline void Ctrl::setTransform(const utils::eTransform& orient)
167{
168    mMdp.setTransform(orient);
169}
170
171inline void Ctrl::setCrop(const utils::Dim& d)
172{
173    mMdp.setCrop(d);
174}
175
176inline 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
185inline void Ctrl::dump() const {
186    ALOGE("== Dump Ctrl start ==");
187    mMdp.dump();
188    ALOGE("== Dump Ctrl end ==");
189}
190
191inline bool Ctrl::commit() {
192    if(!mMdp.set()) {
193        ALOGE("Ctrl commit failed set overlay");
194        return false;
195    }
196    return true;
197}
198
199inline int Ctrl::getPipeId() const {
200    return mMdp.getPipeId();
201}
202
203inline int Ctrl::getFd() const {
204    return mMdp.getFd();
205}
206
207inline void Ctrl::updateSrcFormat(const uint32_t& rotDstFmt) {
208    mMdp.updateSrcFormat(rotDstFmt);
209}
210
211inline utils::Dim Ctrl::getCrop() const {
212    return mMdp.getSrcRectDim();
213}
214
215inline utils::Dim Ctrl::getPosition() const {
216    return mMdp.getDstRectDim();
217}
218
219inline void Ctrl::setDownscale(int dscale_factor) {
220    mMdp.setDownscale(dscale_factor);
221}
222
223inline void Ctrl::getDump(char *buf, size_t len) {
224    mMdp.getDump(buf, len);
225}
226
227inline Data::Data() {
228    mMdp.reset();
229}
230
231inline Data::~Data() { close(); }
232
233inline void Data::setPipeId(int id) { mMdp.setPipeId(id); }
234
235inline int Data::getPipeId() const { return mMdp.getPipeId(); }
236
237inline 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
245inline bool Data::close() {
246    if(!mMdp.close()) {
247        ALOGE("Data close failed");
248        return false;
249    }
250    return true;
251}
252
253inline bool Data::queueBuffer(int fd, uint32_t offset) {
254    return mMdp.play(fd, offset);
255}
256
257inline void Data::dump() const {
258    ALOGE("== Dump Data MDP start ==");
259    mMdp.dump();
260    ALOGE("== Dump Data MDP end ==");
261}
262
263inline void Data::getDump(char *buf, size_t len) {
264    mMdp.getDump(buf, len);
265}
266
267} // overlay
268
269#endif
270