blob: 0b55baec3c58f0cddf6dcbcdd06cd47d4303858e [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"
Manish Kumar5f100f62014-05-19 03:49:03 -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 Shah9acd8f72014-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 Shah9acd8f72014-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;
Baldev Kumar Sahu7c71a242015-05-21 12:56:38 +053073 virtual bool isRotBufReusable(const utils::eMdpFlags& flags) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050074 virtual void setFlags(const utils::eMdpFlags& flags) = 0;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080075 virtual void setTransform(const utils::eTransform& rot) = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050076 virtual bool commit() = 0;
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -080077 virtual void setDownscale(int ds) = 0;
Saurabh Shah6816ece2014-06-30 14:37:17 -070078 //Mem id and offset should be retrieved only after rotator kickoff
Naseer Ahmed758bfc52012-11-28 17:02:08 -050079 virtual int getDstMemId() const = 0;
80 virtual uint32_t getDstOffset() const = 0;
Saurabh Shah6816ece2014-06-30 14:37:17 -070081 //Destination width, height, format, position should be retrieved only after
82 //rotator configuration is committed via commit API
Raj kamal23f69b22012-11-17 00:20:55 +053083 virtual uint32_t getDstFormat() const = 0;
Saurabh Shah6816ece2014-06-30 14:37:17 -070084 virtual utils::Whf getDstWhf() const = 0;
85 virtual utils::Dim getDstDimensions() const = 0;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050086 virtual uint32_t getSessId() const = 0;
87 virtual bool queueBuffer(int fd, uint32_t offset) = 0;
88 virtual void dump() const = 0;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -080089 virtual void getDump(char *buf, size_t len) const = 0;
Saurabh Shah23a813c2013-03-20 16:58:12 -070090 void setReleaseFd(const int& fence) { mMem.setReleaseFd(fence); }
Naseer Ahmed758bfc52012-11-28 17:02:08 -050091 static Rotator *getRotator();
Naseer Ahmed29a26812012-06-14 00:56:20 -070092
Naseer Ahmed758bfc52012-11-28 17:02:08 -050093protected:
Saurabh Shah23a813c2013-03-20 16:58:12 -070094 /* Rotator memory manager */
95 RotMem mMem;
Naseer Ahmed758bfc52012-11-28 17:02:08 -050096 explicit Rotator() {}
Saurabh Shahfc3652f2013-02-15 13:15:45 -080097 static uint32_t calcOutputBufSize(const utils::Whf& destWhf);
Naseer Ahmed758bfc52012-11-28 17:02:08 -050098
99private:
100 /*Returns rotator h/w type */
101 static int getRotatorHwType();
Saurabh Shah23a813c2013-03-20 16:58:12 -0700102 friend class RotMgr;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700103};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700104
105/*
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700106* MDP rot holds MDP's rotation related structures.
107*
Naseer Ahmed29a26812012-06-14 00:56:20 -0700108* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500109class MdpRot : public Rotator {
Naseer Ahmed29a26812012-06-14 00:56:20 -0700110public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500111 virtual ~MdpRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500112 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700113 virtual void setCrop(const utils::Dim& crop);
Baldev Kumar Sahu7c71a242015-05-21 12:56:38 +0530114 virtual bool isRotBufReusable(const utils::eMdpFlags& flags);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700115 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800116 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500117 virtual bool commit();
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800118 virtual void setDownscale(int ds);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500119 virtual int getDstMemId() const;
120 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530121 virtual uint32_t getDstFormat() const;
Saurabh Shah6816ece2014-06-30 14:37:17 -0700122 virtual utils::Whf getDstWhf() const;
123 virtual utils::Dim getDstDimensions() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500124 virtual uint32_t getSessId() const;
125 virtual bool queueBuffer(int fd, uint32_t offset);
126 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800127 virtual void getDump(char *buf, size_t len) const;
Naseer Ahmed29a26812012-06-14 00:56:20 -0700128
Naseer Ahmed29a26812012-06-14 00:56:20 -0700129private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500130 explicit MdpRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800131 bool init();
132 bool close();
133 void setRotations(uint32_t r);
134 bool enabled () const;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700135 /* remap rot buffers */
136 bool remap(uint32_t numbufs);
137 bool open_i(uint32_t numbufs, uint32_t bufsz);
138 /* Deferred transform calculations */
139 void doTransform();
140 /* reset underlying data, basically memset 0 */
141 void reset();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700142 /* return true if current rotator config is different
143 * than last known config */
144 bool rotConfChanged() const;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700145 /* save mRotImgInfo to be last known good config*/
146 void save();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800147 /* Calculates the rotator's o/p buffer size post the transform calcs and
148 * knowing the o/p format depending on whether fastYuv is enabled or not */
149 uint32_t calcOutputBufSize();
Saurabh Shahc23b3802012-08-31 11:11:30 -0700150
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700151 /* rot info*/
152 msm_rotator_img_info mRotImgInfo;
Saurabh Shahc23b3802012-08-31 11:11:30 -0700153 /* Last saved rot info*/
154 msm_rotator_img_info mLSRotImgInfo;
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700155 /* rot data */
156 msm_rotator_data_info mRotDataInfo;
157 /* Orientation */
158 utils::eTransform mOrientation;
159 /* rotator fd */
160 OvFD mFd;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500161
162 friend Rotator* Rotator::getRotator();
Naseer Ahmed29a26812012-06-14 00:56:20 -0700163};
164
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700165/*
166+* MDSS Rot holds MDSS's rotation related structures.
167+*
168+* */
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500169class MdssRot : public Rotator {
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700170public:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500171 virtual ~MdssRot();
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500172 virtual void setSource(const utils::Whf& wfh);
Sushil Chauhan80fc1f92013-04-23 17:30:05 -0700173 virtual void setCrop(const utils::Dim& crop);
Baldev Kumar Sahu7c71a242015-05-21 12:56:38 +0530174 virtual bool isRotBufReusable(const utils::eMdpFlags& flags);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700175 virtual void setFlags(const utils::eMdpFlags& flags);
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800176 virtual void setTransform(const utils::eTransform& rot);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500177 virtual bool commit();
Ramkumar Radhakrishnan288f8c72013-01-15 11:37:54 -0800178 virtual void setDownscale(int ds);
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500179 virtual int getDstMemId() const;
180 virtual uint32_t getDstOffset() const;
Raj kamal23f69b22012-11-17 00:20:55 +0530181 virtual uint32_t getDstFormat() const;
Saurabh Shah6816ece2014-06-30 14:37:17 -0700182 virtual utils::Whf getDstWhf() const;
183 virtual utils::Dim getDstDimensions() const;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500184 virtual uint32_t getSessId() const;
185 virtual bool queueBuffer(int fd, uint32_t offset);
186 virtual void dump() const;
Saurabh Shah0d0a7cb2013-02-12 17:58:19 -0800187 virtual void getDump(char *buf, size_t len) const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700188
189private:
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500190 explicit MdssRot();
Saurabh Shahacf10202013-02-26 10:15:15 -0800191 bool init();
192 bool close();
193 void setRotations(uint32_t r);
194 bool enabled () const;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700195 /* remap rot buffers */
196 bool remap(uint32_t numbufs);
197 bool open_i(uint32_t numbufs, uint32_t bufsz);
198 /* Deferred transform calculations */
199 void doTransform();
200 /* reset underlying data, basically memset 0 */
201 void reset();
Saurabh Shahfc3652f2013-02-15 13:15:45 -0800202 /* Calculates the rotator's o/p buffer size post the transform calcs and
203 * knowing the o/p format depending on whether fastYuv is enabled or not */
204 uint32_t calcOutputBufSize();
Sushil Chauhanbab187a2013-01-30 17:44:15 -0800205 // Calculate the compressed o/p buffer size for BWC
Sushil Chauhan466766f2013-07-31 11:21:07 -0700206 uint32_t calcCompressedBufSize(const utils::Whf& destWhf);
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700207
208 /* MdssRot info structure */
209 mdp_overlay mRotInfo;
210 /* MdssRot data structure */
211 msmfb_overlay_data mRotData;
212 /* Orientation */
213 utils::eTransform mOrientation;
214 /* rotator fd */
215 OvFD mFd;
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700216 /* Enable/Disable Mdss Rot*/
217 bool mEnabled;
Naseer Ahmed758bfc52012-11-28 17:02:08 -0500218
219 friend Rotator* Rotator::getRotator();
Saurabh Shahe012f7a2012-08-18 15:11:57 -0700220};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700221
Saurabh Shahacf10202013-02-26 10:15:15 -0800222// Holder of rotator objects. Manages lifetimes
223class RotMgr {
224public:
225 //Maximum sessions based on VG pipes, since rotator is used only for videos.
226 //Even though we can have 4 mixer stages, that much may be unnecessary.
227 enum { MAX_ROT_SESS = 3 };
Saurabh Shah7a606842013-12-11 14:36:04 -0800228
Saurabh Shahacf10202013-02-26 10:15:15 -0800229 ~RotMgr();
230 void configBegin();
231 void configDone();
232 overlay::Rotator *getNext();
233 void clear(); //Removes all instances
Saurabh Shah7a606842013-12-11 14:36:04 -0800234 //Resets the usage of top count objects, making them available for reuse
235 void markUnusedTop(const uint32_t& count) { mUseCount -= count; }
Saurabh Shahacf10202013-02-26 10:15:15 -0800236 /* Returns rot dump.
237 * Expects a NULL terminated buffer of big enough size.
238 */
239 void getDump(char *buf, size_t len);
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700240 int getRotDevFd();
Saurabh Shah2b6e5192013-10-22 17:22:04 -0700241 int getNumActiveSessions() { return mUseCount; }
Saurabh Shah7a606842013-12-11 14:36:04 -0800242
243 static RotMgr *getInstance();
244
Saurabh Shahacf10202013-02-26 10:15:15 -0800245private:
Saurabh Shah7a606842013-12-11 14:36:04 -0800246 RotMgr();
247 static RotMgr *sRotMgr;
248
Saurabh Shahacf10202013-02-26 10:15:15 -0800249 overlay::Rotator *mRot[MAX_ROT_SESS];
Saurabh Shah7a606842013-12-11 14:36:04 -0800250 uint32_t mUseCount;
Saurabh Shahe9b5a8f2013-06-28 11:33:25 -0700251 int mRotDevFd;
Saurabh Shahacf10202013-02-26 10:15:15 -0800252};
253
254
Naseer Ahmed29a26812012-06-14 00:56:20 -0700255} // overlay
256
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700257#endif // OVERlAY_ROTATOR_H