blob: 7d1b0b1ed3873fbdceff4cc75dd3b0cbecb52a25 [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"
Saurabh Shah74eff4d2014-03-28 16:33:13 -070038#include "sync/sync.h"
Naseer Ahmed29a26812012-06-14 00:56:20 -070039
40namespace overlay {
Naseer Ahmedf48aef62012-07-20 09:05:53 -070041
Saurabh Shah23a813c2013-03-20 16:58:12 -070042/*
43 Manages the case where new rotator memory needs to be
44 allocated, before previous is freed, due to resolution change etc. If we make
45 rotator memory to be always max size, irrespctive of source resolution then
46 we don't need this RotMem wrapper. The inner class is sufficient.
47*/
48struct RotMem {
Saurabh Shah912c9482014-02-07 14:01:04 -080049 // Max rotator buffers
50 enum { ROT_NUM_BUFS = 2 };
51 RotMem();
52 ~RotMem();
Saurabh Shah23a813c2013-03-20 16:58:12 -070053 bool close();
Saurabh Shah912c9482014-02-07 14:01:04 -080054 bool valid() { return mem.valid(); }
55 uint32_t size() const { return mem.bufSz(); }
56 void setReleaseFd(const int& fence);
57
58 // rotator data info dst offset
59 uint32_t mRotOffset[ROT_NUM_BUFS];
60 int mRelFence[ROT_NUM_BUFS];
61 // current slot being used
62 uint32_t mCurrIndex;
63 OvMem mem;
Saurabh Shah23a813c2013-03-20 16:58:12 -070064};
65
Naseer Ahmed758bfc52012-11-28 17:02:08 -050066class Rotator
Naseer Ahmedf48aef62012-07-20 09:05:53 -070067{
68public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -050069 enum { TYPE_MDP, TYPE_MDSS };
Naseer Ahmedf48aef62012-07-20 09:05:53 -070070 virtual ~Rotator();
Naseer Ahmed758bfc52012-11-28 17:02:08 -050071 virtual void setSource(const utils::Whf& wfh) = 0;
Sushil Chauhan80fc1f92013-04-23 17:30:05 -070072 virtual void setCrop(const utils::Dim& crop) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050073 virtual void setFlags(const utils::eMdpFlags& flags) = 0;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080074 virtual void setTransform(const utils::eTransform& rot) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050075 virtual bool commit() = 0;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080076 virtual void setDownscale(int ds) = 0;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -070077 //Mem id and offset should be retrieved only after rotator kickoff
Naseer Ahmed758bfc52012-11-28 17:02:08 -050078 virtual int getDstMemId() const = 0;
79 virtual uint32_t getDstOffset() const = 0;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -070080 //Destination width, height, format, position should be retrieved only after
81 //rotator configuration is committed via commit API
Raj kamal23f69b22012-11-17 00:20:55 +053082 virtual uint32_t getDstFormat() const = 0;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -070083 virtual utils::Whf getDstWhf() const = 0;
84 virtual utils::Dim getDstDimensions() const = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050085 virtual uint32_t getSessId() const = 0;
86 virtual bool queueBuffer(int fd, uint32_t offset) = 0;
87 virtual void dump() const = 0;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -080088 virtual void getDump(char *buf, size_t len) const = 0;
Saurabh Shah23a813c2013-03-20 16:58:12 -070089 void setReleaseFd(const int& fence) { mMem.setReleaseFd(fence); }
Naseer Ahmed758bfc52012-11-28 17:02:08 -050090 static Rotator *getRotator();
Saurabh Shahc46cf9d2014-07-02 15:22:34 -070091 /* Returns downscale by successfully applying constraints
92 * Returns 0 if target doesnt support rotator downscaling
93 * or if any of the constraints are not met
94 */
95 static int getDownscaleFactor(const int& srcW, const int& srcH,
96 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
97 const bool& isInterlaced);
Naseer Ahmed29a26812012-06-14 00:56:20 -070098
Naseer Ahmed758bfc52012-11-28 17:02:08 -050099protected:
Saurabh Shah23a813c2013-03-20 16:58:12 -0700100 /* Rotator memory manager */
101 RotMem mMem;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500102 explicit Rotator() {}
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800103 static uint32_t calcOutputBufSize(const utils::Whf& destWhf);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500104
105private:
106 /*Returns rotator h/w type */
107 static int getRotatorHwType();
Saurabh Shah23a813c2013-03-20 16:58:12 -0700108 friend class RotMgr;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700109};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700110
111/*
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700112* MDP rot holds MDP's rotation related structures.
113*
Naseer Ahmed29a26812012-06-14 00:56:20 -0700114* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500115class MdpRot : public Rotator {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700116public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500117 virtual ~MdpRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500118 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700119 virtual void setCrop(const utils::Dim& crop);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700120 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800121 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500122 virtual bool commit();
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800123 virtual void setDownscale(int ds);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500124 virtual int getDstMemId() const;
125 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530126 virtual uint32_t getDstFormat() const;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -0700127 virtual utils::Whf getDstWhf() const;
128 virtual utils::Dim getDstDimensions() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500129 virtual uint32_t getSessId() const;
130 virtual bool queueBuffer(int fd, uint32_t offset);
131 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800132 virtual void getDump(char *buf, size_t len) const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700133
Naseer Ahmed29a26812012-06-14 00:56:20 -0700134private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500135 explicit MdpRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800136 bool init();
137 bool close();
138 void setRotations(uint32_t r);
139 bool enabled () const;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700140 /* remap rot buffers */
141 bool remap(uint32_t numbufs);
142 bool open_i(uint32_t numbufs, uint32_t bufsz);
143 /* Deferred transform calculations */
144 void doTransform();
145 /* reset underlying data, basically memset 0 */
146 void reset();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700147 /* return true if current rotator config is different
148 * than last known config */
149 bool rotConfChanged() const;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700150 /* save mRotImgInfo to be last known good config*/
151 void save();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800152 /* Calculates the rotator's o/p buffer size post the transform calcs and
153 * knowing the o/p format depending on whether fastYuv is enabled or not */
154 uint32_t calcOutputBufSize();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700155
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700156 /* Applies downscale by taking areas
157 * Returns a log(downscale)
158 * Constraints applied:
159 * - downscale should be a power of 2
160 * - Max downscale is 1/8
161 */
162 static int getDownscaleFactor(const int& srcW, const int& srcH,
163 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
164 const bool& isInterlaced);
165
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700166 /* rot info*/
167 msm_rotator_img_info mRotImgInfo;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700168 /* Last saved rot info*/
169 msm_rotator_img_info mLSRotImgInfo;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700170 /* rot data */
171 msm_rotator_data_info mRotDataInfo;
172 /* Orientation */
173 utils::eTransform mOrientation;
174 /* rotator fd */
175 OvFD mFd;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500176
177 friend Rotator* Rotator::getRotator();
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700178 friend int Rotator::getDownscaleFactor(const int& srcW, const int& srcH,
179 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
180 const bool& isInterlaced);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700181};
182
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700183/*
184+* MDSS Rot holds MDSS's rotation related structures.
185+*
186+* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500187class MdssRot : public Rotator {
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700188public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500189 virtual ~MdssRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500190 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700191 virtual void setCrop(const utils::Dim& crop);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700192 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800193 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500194 virtual bool commit();
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800195 virtual void setDownscale(int ds);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500196 virtual int getDstMemId() const;
197 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530198 virtual uint32_t getDstFormat() const;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -0700199 virtual utils::Whf getDstWhf() const;
200 virtual utils::Dim getDstDimensions() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500201 virtual uint32_t getSessId() const;
202 virtual bool queueBuffer(int fd, uint32_t offset);
203 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800204 virtual void getDump(char *buf, size_t len) const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700205
206private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500207 explicit MdssRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800208 bool init();
209 bool close();
210 void setRotations(uint32_t r);
211 bool enabled () const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700212 /* remap rot buffers */
213 bool remap(uint32_t numbufs);
214 bool open_i(uint32_t numbufs, uint32_t bufsz);
215 /* Deferred transform calculations */
216 void doTransform();
217 /* reset underlying data, basically memset 0 */
218 void reset();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800219 /* Calculates the rotator's o/p buffer size post the transform calcs and
220 * knowing the o/p format depending on whether fastYuv is enabled or not */
221 uint32_t calcOutputBufSize();
Sushil Chauhanbab187a2013-01-30 17:44:15 -0800222 // Calculate the compressed o/p buffer size for BWC
Sushil Chauhan466766f2013-07-31 11:21:07 -0700223 uint32_t calcCompressedBufSize(const utils::Whf& destWhf);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700224
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700225 /* Caller's responsibility to swap srcW, srcH if there is a 90 transform
226 * Returns actual downscale (not a log value)
227 * Constraints applied:
228 * - downscale should be a power of 2
229 * - Max downscale is 1/32
230 * - Equal downscale is applied in both directions
231 * - {srcW, srcH} mod downscale = 0
232 * - Interlaced content is not supported
233 */
234 static int getDownscaleFactor(const int& srcW, const int& srcH,
235 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
236 const bool& isInterlaced);
237
238 static utils::Dim getFormatAdjustedCrop(const utils::Dim& crop,
239 const uint32_t& mdpFormat, const bool& isInterlaced);
240
241 static utils::Dim getDownscaleAdjustedCrop(const utils::Dim& crop,
242 const uint32_t& downscale);
243
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700244 /* MdssRot info structure */
245 mdp_overlay mRotInfo;
246 /* MdssRot data structure */
247 msmfb_overlay_data mRotData;
248 /* Orientation */
249 utils::eTransform mOrientation;
250 /* rotator fd */
251 OvFD mFd;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700252 /* Enable/Disable Mdss Rot*/
253 bool mEnabled;
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700254 int mDownscale;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500255
256 friend Rotator* Rotator::getRotator();
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700257 friend int Rotator::getDownscaleFactor(const int& srcW, const int& srcH,
258 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
259 const bool& isInterlaced);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700260};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700261
Saurabh Shahacf10202013-02-26 10:15:15 -0800262// Holder of rotator objects. Manages lifetimes
263class RotMgr {
264public:
Ramkumar Radhakrishnan9d20b392013-11-15 19:32:47 -0800265 //Virtually we can support as many rotator sessions as possible, However
266 // more number of rotator sessions leads to performance issues, so
267 // restricting the max rotator session to 4
Saurabh Shah54318572014-05-30 16:42:33 -0700268 enum { MAX_ROT_SESS = 4 };
Saurabh Shah7a606842013-12-11 14:36:04 -0800269
Saurabh Shahacf10202013-02-26 10:15:15 -0800270 ~RotMgr();
271 void configBegin();
272 void configDone();
273 overlay::Rotator *getNext();
274 void clear(); //Removes all instances
Saurabh Shah7a606842013-12-11 14:36:04 -0800275 //Resets the usage of top count objects, making them available for reuse
276 void markUnusedTop(const uint32_t& count) { mUseCount -= count; }
Saurabh Shahacf10202013-02-26 10:15:15 -0800277 /* Returns rot dump.
278 * Expects a NULL terminated buffer of big enough size.
279 */
280 void getDump(char *buf, size_t len);
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700281 int getRotDevFd();
Saurabh Shah2b6e5192013-10-22 17:22:04 -0700282 int getNumActiveSessions() { return mUseCount; }
Saurabh Shah7a606842013-12-11 14:36:04 -0800283
284 static RotMgr *getInstance();
285
Saurabh Shahacf10202013-02-26 10:15:15 -0800286private:
Saurabh Shah7a606842013-12-11 14:36:04 -0800287 RotMgr();
288 static RotMgr *sRotMgr;
289
Saurabh Shahacf10202013-02-26 10:15:15 -0800290 overlay::Rotator *mRot[MAX_ROT_SESS];
Saurabh Shah7a606842013-12-11 14:36:04 -0800291 uint32_t mUseCount;
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700292 int mRotDevFd;
Saurabh Shahacf10202013-02-26 10:15:15 -0800293};
294
295
Naseer Ahmed29a26812012-06-14 00:56:20 -0700296} // overlay
297
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700298#endif // OVERlAY_ROTATOR_H