blob: be0c8bda000e8d0a3c3ed88b37fdb66d625fde46 [file] [log] [blame]
Naseer Ahmed29a26812012-06-14 00:56:20 -07001/*
Raj kamal23f69b22012-11-17 00:20:55 +05302* Copyright (c) 2011,2013 The Linux Foundation. All rights reserved.
Naseer Ahmed29a26812012-06-14 00:56:20 -07003*
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.
Naseer Ahmed758bfc52012-11-28 17:02:08 -050013* * Neither the name of The Linux Foundation. nor the names of its
Naseer Ahmed29a26812012-06-14 00:56:20 -070014* 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
Naseer Ahmedf48aef62012-07-20 09:05:53 -070030#ifndef OVERlAY_ROTATOR_H
31#define OVERlAY_ROTATOR_H
Naseer Ahmed29a26812012-06-14 00:56:20 -070032
33#include <stdlib.h>
34
35#include "mdpWrapper.h"
36#include "overlayUtils.h"
37#include "overlayMem.h"
38
39namespace overlay {
Naseer Ahmedf48aef62012-07-20 09:05:53 -070040
Saurabh Shah23a813c2013-03-20 16:58:12 -070041/*
42 Manages the case where new rotator memory needs to be
43 allocated, before previous is freed, due to resolution change etc. If we make
44 rotator memory to be always max size, irrespctive of source resolution then
45 we don't need this RotMem wrapper. The inner class is sufficient.
46*/
47struct RotMem {
Saurabh Shah912c9482014-02-07 14:01:04 -080048 // Max rotator buffers
49 enum { ROT_NUM_BUFS = 2 };
50 RotMem();
51 ~RotMem();
Saurabh Shah23a813c2013-03-20 16:58:12 -070052 bool close();
Saurabh Shah912c9482014-02-07 14:01:04 -080053 bool valid() { return mem.valid(); }
54 uint32_t size() const { return mem.bufSz(); }
55 void setReleaseFd(const int& fence);
56
57 // rotator data info dst offset
58 uint32_t mRotOffset[ROT_NUM_BUFS];
59 int mRelFence[ROT_NUM_BUFS];
60 // current slot being used
61 uint32_t mCurrIndex;
62 OvMem mem;
Saurabh Shah23a813c2013-03-20 16:58:12 -070063};
64
Naseer Ahmed758bfc52012-11-28 17:02:08 -050065class Rotator
Naseer Ahmedf48aef62012-07-20 09:05:53 -070066{
67public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -050068 enum { TYPE_MDP, TYPE_MDSS };
Naseer Ahmedf48aef62012-07-20 09:05:53 -070069 virtual ~Rotator();
Naseer Ahmed758bfc52012-11-28 17:02:08 -050070 virtual void setSource(const utils::Whf& wfh) = 0;
Sushil Chauhan80fc1f92013-04-23 17:30:05 -070071 virtual void setCrop(const utils::Dim& crop) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050072 virtual void setFlags(const utils::eMdpFlags& flags) = 0;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080073 virtual void setTransform(const utils::eTransform& rot) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050074 virtual bool commit() = 0;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080075 virtual void setDownscale(int ds) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050076 virtual int getDstMemId() const = 0;
77 virtual uint32_t getDstOffset() const = 0;
Raj kamal23f69b22012-11-17 00:20:55 +053078 virtual uint32_t getDstFormat() const = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050079 virtual uint32_t getSessId() const = 0;
80 virtual bool queueBuffer(int fd, uint32_t offset) = 0;
81 virtual void dump() const = 0;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -080082 virtual void getDump(char *buf, size_t len) const = 0;
Saurabh Shah23a813c2013-03-20 16:58:12 -070083 void setReleaseFd(const int& fence) { mMem.setReleaseFd(fence); }
Naseer Ahmed758bfc52012-11-28 17:02:08 -050084 static Rotator *getRotator();
Naseer Ahmed29a26812012-06-14 00:56:20 -070085
Naseer Ahmed758bfc52012-11-28 17:02:08 -050086protected:
Saurabh Shah23a813c2013-03-20 16:58:12 -070087 /* Rotator memory manager */
88 RotMem mMem;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050089 explicit Rotator() {}
Saurabh Shahfc3652f2013-02-15 13:15:45 -080090 static uint32_t calcOutputBufSize(const utils::Whf& destWhf);
Naseer Ahmed758bfc52012-11-28 17:02:08 -050091
92private:
93 /*Returns rotator h/w type */
94 static int getRotatorHwType();
Saurabh Shah23a813c2013-03-20 16:58:12 -070095 friend class RotMgr;
Naseer Ahmedf48aef62012-07-20 09:05:53 -070096};
Naseer Ahmed29a26812012-06-14 00:56:20 -070097
98/*
Naseer Ahmedf48aef62012-07-20 09:05:53 -070099* MDP rot holds MDP's rotation related structures.
100*
Naseer Ahmed29a26812012-06-14 00:56:20 -0700101* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500102class MdpRot : public Rotator {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700103public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500104 virtual ~MdpRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500105 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700106 virtual void setCrop(const utils::Dim& crop);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700107 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800108 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500109 virtual bool commit();
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800110 virtual void setDownscale(int ds);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500111 virtual int getDstMemId() const;
112 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530113 virtual uint32_t getDstFormat() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500114 virtual uint32_t getSessId() const;
115 virtual bool queueBuffer(int fd, uint32_t offset);
116 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800117 virtual void getDump(char *buf, size_t len) const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700118
Naseer Ahmed29a26812012-06-14 00:56:20 -0700119private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500120 explicit MdpRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800121 bool init();
122 bool close();
123 void setRotations(uint32_t r);
124 bool enabled () const;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700125 /* remap rot buffers */
126 bool remap(uint32_t numbufs);
127 bool open_i(uint32_t numbufs, uint32_t bufsz);
128 /* Deferred transform calculations */
129 void doTransform();
130 /* reset underlying data, basically memset 0 */
131 void reset();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700132 /* return true if current rotator config is different
133 * than last known config */
134 bool rotConfChanged() const;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700135 /* save mRotImgInfo to be last known good config*/
136 void save();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800137 /* Calculates the rotator's o/p buffer size post the transform calcs and
138 * knowing the o/p format depending on whether fastYuv is enabled or not */
139 uint32_t calcOutputBufSize();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700140
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700141 /* rot info*/
142 msm_rotator_img_info mRotImgInfo;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700143 /* Last saved rot info*/
144 msm_rotator_img_info mLSRotImgInfo;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700145 /* rot data */
146 msm_rotator_data_info mRotDataInfo;
147 /* Orientation */
148 utils::eTransform mOrientation;
149 /* rotator fd */
150 OvFD mFd;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500151
152 friend Rotator* Rotator::getRotator();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700153};
154
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700155/*
156+* MDSS Rot holds MDSS's rotation related structures.
157+*
158+* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500159class MdssRot : public Rotator {
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700160public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500161 virtual ~MdssRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500162 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700163 virtual void setCrop(const utils::Dim& crop);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700164 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800165 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500166 virtual bool commit();
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800167 virtual void setDownscale(int ds);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500168 virtual int getDstMemId() const;
169 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530170 virtual uint32_t getDstFormat() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500171 virtual uint32_t getSessId() const;
172 virtual bool queueBuffer(int fd, uint32_t offset);
173 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800174 virtual void getDump(char *buf, size_t len) const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700175
176private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500177 explicit MdssRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800178 bool init();
179 bool close();
180 void setRotations(uint32_t r);
181 bool enabled () const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700182 /* remap rot buffers */
183 bool remap(uint32_t numbufs);
184 bool open_i(uint32_t numbufs, uint32_t bufsz);
185 /* Deferred transform calculations */
186 void doTransform();
187 /* reset underlying data, basically memset 0 */
188 void reset();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800189 /* Calculates the rotator's o/p buffer size post the transform calcs and
190 * knowing the o/p format depending on whether fastYuv is enabled or not */
191 uint32_t calcOutputBufSize();
Sushil Chauhanbab187a2013-01-30 17:44:15 -0800192 // Calculate the compressed o/p buffer size for BWC
Sushil Chauhan466766f2013-07-31 11:21:07 -0700193 uint32_t calcCompressedBufSize(const utils::Whf& destWhf);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700194
195 /* MdssRot info structure */
196 mdp_overlay mRotInfo;
197 /* MdssRot data structure */
198 msmfb_overlay_data mRotData;
199 /* Orientation */
200 utils::eTransform mOrientation;
201 /* rotator fd */
202 OvFD mFd;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700203 /* Enable/Disable Mdss Rot*/
204 bool mEnabled;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500205
206 friend Rotator* Rotator::getRotator();
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700207};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700208
Saurabh Shahacf10202013-02-26 10:15:15 -0800209// Holder of rotator objects. Manages lifetimes
210class RotMgr {
211public:
212 //Maximum sessions based on VG pipes, since rotator is used only for videos.
213 //Even though we can have 4 mixer stages, that much may be unnecessary.
214 enum { MAX_ROT_SESS = 3 };
Saurabh Shah7a606842013-12-11 14:36:04 -0800215
Saurabh Shahacf10202013-02-26 10:15:15 -0800216 ~RotMgr();
217 void configBegin();
218 void configDone();
219 overlay::Rotator *getNext();
220 void clear(); //Removes all instances
Saurabh Shah7a606842013-12-11 14:36:04 -0800221 //Resets the usage of top count objects, making them available for reuse
222 void markUnusedTop(const uint32_t& count) { mUseCount -= count; }
Saurabh Shahacf10202013-02-26 10:15:15 -0800223 /* Returns rot dump.
224 * Expects a NULL terminated buffer of big enough size.
225 */
226 void getDump(char *buf, size_t len);
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700227 int getRotDevFd();
Saurabh Shah2b6e5192013-10-22 17:22:04 -0700228 int getNumActiveSessions() { return mUseCount; }
Saurabh Shah7a606842013-12-11 14:36:04 -0800229
230 static RotMgr *getInstance();
231
Saurabh Shahacf10202013-02-26 10:15:15 -0800232private:
Saurabh Shah7a606842013-12-11 14:36:04 -0800233 RotMgr();
234 static RotMgr *sRotMgr;
235
Saurabh Shahacf10202013-02-26 10:15:15 -0800236 overlay::Rotator *mRot[MAX_ROT_SESS];
Saurabh Shah7a606842013-12-11 14:36:04 -0800237 uint32_t mUseCount;
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700238 int mRotDevFd;
Saurabh Shahacf10202013-02-26 10:15:15 -0800239};
240
241
Naseer Ahmed29a26812012-06-14 00:56:20 -0700242} // overlay
243
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700244#endif // OVERlAY_ROTATOR_H