1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (c) 2011,2013 The Linux Foundation. All rights reserved.
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Redistribution and use in source and binary forms, with or without
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* modification, are permitted provided that the following conditions are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* met:
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*    * Redistributions of source code must retain the above copyright
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      notice, this list of conditions and the following disclaimer.
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*    * Redistributions in binary form must reproduce the above
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      copyright notice, this list of conditions and the following
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      disclaimer in the documentation and/or other materials provided
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      with the distribution.
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*    * Neither the name of The Linux Foundation. nor the names of its
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      contributors may be used to endorse or promote products derived
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      from this software without specific prior written permission.
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef OVERlAY_ROTATOR_H
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define OVERlAY_ROTATOR_H
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <stdlib.h>
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "mdpWrapper.h"
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayUtils.h"
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayMem.h"
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace overlay {
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin   Manages the case where new rotator memory needs to be
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin   allocated, before previous is freed, due to resolution change etc. If we make
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin   rotator memory to be always max size, irrespctive of source resolution then
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin   we don't need this RotMem wrapper. The inner class is sufficient.
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct RotMem {
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Max rotator buffers
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    enum { ROT_NUM_BUFS = 2 };
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    RotMem();
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ~RotMem();
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool close();
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool valid() { return mem.valid(); }
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t size() const { return mem.bufSz(); }
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setCurrBufReleaseFd(const int& fence);
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setPrevBufReleaseFd(const int& fence);
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // rotator data info dst offset
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t mRotOffset[ROT_NUM_BUFS];
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mRelFence[ROT_NUM_BUFS];
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // current slot being used
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t mCurrIndex;
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    OvMem mem;
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass Rotator
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    enum { TYPE_MDP, TYPE_MDSS };
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~Rotator();
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setSource(const utils::Whf& wfh) = 0;
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setCrop(const utils::Dim& crop) = 0;
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setFlags(const utils::eMdpFlags& flags) = 0;
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setTransform(const utils::eTransform& rot) = 0;
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool commit() = 0;
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* return true if the current rotator state is cached */
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool isRotCached(int fd, uint32_t offset) const;
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* return true if current rotator config is same as the last round*/
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool rotConfChanged() const = 0;
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* return true if the current rotator input buffer fd and offset
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * are same as the last round */
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool rotDataChanged(int fd, uint32_t offset) const;
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setDownscale(int ds) = 0;
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* returns the src buffer of the rotator for the previous/current round,
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * depending on when it is called(before/after the queuebuffer)*/
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual int getSrcMemId() const = 0;
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Mem id and offset should be retrieved only after rotator kickoff
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual int getDstMemId() const = 0;
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getSrcOffset() const = 0;
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getDstOffset() const = 0;
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Destination width, height, format, position should be retrieved only after
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //rotator configuration is committed via commit API
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getDstFormat() const = 0;
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual utils::Whf getDstWhf() const = 0;
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual utils::Dim getDstDimensions() const = 0;
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getSessId() const = 0;
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool queueBuffer(int fd, uint32_t offset) = 0;
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void dump() const = 0;
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void getDump(char *buf, size_t len) const = 0;
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inline void setCurrBufReleaseFd(const int& fence) {
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mMem.setCurrBufReleaseFd(fence);
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inline void setPrevBufReleaseFd(const int& fence) {
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mMem.setPrevBufReleaseFd(fence);
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static Rotator *getRotator();
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Returns downscale by successfully applying constraints
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * Returns 0 if target doesnt support rotator downscaling
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * or if any of the constraints are not met
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     */
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static int getDownscaleFactor(const int& srcW, const int& srcH,
112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const int& dstW, const int& dstH, const uint32_t& mdpFormat,
113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const bool& isInterlaced);
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprotected:
116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Rotator memory manager */
117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    RotMem mMem;
118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Rotator();
119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static uint32_t calcOutputBufSize(const utils::Whf& destWhf);
120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mRotCacheDisabled;
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /*Returns rotator h/w type */
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static int getRotatorHwType();
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    friend class RotMgr;
126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* MDP rot holds MDP's rotation related structures.
130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* */
132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass MdpRot : public Rotator {
133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~MdpRot();
135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setSource(const utils::Whf& wfh);
136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setCrop(const utils::Dim& crop);
137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setFlags(const utils::eMdpFlags& flags);
138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setTransform(const utils::eTransform& rot);
139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool commit();
140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool rotConfChanged() const;
141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setDownscale(int ds);
142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual int getSrcMemId() const;
143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual int getDstMemId() const;
144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getSrcOffset() const;
145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getDstOffset() const;
146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getDstFormat() const;
147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual utils::Whf getDstWhf() const;
148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual utils::Dim getDstDimensions() const;
149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getSessId() const;
150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool queueBuffer(int fd, uint32_t offset);
151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void dump() const;
152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void getDump(char *buf, size_t len) const;
153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    explicit MdpRot();
156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool init();
157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool close();
158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setRotations(uint32_t r);
159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool enabled () const;
160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* remap rot buffers */
161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool remap(uint32_t numbufs);
162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool open_i(uint32_t numbufs, uint32_t bufsz);
163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Deferred transform calculations */
164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void doTransform();
165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* reset underlying data, basically memset 0 */
166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void reset();
167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* save mRotImgInfo to be last known good config*/
168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void save();
169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Calculates the rotator's o/p buffer size post the transform calcs and
170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * knowing the o/p format depending on whether fastYuv is enabled or not */
171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t calcOutputBufSize();
172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Applies downscale by taking areas
174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * Returns a log(downscale)
175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * Constraints applied:
176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * - downscale should be a power of 2
177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * - Max downscale is 1/8
178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     */
179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static int getDownscaleFactor(const int& srcW, const int& srcH,
180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const int& dstW, const int& dstH, const uint32_t& mdpFormat,
181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const bool& isInterlaced);
182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* rot info*/
184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    msm_rotator_img_info mRotImgInfo;
185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Last saved rot info*/
186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    msm_rotator_img_info mLSRotImgInfo;
187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* rot data */
188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    msm_rotator_data_info mRotDataInfo;
189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Orientation */
190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::eTransform mOrientation;
191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* rotator fd */
192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    OvFD mFd;
193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    friend Rotator* Rotator::getRotator();
195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    friend int Rotator::getDownscaleFactor(const int& srcW, const int& srcH,
196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const int& dstW, const int& dstH, const uint32_t& mdpFormat,
197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const bool& isInterlaced);
198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin+* MDSS Rot holds MDSS's rotation related structures.
202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin+*
203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin+* */
204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass MdssRot : public Rotator {
205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~MdssRot();
207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setSource(const utils::Whf& wfh);
208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setCrop(const utils::Dim& crop);
209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setFlags(const utils::eMdpFlags& flags);
210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setTransform(const utils::eTransform& rot);
211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool commit();
212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool rotConfChanged() const;
213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void setDownscale(int ds);
214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual int getSrcMemId() const;
215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual int getDstMemId() const;
216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getSrcOffset() const;
217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getDstOffset() const;
218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getDstFormat() const;
219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual utils::Whf getDstWhf() const;
220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual utils::Dim getDstDimensions() const;
221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual uint32_t getSessId() const;
222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool queueBuffer(int fd, uint32_t offset);
223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void dump() const;
224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void getDump(char *buf, size_t len) const;
225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    explicit MdssRot();
228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool init();
229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool close();
230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setRotations(uint32_t r);
231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool enabled () const;
232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* remap rot buffers */
233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool remap(uint32_t numbufs);
234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool open_i(uint32_t numbufs, uint32_t bufsz);
235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Deferred transform calculations */
236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void doTransform();
237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* reset underlying data, basically memset 0 */
238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void reset();
239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* save mRotInfo to be last known good config*/
240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void save();
241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Calculates the rotator's o/p buffer size post the transform calcs and
242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * knowing the o/p format depending on whether fastYuv is enabled or not */
243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t calcOutputBufSize();
244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Calculate the compressed o/p buffer size for BWC
245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t calcCompressedBufSize(const utils::Whf& destWhf);
246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     /* Caller's responsibility to swap srcW, srcH if there is a 90 transform
248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * Returns actual downscale (not a log value)
249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * Constraints applied:
250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * - downscale should be a power of 2
251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * - Max downscale is 1/32
252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * - Equal downscale is applied in both directions
253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * - {srcW, srcH} mod downscale = 0
254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      * - Interlaced content is not supported
255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin      */
256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static int getDownscaleFactor(const int& srcW, const int& srcH,
257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const int& dstW, const int& dstH, const uint32_t& mdpFormat,
258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const bool& isInterlaced);
259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static utils::Dim getFormatAdjustedCrop(const utils::Dim& crop,
261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const uint32_t& mdpFormat, const bool& isInterlaced);
262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static utils::Dim getDownscaleAdjustedCrop(const utils::Dim& crop,
264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const uint32_t& downscale);
265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* MdssRot info structure */
267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mdp_overlay mRotInfo;
268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Last saved MdssRot info structure*/
269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mdp_overlay mLSRotInfo;
270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* MdssRot data structure */
271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    msmfb_overlay_data mRotData;
272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Orientation */
273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::eTransform mOrientation;
274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* rotator fd */
275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    OvFD mFd;
276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Enable/Disable Mdss Rot*/
277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mEnabled;
278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mDownscale;
279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    friend Rotator* Rotator::getRotator();
281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    friend int Rotator::getDownscaleFactor(const int& srcW, const int& srcH,
282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const int& dstW, const int& dstH, const uint32_t& mdpFormat,
283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const bool& isInterlaced);
284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Holder of rotator objects. Manages lifetimes
287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass RotMgr {
288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Virtually we can support as many rotator sessions as possible, However
290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // more number of rotator sessions leads to performance issues, so
291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // restricting the max rotator session to 4
292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    enum { MAX_ROT_SESS = 4 };
293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ~RotMgr();
295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void configBegin();
296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void configDone();
297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    overlay::Rotator *getNext();
298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void clear(); //Removes all instances
299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Resets the usage of top count objects, making them available for reuse
300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void markUnusedTop(const uint32_t& count) { mUseCount -= count; }
301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Returns rot dump.
302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * Expects a NULL terminated buffer of big enough size.
303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     */
304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void getDump(char *buf, size_t len);
305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getRotDevFd();
306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getNumActiveSessions() { return mUseCount; }
307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static RotMgr *getInstance();
309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    RotMgr();
312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static RotMgr *sRotMgr;
313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    overlay::Rotator *mRot[MAX_ROT_SESS];
315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t mUseCount;
316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mRotDevFd;
317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} // overlay
321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif // OVERlAY_ROTATOR_H
323