blob: e045b440fd317cca82d808a520f56ebffa2dccac [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(); }
Raj Kamalbd3bdc62014-08-05 18:52:49 +053055 void setCurrBufReleaseFd(const int& fence);
56 void setPrevBufReleaseFd(const int& fence);
Saurabh Shah912c9482014-02-07 14:01:04 -080057
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;
Raj Kamalbd3bdc62014-08-05 18:52:49 +053076 /* return true if the current rotator state is cached */
77 virtual bool isRotCached(int fd, uint32_t offset) const;
78 /* return true if current rotator config is same as the last round*/
79 virtual bool rotConfChanged() const = 0;
80 /* return true if the current rotator input buffer fd and offset
81 * are same as the last round */
82 virtual bool rotDataChanged(int fd, uint32_t offset) const;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080083 virtual void setDownscale(int ds) = 0;
Raj Kamalbd3bdc62014-08-05 18:52:49 +053084 /* returns the src buffer of the rotator for the previous/current round,
85 * depending on when it is called(before/after the queuebuffer)*/
86 virtual int getSrcMemId() const = 0;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -070087 //Mem id and offset should be retrieved only after rotator kickoff
Naseer Ahmed758bfc52012-11-28 17:02:08 -050088 virtual int getDstMemId() const = 0;
Raj Kamalbd3bdc62014-08-05 18:52:49 +053089 virtual uint32_t getSrcOffset() const = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050090 virtual uint32_t getDstOffset() const = 0;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -070091 //Destination width, height, format, position should be retrieved only after
92 //rotator configuration is committed via commit API
Raj kamal23f69b22012-11-17 00:20:55 +053093 virtual uint32_t getDstFormat() const = 0;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -070094 virtual utils::Whf getDstWhf() const = 0;
95 virtual utils::Dim getDstDimensions() const = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050096 virtual uint32_t getSessId() const = 0;
97 virtual bool queueBuffer(int fd, uint32_t offset) = 0;
98 virtual void dump() const = 0;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -080099 virtual void getDump(char *buf, size_t len) const = 0;
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530100 inline void setCurrBufReleaseFd(const int& fence) {
101 mMem.setCurrBufReleaseFd(fence);
102 }
103 inline void setPrevBufReleaseFd(const int& fence) {
104 mMem.setPrevBufReleaseFd(fence);
105 }
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500106 static Rotator *getRotator();
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700107 /* Returns downscale by successfully applying constraints
108 * Returns 0 if target doesnt support rotator downscaling
109 * or if any of the constraints are not met
110 */
111 static int getDownscaleFactor(const int& srcW, const int& srcH,
112 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
113 const bool& isInterlaced);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700114
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500115protected:
Saurabh Shah23a813c2013-03-20 16:58:12 -0700116 /* Rotator memory manager */
117 RotMem mMem;
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530118 Rotator();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800119 static uint32_t calcOutputBufSize(const utils::Whf& destWhf);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500120
121private:
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530122 bool mRotCacheDisabled;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500123 /*Returns rotator h/w type */
124 static int getRotatorHwType();
Saurabh Shah23a813c2013-03-20 16:58:12 -0700125 friend class RotMgr;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700126};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700127
128/*
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700129* MDP rot holds MDP's rotation related structures.
130*
Naseer Ahmed29a26812012-06-14 00:56:20 -0700131* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500132class MdpRot : public Rotator {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700133public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500134 virtual ~MdpRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500135 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700136 virtual void setCrop(const utils::Dim& crop);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700137 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800138 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500139 virtual bool commit();
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530140 virtual bool rotConfChanged() const;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800141 virtual void setDownscale(int ds);
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530142 virtual int getSrcMemId() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500143 virtual int getDstMemId() const;
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530144 virtual uint32_t getSrcOffset() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500145 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530146 virtual uint32_t getDstFormat() const;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -0700147 virtual utils::Whf getDstWhf() const;
148 virtual utils::Dim getDstDimensions() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500149 virtual uint32_t getSessId() const;
150 virtual bool queueBuffer(int fd, uint32_t offset);
151 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800152 virtual void getDump(char *buf, size_t len) const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700153
Naseer Ahmed29a26812012-06-14 00:56:20 -0700154private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500155 explicit MdpRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800156 bool init();
157 bool close();
158 void setRotations(uint32_t r);
159 bool enabled () const;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700160 /* remap rot buffers */
161 bool remap(uint32_t numbufs);
162 bool open_i(uint32_t numbufs, uint32_t bufsz);
163 /* Deferred transform calculations */
164 void doTransform();
165 /* reset underlying data, basically memset 0 */
166 void reset();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700167 /* save mRotImgInfo to be last known good config*/
168 void save();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800169 /* Calculates the rotator's o/p buffer size post the transform calcs and
170 * knowing the o/p format depending on whether fastYuv is enabled or not */
171 uint32_t calcOutputBufSize();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700172
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700173 /* Applies downscale by taking areas
174 * Returns a log(downscale)
175 * Constraints applied:
176 * - downscale should be a power of 2
177 * - Max downscale is 1/8
178 */
179 static int getDownscaleFactor(const int& srcW, const int& srcH,
180 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
181 const bool& isInterlaced);
182
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700183 /* rot info*/
184 msm_rotator_img_info mRotImgInfo;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700185 /* Last saved rot info*/
186 msm_rotator_img_info mLSRotImgInfo;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700187 /* rot data */
188 msm_rotator_data_info mRotDataInfo;
189 /* Orientation */
190 utils::eTransform mOrientation;
191 /* rotator fd */
192 OvFD mFd;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500193
194 friend Rotator* Rotator::getRotator();
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700195 friend int Rotator::getDownscaleFactor(const int& srcW, const int& srcH,
196 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
197 const bool& isInterlaced);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700198};
199
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700200/*
201+* MDSS Rot holds MDSS's rotation related structures.
202+*
203+* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500204class MdssRot : public Rotator {
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700205public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500206 virtual ~MdssRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500207 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700208 virtual void setCrop(const utils::Dim& crop);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700209 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800210 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500211 virtual bool commit();
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530212 virtual bool rotConfChanged() const;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800213 virtual void setDownscale(int ds);
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530214 virtual int getSrcMemId() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500215 virtual int getDstMemId() const;
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530216 virtual uint32_t getSrcOffset() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500217 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530218 virtual uint32_t getDstFormat() const;
Saurabh Shah8ec9b5e2014-06-30 14:37:17 -0700219 virtual utils::Whf getDstWhf() const;
220 virtual utils::Dim getDstDimensions() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500221 virtual uint32_t getSessId() const;
222 virtual bool queueBuffer(int fd, uint32_t offset);
223 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800224 virtual void getDump(char *buf, size_t len) const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700225
226private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500227 explicit MdssRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800228 bool init();
229 bool close();
230 void setRotations(uint32_t r);
231 bool enabled () const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700232 /* remap rot buffers */
233 bool remap(uint32_t numbufs);
234 bool open_i(uint32_t numbufs, uint32_t bufsz);
235 /* Deferred transform calculations */
236 void doTransform();
237 /* reset underlying data, basically memset 0 */
238 void reset();
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530239 /* save mRotInfo to be last known good config*/
240 void save();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800241 /* Calculates the rotator's o/p buffer size post the transform calcs and
242 * knowing the o/p format depending on whether fastYuv is enabled or not */
243 uint32_t calcOutputBufSize();
Sushil Chauhanbab187a2013-01-30 17:44:15 -0800244 // Calculate the compressed o/p buffer size for BWC
Sushil Chauhan466766f2013-07-31 11:21:07 -0700245 uint32_t calcCompressedBufSize(const utils::Whf& destWhf);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700246
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700247 /* Caller's responsibility to swap srcW, srcH if there is a 90 transform
248 * Returns actual downscale (not a log value)
249 * Constraints applied:
250 * - downscale should be a power of 2
251 * - Max downscale is 1/32
252 * - Equal downscale is applied in both directions
253 * - {srcW, srcH} mod downscale = 0
254 * - Interlaced content is not supported
255 */
256 static int getDownscaleFactor(const int& srcW, const int& srcH,
257 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
258 const bool& isInterlaced);
259
260 static utils::Dim getFormatAdjustedCrop(const utils::Dim& crop,
261 const uint32_t& mdpFormat, const bool& isInterlaced);
262
263 static utils::Dim getDownscaleAdjustedCrop(const utils::Dim& crop,
264 const uint32_t& downscale);
265
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700266 /* MdssRot info structure */
Raj Kamalbd3bdc62014-08-05 18:52:49 +0530267 mdp_overlay mRotInfo;
268 /* Last saved MdssRot info structure*/
269 mdp_overlay mLSRotInfo;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700270 /* MdssRot data structure */
271 msmfb_overlay_data mRotData;
272 /* Orientation */
273 utils::eTransform mOrientation;
274 /* rotator fd */
275 OvFD mFd;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700276 /* Enable/Disable Mdss Rot*/
277 bool mEnabled;
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700278 int mDownscale;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500279
280 friend Rotator* Rotator::getRotator();
Saurabh Shahc46cf9d2014-07-02 15:22:34 -0700281 friend int Rotator::getDownscaleFactor(const int& srcW, const int& srcH,
282 const int& dstW, const int& dstH, const uint32_t& mdpFormat,
283 const bool& isInterlaced);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700284};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700285
Saurabh Shahacf10202013-02-26 10:15:15 -0800286// Holder of rotator objects. Manages lifetimes
287class RotMgr {
288public:
Ramkumar Radhakrishnan9d20b392013-11-15 19:32:47 -0800289 //Virtually we can support as many rotator sessions as possible, However
290 // more number of rotator sessions leads to performance issues, so
291 // restricting the max rotator session to 4
Saurabh Shah54318572014-05-30 16:42:33 -0700292 enum { MAX_ROT_SESS = 4 };
Saurabh Shah7a606842013-12-11 14:36:04 -0800293
Saurabh Shahacf10202013-02-26 10:15:15 -0800294 ~RotMgr();
295 void configBegin();
296 void configDone();
297 overlay::Rotator *getNext();
298 void clear(); //Removes all instances
Saurabh Shah7a606842013-12-11 14:36:04 -0800299 //Resets the usage of top count objects, making them available for reuse
300 void markUnusedTop(const uint32_t& count) { mUseCount -= count; }
Saurabh Shahacf10202013-02-26 10:15:15 -0800301 /* Returns rot dump.
302 * Expects a NULL terminated buffer of big enough size.
303 */
304 void getDump(char *buf, size_t len);
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700305 int getRotDevFd();
Saurabh Shah2b6e5192013-10-22 17:22:04 -0700306 int getNumActiveSessions() { return mUseCount; }
Saurabh Shah7a606842013-12-11 14:36:04 -0800307
308 static RotMgr *getInstance();
309
Saurabh Shahacf10202013-02-26 10:15:15 -0800310private:
Saurabh Shah7a606842013-12-11 14:36:04 -0800311 RotMgr();
312 static RotMgr *sRotMgr;
313
Saurabh Shahacf10202013-02-26 10:15:15 -0800314 overlay::Rotator *mRot[MAX_ROT_SESS];
Saurabh Shah7a606842013-12-11 14:36:04 -0800315 uint32_t mUseCount;
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700316 int mRotDevFd;
Saurabh Shahacf10202013-02-26 10:15:15 -0800317};
318
319
Naseer Ahmed29a26812012-06-14 00:56:20 -0700320} // overlay
321
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700322#endif // OVERlAY_ROTATOR_H