129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
2e33e6a894950f7d258d79bc48441575e2b0981dbRaj kamal* Copyright (c) 2011,2013 The Linux Foundation. All rights reserved.
329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Redistribution and use in source and binary forms, with or without
529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* modification, are permitted provided that the following conditions are
629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* met:
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*    * Redistributions of source code must retain the above copyright
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      notice, this list of conditions and the following disclaimer.
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*    * Redistributions in binary form must reproduce the above
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      copyright notice, this list of conditions and the following
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      disclaimer in the documentation and/or other materials provided
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      with the distribution.
13d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed*    * Neither the name of The Linux Foundation. nor the names of its
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      contributors may be used to endorse or promote products derived
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      from this software without specific prior written permission.
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*/
2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
30f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#ifndef OVERlAY_ROTATOR_H
31f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#define OVERlAY_ROTATOR_H
3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <stdlib.h>
3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "mdpWrapper.h"
3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayUtils.h"
3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayMem.h"
3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay {
40f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
42f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed   Manages the case where new rotator memory needs to be
43f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed   allocated, before previous is freed, due to resolution change etc. If we make
44f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed   rotator memory to be always max size, irrespctive of source resolution then
45f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed   we don't need this RotMem wrapper. The inner class is sufficient.
46f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed*/
47f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedstruct RotMem {
48f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    // Max rotator memory allocations
49f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    enum { MAX_ROT_MEM = 2};
50f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
51f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    //Manages the rotator buffer offsets.
52f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    struct Mem {
531e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        Mem();
541e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        ~Mem();
55f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        bool valid() { return m.valid(); }
56f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        bool close() { return m.close(); }
57f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        uint32_t size() const { return m.bufSz(); }
581e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        void setReleaseFd(const int& fence);
59f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        // Max rotator buffers
60f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        enum { ROT_NUM_BUFS = 2 };
61f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        // rotator data info dst offset
62f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        uint32_t mRotOffset[ROT_NUM_BUFS];
631e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        int mRelFence[ROT_NUM_BUFS];
64f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        // current offset slot from mRotOffset
65f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        uint32_t mCurrOffset;
66f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        OvMem m;
67f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    };
68f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
69f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    RotMem() : _curr(0) {}
70f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    Mem& curr() { return m[_curr % MAX_ROT_MEM]; }
71f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    const Mem& curr() const { return m[_curr % MAX_ROT_MEM]; }
72f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    Mem& prev() { return m[(_curr+1) % MAX_ROT_MEM]; }
73f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    RotMem& operator++() { ++_curr; return *this; }
741e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    void setReleaseFd(const int& fence) { curr().setReleaseFd(fence); }
75f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool close();
76f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    uint32_t _curr;
77f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    Mem m[MAX_ROT_MEM];
78f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed};
7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
801e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahclass Rotator
811e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah{
821e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahpublic:
831e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    enum { TYPE_MDP, TYPE_MDSS };
841e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual ~Rotator();
851e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual void setSource(const utils::Whf& wfh) = 0;
862e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    virtual void setSource(const utils::Whf& awhf, const utils::Whf& owhf) = 0;
871e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual void setFlags(const utils::eMdpFlags& flags) = 0;
881e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual void setTransform(const utils::eTransform& rot) = 0;
891e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual bool commit() = 0;
901e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual void setDownscale(int ds) = 0;
911e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual int getDstMemId() const = 0;
921e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual uint32_t getDstOffset() const = 0;
931e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual uint32_t getDstFormat() const = 0;
941e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual uint32_t getSessId() const = 0;
951e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual bool queueBuffer(int fd, uint32_t offset) = 0;
961e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual void dump() const = 0;
971e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    virtual void getDump(char *buf, size_t len) const = 0;
981e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    void setReleaseFd(const int& fence) { mMem.setReleaseFd(fence); }
991e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    static Rotator *getRotator();
1001e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
1011e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahprotected:
1021e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    /* Rotator memory manager */
1031e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    RotMem mMem;
1041e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    explicit Rotator() {}
1051e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    static uint32_t calcOutputBufSize(const utils::Whf& destWhf);
1061e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
1071e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahprivate:
1081e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    /*Returns rotator h/w type */
1091e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    static int getRotatorHwType();
1101e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    friend class RotMgr;
1111e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah};
1121e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
114f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed* MDP rot holds MDP's rotation related structures.
115f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed*
11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* */
117d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedclass MdpRot : public Rotator {
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic:
119d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual ~MdpRot();
120d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual void setSource(const utils::Whf& wfh);
1212e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    virtual void setSource(const utils::Whf& awhf, const utils::Whf& owhf);
122f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    virtual void setFlags(const utils::eMdpFlags& flags);
123d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan    virtual void setTransform(const utils::eTransform& rot);
124d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual bool commit();
125d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan    virtual void setDownscale(int ds);
126d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual int getDstMemId() const;
127d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual uint32_t getDstOffset() const;
128e33e6a894950f7d258d79bc48441575e2b0981dbRaj kamal    virtual uint32_t getDstFormat() const;
129d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual uint32_t getSessId() const;
130d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual bool queueBuffer(int fd, uint32_t offset);
131d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual void dump() const;
132f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    virtual void getDump(char *buf, size_t len) const;
13329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
13429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedprivate:
135d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    explicit MdpRot();
13636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool init();
13736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool close();
13836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setRotations(uint32_t r);
13936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool enabled () const;
140f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* remap rot buffers */
141f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool remap(uint32_t numbufs);
142f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool open_i(uint32_t numbufs, uint32_t bufsz);
143f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* Deferred transform calculations */
144f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    void doTransform();
145f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* reset underlying data, basically memset 0 */
146f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    void reset();
147c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah    /* return true if current rotator config is different
148c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah     * than last known config */
149c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah    bool rotConfChanged() const;
150c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah    /* save mRotImgInfo to be last known good config*/
151c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah    void save();
1524e2cfc92692f8b9c03cb35702fa5ffeda0d29571Saurabh Shah    /* Calculates the rotator's o/p buffer size post the transform calcs and
1534e2cfc92692f8b9c03cb35702fa5ffeda0d29571Saurabh Shah     * knowing the o/p format depending on whether fastYuv is enabled or not */
1544e2cfc92692f8b9c03cb35702fa5ffeda0d29571Saurabh Shah    uint32_t calcOutputBufSize();
155c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah
156f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* rot info*/
157f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    msm_rotator_img_info mRotImgInfo;
1582e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    /* Original buffer dimensions*/
1592e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    utils::Whf mOrigWhf;
160c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah    /* Last saved rot info*/
161c23b380f5c97906717e3f71e20133e88bb5d8e77Saurabh Shah    msm_rotator_img_info mLSRotImgInfo;
162f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* rot data */
163f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    msm_rotator_data_info mRotDataInfo;
164f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* Orientation */
165f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    utils::eTransform mOrientation;
166f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* rotator fd */
167f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    OvFD mFd;
168d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
169d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    friend Rotator* Rotator::getRotator();
17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
172e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah/*
173e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah+* MDSS Rot holds MDSS's rotation related structures.
174e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah+*
175e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah+* */
176d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedclass MdssRot : public Rotator {
177e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shahpublic:
178d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual ~MdssRot();
1792e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    virtual void setSource(const utils::Whf& whf);
1802e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    virtual void setSource(const utils::Whf& awhf, const utils::Whf& owhf);
181e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    virtual void setFlags(const utils::eMdpFlags& flags);
182d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan    virtual void setTransform(const utils::eTransform& rot);
183d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual bool commit();
184d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan    virtual void setDownscale(int ds);
185d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual int getDstMemId() const;
186d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual uint32_t getDstOffset() const;
187e33e6a894950f7d258d79bc48441575e2b0981dbRaj kamal    virtual uint32_t getDstFormat() const;
188d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual uint32_t getSessId() const;
189d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual bool queueBuffer(int fd, uint32_t offset);
190d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    virtual void dump() const;
191f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    virtual void getDump(char *buf, size_t len) const;
192e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah
193e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shahprivate:
194d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    explicit MdssRot();
19536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool init();
19636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool close();
19736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setRotations(uint32_t r);
19836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool enabled () const;
199e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* remap rot buffers */
200e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    bool remap(uint32_t numbufs);
201e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    bool open_i(uint32_t numbufs, uint32_t bufsz);
202e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* Deferred transform calculations */
203e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    void doTransform();
204e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* reset underlying data, basically memset 0 */
205e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    void reset();
2064e2cfc92692f8b9c03cb35702fa5ffeda0d29571Saurabh Shah    /* Calculates the rotator's o/p buffer size post the transform calcs and
2074e2cfc92692f8b9c03cb35702fa5ffeda0d29571Saurabh Shah     * knowing the o/p format depending on whether fastYuv is enabled or not */
2084e2cfc92692f8b9c03cb35702fa5ffeda0d29571Saurabh Shah    uint32_t calcOutputBufSize();
209e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah
210e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* MdssRot info structure */
211e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    mdp_overlay   mRotInfo;
212e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* MdssRot data structure */
213e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    msmfb_overlay_data mRotData;
214e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* Orientation */
215e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    utils::eTransform mOrientation;
216e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* rotator fd */
217e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    OvFD mFd;
218e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    /* Enable/Disable Mdss Rot*/
219e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah    bool mEnabled;
22029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
221d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    friend Rotator* Rotator::getRotator();
222d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed};
223e012f7ad3026349c5a6edafbd550cd83655b99d5Saurabh Shah
22436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah// Holder of rotator objects. Manages lifetimes
22536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass RotMgr {
22636963690317abceae79621f14ba41ff62b3ff489Saurabh Shahpublic:
22736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //Maximum sessions based on VG pipes, since rotator is used only for videos.
22836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //Even though we can have 4 mixer stages, that much may be unnecessary.
22936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    enum { MAX_ROT_SESS = 3 };
23036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    RotMgr();
23136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ~RotMgr();
23236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void configBegin();
23336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void configDone();
23436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    overlay::Rotator *getNext();
23536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void clear(); //Removes all instances
23636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* Returns rot dump.
23736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     * Expects a NULL terminated buffer of big enough size.
23836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     */
23936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void getDump(char *buf, size_t len);
2401e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    int getRotDevFd(); //Called on A-fam only
24136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahprivate:
24236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    overlay::Rotator *mRot[MAX_ROT_SESS];
24336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int mUseCount;
2441e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    int mRotDevFd; //A-fam
24536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah};
24636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
24736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
248f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed} // overlay
24929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
250f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#endif // OVERlAY_ROTATOR_H
251