1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Redistribution and use in source and binary forms, with or without
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* modification, are permitted provided that the following conditions are
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* met:
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*    * Redistributions of source code must retain the above copyright
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      notice, this list of conditions and the following disclaimer.
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*    * Redistributions in binary form must reproduce the above
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      copyright notice, this list of conditions and the following
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      disclaimer in the documentation and/or other materials provided
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      with the distribution.
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*    * Neither the name of The Linux Foundation nor the names of its
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      contributors may be used to endorse or promote products derived
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*      from this software without specific prior written permission.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*/
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef OVERLAY_UTILS_H
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define OVERLAY_UTILS_H
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/log.h> // ALOGE, etc
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <errno.h>
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <fcntl.h> // open, O_RDWR, etc
36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/hardware.h>
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/gralloc.h> // buffer_handle_t
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <linux/msm_mdp.h> // flags
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <linux/msm_rotator.h>
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdio.h>
41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdlib.h>
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <string.h>
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/stat.h>
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/types.h>
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Log.h>
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "gralloc_priv.h" //for interlace
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
48a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// Older platforms do not support Venus
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef VENUS_COLOR_FORMAT
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MDP_Y_CBCR_H2V2_VENUS MDP_IMGTYPE_LIMIT
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Collection of utilities functions/structs/enums etc...
56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* */
58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// comment that out if you want to remove asserts
60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// or put it as -D in Android.mk. your choice.
61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define OVERLAY_HAS_ASSERT
62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef OVERLAY_HAS_ASSERT
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson# define OVASSERT(x, ...) if(!(x)) { ALOGE(__VA_ARGS__); abort(); }
65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#else
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson# define OVASSERT(x, ...) ALOGE_IF(!(x), __VA_ARGS__)
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif // OVERLAY_HAS_ASSERT
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define DEBUG_OVERLAY 0
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define PROFILE_OVERLAY 0
71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef MDSS_MDP_RIGHT_MIXER
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MDSS_MDP_RIGHT_MIXER 0x100
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef MDP_OV_PIPE_FORCE_DMA
77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MDP_OV_PIPE_FORCE_DMA 0x4000
78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
80a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifndef MDSS_MDP_DUAL_PIPE
81a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#define MDSS_MDP_DUAL_PIPE 0x200
82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif
83a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define FB_DEVICE_TEMPLATE "/dev/graphics/fb%u"
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace overlay {
87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// fwd
89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass Overlay;
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass OvFD;
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* helper function to open by using fbnum */
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool open(OvFD& fd, uint32_t fbnum, const char* const dev,
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int flags = O_RDWR);
95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace utils {
97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct Whf;
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct Dim;
99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline uint32_t setBit(uint32_t x, uint32_t mask) {
101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return (x | mask);
102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline uint32_t clrBit(uint32_t x, uint32_t mask) {
105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return (x & ~mask);
106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* Utility class to help avoid copying instances by making the copy ctor
109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* and assignment operator private
110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*
111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Usage:
112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*    class SomeClass : utils::NoCopy {...};
113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*/
114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass NoCopy {
115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprotected:
116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    NoCopy(){}
117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ~NoCopy() {}
118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    NoCopy(const NoCopy&);
120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const NoCopy& operator=(const NoCopy&);
121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isMdssRotator();
124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid normalizeCrop(uint32_t& xy, uint32_t& wh);
125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsontemplate <class Type>
127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid swapWidthHeight(Type& width, Type& height);
128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct Dim {
130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Dim () : x(0), y(0),
131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    w(0), h(0),
132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    o(0) {}
133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Dim(uint32_t _x, uint32_t _y, uint32_t _w, uint32_t _h) :
134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        x(_x), y(_y),
135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        w(_w), h(_h) {}
136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Dim(uint32_t _x, uint32_t _y, uint32_t _w, uint32_t _h, uint32_t _o) :
137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        x(_x), y(_y),
138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        w(_w), h(_h),
139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        o(_o) {}
140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool check(uint32_t _w, uint32_t _h) const {
141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return (x+w <= _w && y+h <= _h);
142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool operator==(const Dim& d) const {
146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return d.x == x && d.y == y &&
147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                d.w == w && d.h == h &&
148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                d.o == o;
149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool operator!=(const Dim& d) const {
152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return !operator==(d);
153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump() const;
156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t x;
157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t y;
158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t w;
159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t h;
160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t o;
161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// TODO have Whfz
164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct Whf {
166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Whf() : w(0), h(0), format(0), size(0) {}
167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Whf(uint32_t wi, uint32_t he, uint32_t f) :
168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        w(wi), h(he), format(f), size(0) {}
169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Whf(uint32_t wi, uint32_t he, uint32_t f, uint32_t s) :
170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        w(wi), h(he), format(f), size(s) {}
171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // FIXME not comparing size at the moment
172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool operator==(const Whf& whf) const {
173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return whf.w == w && whf.h == h &&
174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                whf.format == format;
175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool operator!=(const Whf& whf) const {
177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return !operator==(whf);
178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump() const;
180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t w;
181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t h;
182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t format;
183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t size;
184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum { MAX_PATH_LEN = 256 };
187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum { DEFAULT_PLANE_ALPHA = 0xFF };
189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/**
191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Rotator flags: not to be confused with orientation flags.
192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Usually, you want to open the rotator to make sure it is
193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * ready for business.
194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * */
195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson enum eRotFlags {
196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_FLAGS_NONE = 0,
197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //Use rotator for 0 rotation. It is used anyway for others.
198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_0_ENABLED = 1 << 0,
199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //Enable rotator downscale optimization for hardware bugs not handled in
200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //driver. If downscale optimizatation is required,
201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //then rotator will be used even if its 0 rotation case.
202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_DOWNSCALE_ENABLED = 1 << 1,
203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_PREROTATED = 1 << 2,
204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eRotDownscale {
207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_DS_NONE = 0,
208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_DS_HALF = 1,
209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_DS_FOURTH = 2,
210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ROT_DS_EIGHTH = 3,
211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* The values for is_fg flag for control alpha and transp
214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * IS_FG_OFF means is_fg = 0
215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * IS_FG_SET means is_fg = 1
216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eIsFg {
218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    IS_FG_OFF = 0,
219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    IS_FG_SET = 1
220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Various mdp flags like PIPE SHARE, DEINTERLACE etc...
224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * kernel/common/linux/msm_mdp.h
225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * INTERLACE_MASK: hardware/qcom/display/libgralloc/badger/fb_priv.h
226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * */
227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eMdpFlags {
228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_FLAGS_NONE = 0,
229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PIPE_SHARE =  MDP_OV_PIPE_SHARE,
230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PIPE_FORCE_DMA = MDP_OV_PIPE_FORCE_DMA,
231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_DEINTERLACE = MDP_DEINTERLACE,
232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_SECURE_OVERLAY_SESSION = MDP_SECURE_OVERLAY_SESSION,
233a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    OV_MDP_SECURE_DISPLAY_OVERLAY_SESSION = MDP_SECURE_DISPLAY_OVERLAY_SESSION,
234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_SOURCE_ROTATED_90 = MDP_SOURCE_ROTATED_90,
235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_BACKEND_COMPOSITION = MDP_BACKEND_COMPOSITION,
236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_BLEND_FG_PREMULT = MDP_BLEND_FG_PREMULT,
237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_FLIP_H = MDP_FLIP_LR,
238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_FLIP_V = MDP_FLIP_UD,
239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDSS_MDP_RIGHT_MIXER = MDSS_MDP_RIGHT_MIXER,
240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PP_EN = MDP_OVERLAY_PP_CFG_EN,
241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDSS_MDP_BWC_EN = MDP_BWC_EN,
242a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    OV_MDSS_MDP_DUAL_PIPE = MDSS_MDP_DUAL_PIPE,
243a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    OV_MDP_SOLID_FILL = MDP_SOLID_FILL,
244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
246ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eZorder {
247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ZORDER_0 = 0,
248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ZORDER_1,
249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ZORDER_2,
250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ZORDER_3,
251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Z_SYSTEM_ALLOC = 0xFFFF
252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eMdpPipeType {
255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PIPE_RGB = 0,
256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PIPE_VG,
257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PIPE_DMA,
258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MDP_PIPE_ANY, //Any
259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Identify destination pipes
262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// TODO Names useless, replace with int and change all interfaces
263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eDest {
264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P0 = 0,
265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P1,
266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P2,
267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P3,
268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P4,
269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P5,
270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P6,
271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P7,
272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P8,
273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_P9,
274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_INVALID,
275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_MAX = OV_INVALID,
276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* Used when a buffer is split over 2 pipes and sent to display */
279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum {
280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_LEFT_SPLIT = 0,
281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OV_RIGHT_SPLIT,
282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* values for copybit_set_parameter(OVERLAY_TRANSFORM) */
285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eTransform {
286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* No rot */
287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_0 = 0x0,
288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* flip source image horizontally 0x1 */
289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H,
290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* flip source image vertically 0x2 */
291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V,
292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* rotate source image 180 degrees
293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * It is basically bit-or-ed  H | V == 0x3 */
294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180,
295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* rotate source image 90 degrees 0x4 */
296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90,
297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* rotate source image 90 degrees and flip horizontally 0x5 */
298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_ROT_90_FLIP_H = HAL_TRANSFORM_ROT_90 |
299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                      HAL_TRANSFORM_FLIP_H,
300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* rotate source image 90 degrees and flip vertically 0x6 */
301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_ROT_90_FLIP_V = HAL_TRANSFORM_ROT_90 |
302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                      HAL_TRANSFORM_FLIP_V,
303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* rotate source image 270 degrees
304ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * Basically 180 | 90 == 0x7 */
305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270,
306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* rotate invalid like in Transform.h */
307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_TRANSFORM_INV = 0x80
308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum eBlending {
311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_BLENDING_UNDEFINED = 0x0,
312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* No blending */
313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_BLENDING_OPAQUE,
314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* src.rgb + dst.rgb*(1-src_alpha) */
315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_BLENDING_PREMULT,
316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* src.rgb * src_alpha + dst.rgb (1 - src_alpha) */
317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    OVERLAY_BLENDING_COVERAGE,
318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Used to consolidate pipe params
321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct PipeArgs {
322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    PipeArgs() : mdpFlags(OV_MDP_FLAGS_NONE),
323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        zorder(Z_SYSTEM_ALLOC),
324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        isFg(IS_FG_OFF),
325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        rotFlags(ROT_FLAGS_NONE),
326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        planeAlpha(DEFAULT_PLANE_ALPHA),
327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        blending(OVERLAY_BLENDING_COVERAGE){
328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    PipeArgs(eMdpFlags f, Whf _whf,
331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            eZorder z, eIsFg fg, eRotFlags r,
332a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            int pA = DEFAULT_PLANE_ALPHA, eBlending b = OVERLAY_BLENDING_COVERAGE) :
333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mdpFlags(f),
334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        whf(_whf),
335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        zorder(z),
336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        isFg(fg),
337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        rotFlags(r),
338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        planeAlpha(pA),
339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        blending(b){
340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    eMdpFlags mdpFlags; // for mdp_overlay flags
343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Whf whf;
344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    eZorder zorder; // stage number
345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    eIsFg isFg; // control alpha & transp
346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    eRotFlags rotFlags;
347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int planeAlpha;
348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    eBlending blending;
349ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
350ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Cannot use HW_OVERLAY_MAGNIFICATION_LIMIT, since at the time
352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// of integration, HW_OVERLAY_MAGNIFICATION_LIMIT was a define
353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum { HW_OV_MAGNIFICATION_LIMIT = 20,
354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    HW_OV_MINIFICATION_LIMIT  = 8
355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void setMdpFlags(eMdpFlags& f, eMdpFlags v) {
358ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    f = static_cast<eMdpFlags>(setBit(f, v));
359ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void clearMdpFlags(eMdpFlags& f, eMdpFlags v) {
362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    f = static_cast<eMdpFlags>(clrBit(f, v));
363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum { FB0, FB1, FB2 };
366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct ScreenInfo {
368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ScreenInfo() : mFBWidth(0),
369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mFBHeight(0),
370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mFBbpp(0),
371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mFBystride(0) {}
372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump(const char* const s) const;
373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mFBWidth;
374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mFBHeight;
375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mFBbpp;
376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mFBystride;
377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getMdpFormat(int format);
380a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint getMdpFormat(int format, bool tileEnabled);
381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getHALFormat(int mdpFormat);
382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getDownscaleFactor(const int& src_w, const int& src_h,
383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        const int& dst_w, const int& dst_h);
384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDecimationFactor(const int& src_w, const int& src_h,
38574e109a6891def0f55250476bc28aa2098027606Saurabh Shah        const int& dst_w, const int& dst_h, uint8_t& horzDeci,
38674e109a6891def0f55250476bc28aa2098027606Saurabh Shah        uint8_t& vertDeci);
387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
388ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* flip is upside down and such. V, H flip
389ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * rotation is 90, 180 etc
390ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * It returns MDP related enum/define that match rot+flip*/
391ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getMdpOrient(eTransform rotation);
392ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonconst char* getFormatString(int format);
393ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
394ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsontemplate <class T>
395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsoninline void memset0(T& t) { ::memset(&t, 0, sizeof(t)); }
396ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
397ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsontemplate <class T> inline void swap ( T& a, T& b )
398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
399ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    T c(a); a=b; b=c;
400ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int alignup(int value, int a) {
403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //if align = 0, return the value. Else, do alignment.
404ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return a ? ((((value - 1) / a) + 1) * a) : value;
405ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
406ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
407ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int aligndown(int value, int a) {
408ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //if align = 0, return the value. Else, do alignment.
409ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return a ? ((value) & ~(a-1)) : value;
410ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
411ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
412ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// FIXME that align should replace the upper one.
413ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int align(int value, int a) {
414ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //if align = 0, return the value. Else, do alignment.
415ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return a ? ((value + (a-1)) & ~(a-1)) : value;
416ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
417ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
418ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool isYuv(uint32_t format) {
419ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch(format){
420ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CBCR_H2V1:
421ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CBCR_H2V2:
422ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CRCB_H2V2:
423ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CRCB_H1V1:
424ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CRCB_H2V1:
425ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CRCB_H2V2_TILE:
426ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CBCR_H2V2_TILE:
427ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CR_CB_H2V2:
428ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CR_CB_GH2V2:
429ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_Y_CBCR_H2V2_VENUS:
430a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case MDP_YCBYCR_H2V1:
431a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case MDP_YCRYCB_H2V1:
432ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return true;
433ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        default:
434ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return false;
435ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
436ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return false;
437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
438ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
439ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool isRgb(uint32_t format) {
440ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch(format) {
441ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_RGBA_8888:
442ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_BGRA_8888:
443ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_RGBX_8888:
444ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case MDP_RGB_565:
445ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return true;
446ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        default:
447ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return false;
448ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
449ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return false;
450ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
451ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
452ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline const char* getFormatString(int format){
453ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    #define STR(f) #f;
454ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static const char* formats[MDP_IMGTYPE_LIMIT + 1] = {0};
455ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_RGB_565] = STR(MDP_RGB_565);
456ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_XRGB_8888] = STR(MDP_XRGB_8888);
457ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H2V2] = STR(MDP_Y_CBCR_H2V2);
458ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H2V2_ADRENO] = STR(MDP_Y_CBCR_H2V2_ADRENO);
459ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_ARGB_8888] = STR(MDP_ARGB_8888);
460ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_RGB_888] = STR(MDP_RGB_888);
461ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CRCB_H2V2] = STR(MDP_Y_CRCB_H2V2);
462a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_YCBYCR_H2V1] = STR(MDP_YCBYCR_H2V1);
463ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_YCRYCB_H2V1] = STR(MDP_YCRYCB_H2V1);
464ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_CBYCRY_H2V1] = STR(MDP_CBYCRY_H2V1);
465ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CRCB_H2V1] = STR(MDP_Y_CRCB_H2V1);
466ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H2V1] = STR(MDP_Y_CBCR_H2V1);
467ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CRCB_H1V2] = STR(MDP_Y_CRCB_H1V2);
468ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H1V2] = STR(MDP_Y_CBCR_H1V2);
469ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_RGBA_8888] = STR(MDP_RGBA_8888);
470ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_BGRA_8888] = STR(MDP_BGRA_8888);
471ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_RGBX_8888] = STR(MDP_RGBX_8888);
472ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CRCB_H2V2_TILE] = STR(MDP_Y_CRCB_H2V2_TILE);
473ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H2V2_TILE] = STR(MDP_Y_CBCR_H2V2_TILE);
474ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CR_CB_H2V2] = STR(MDP_Y_CR_CB_H2V2);
475ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CR_CB_GH2V2] = STR(MDP_Y_CR_CB_GH2V2);
476ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CB_CR_H2V2] = STR(MDP_Y_CB_CR_H2V2);
477ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CRCB_H1V1] = STR(MDP_Y_CRCB_H1V1);
478ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H1V1] = STR(MDP_Y_CBCR_H1V1);
479ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_YCRCB_H1V1] = STR(MDP_YCRCB_H1V1);
480ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_YCBCR_H1V1] = STR(MDP_YCBCR_H1V1);
481ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_BGR_565] = STR(MDP_BGR_565);
482ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_BGR_888] = STR(MDP_BGR_888);
483ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_Y_CBCR_H2V2_VENUS] = STR(MDP_Y_CBCR_H2V2_VENUS);
484ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_BGRX_8888] = STR(MDP_BGRX_8888);
485a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_RGBA_8888_TILE] = STR(MDP_RGBA_8888_TILE);
486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_ARGB_8888_TILE] = STR(MDP_ARGB_8888_TILE);
487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_ABGR_8888_TILE] = STR(MDP_ABGR_8888_TILE);
488a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_BGRA_8888_TILE] = STR(MDP_BGRA_8888_TILE);
489a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_RGBX_8888_TILE] = STR(MDP_RGBX_8888_TILE);
490a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_XRGB_8888_TILE] = STR(MDP_XRGB_8888_TILE);
491a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_XBGR_8888_TILE] = STR(MDP_XBGR_8888_TILE);
492a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_BGRX_8888_TILE] = STR(MDP_BGRX_8888_TILE);
493a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    formats[MDP_RGB_565_TILE] = STR(MDP_RGB_565_TILE);
494ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    formats[MDP_IMGTYPE_LIMIT] = STR(MDP_IMGTYPE_LIMIT);
495ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
496ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(format < 0 || format >= MDP_IMGTYPE_LIMIT) {
497ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s wrong fmt %d", __FUNCTION__, format);
498ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return "Unsupported format";
499ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
500ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(formats[format] == 0) {
501ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: table missing format %d from header", __FUNCTION__, format);
502ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return "";
503ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
504ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return formats[format];
505ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
506ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
507ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void Whf::dump() const {
508ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGE("== Dump WHF w=%d h=%d f=%d s=%d start/end ==",
509ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            w, h, format, size);
510ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
511ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
512ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void Dim::dump() const {
513ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGE("== Dump Dim x=%d y=%d w=%d h=%d start/end ==", x, y, w, h);
514ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
515ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
516ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsontemplate <class Type>
517ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid swapWidthHeight(Type& width, Type& height) {
518ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Type tmp = width;
519ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    width = height;
520ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    height = tmp;
521ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
522ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
523ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void ScreenInfo::dump(const char* const s) const {
524ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGE("== Dump %s ScreenInfo w=%d h=%d"
525ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            " bpp=%d stride=%d start/end ==",
526ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            s, mFBWidth, mFBHeight, mFBbpp, mFBystride);
527ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
528ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
529ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool openDev(OvFD& fd, int fbnum,
530ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const char* const devpath, int flags) {
531ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return overlay::open(fd, fbnum, devpath, flags);
532ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
533ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
534ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsontemplate <class T>
535ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void even_ceil(T& value) {
536ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(value & 1)
537ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        value++;
538ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
539ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
540ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsontemplate <class T>
541ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void even_floor(T& value) {
542ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(value & 1)
543ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        value--;
544ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
545ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
546c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah/* Prerotation adjusts crop co-ordinates to the new transformed values within
547c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah * destination buffer. This is necessary only when the entire buffer is rotated
548c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah * irrespective of crop (A-family). If only the crop portion of the buffer is
549c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah * rotated into a destination buffer matching the size of crop, we don't need to
550c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah * use this helper (B-family).
551c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah * @Deprecated as of now, retained for the case where a full buffer needs
552c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah * transform and also as a reference.
553c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah */
554ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid preRotateSource(const eTransform& tr, Whf& whf, Dim& srcCrop);
555ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, const mdp_overlay& ov);
556ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, const msmfb_img& ov);
557ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, const mdp_rect& ov);
558ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix,
559ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        const msmfb_overlay_data& ov);
560ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, const msmfb_data& ov);
561ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix,
562ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        const msm_rotator_img_info& ov);
563ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix,
564ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        const msm_rotator_data_info& ov);
565ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
566ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // namespace utils ends
567ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
568ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//--------------------Class Res stuff (namespace overlay only) -----------
569ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
570ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass Res {
571ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
572ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // /dev/graphics/fb%u
573ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static const char* const fbPath;
574ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // /dev/msm_rotator
575ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static const char* const rotPath;
576ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
577ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
578ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
579ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//--------------------Class OvFD stuff (namespace overlay only) -----------
580ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
581ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
582ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Holds one FD
583ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Dtor will NOT close the underlying FD.
584ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* That enables us to copy that object around
585ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* */
586ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass OvFD {
587ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
588ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Ctor */
589ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    explicit OvFD();
590ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
591ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dtor will NOT close the underlying FD */
592ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ~OvFD();
593ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
594ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Open fd using the path given by dev.
595ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * return false in failure */
596ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool open(const char* const dev,
597ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            int flags = O_RDWR);
598ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
599ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* populate path */
600ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void setPath(const char* const dev);
601ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
602ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Close fd if we have a valid fd. */
603ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool close();
604ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
605ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns underlying fd.*/
606ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getFD() const;
607ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
608ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* returns true if fd is valid */
609ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool valid() const;
610ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
611ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* like operator= */
612ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void copy(int fd);
613ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
614ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dump the state of the instance */
615ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void dump() const;
616ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
617ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* helper enum for determine valid/invalid fd */
618ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    enum { INVAL = -1 };
619ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
620ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* actual os fd */
621ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mFD;
622ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
623ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* path, for debugging */
624ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    char mPath[utils::MAX_PATH_LEN];
625ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
626ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
627ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//-------------------Inlines--------------------------
628ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
629ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool open(OvFD& fd, uint32_t fbnum, const char* const dev, int flags)
630ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
631ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    char dev_name[64] = {0};
632ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    snprintf(dev_name, sizeof(dev_name), dev, fbnum);
633ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return fd.open(dev_name, flags);
634ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
635ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
636ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline OvFD::OvFD() : mFD (INVAL) {
637ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mPath[0] = 0;
638ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
639ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
640ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline OvFD::~OvFD() {
641ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //no op since copy() can be used to share fd, in 3d cases.
642ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
643ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
644ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool OvFD::open(const char* const dev, int flags)
645ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
646ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mFD = ::open(dev, flags, 0);
647ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (mFD < 0) {
648ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        // FIXME errno, strerror in bionic?
649ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("Cant open device %s err=%d", dev, errno);
650ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return false;
651ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
652ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    setPath(dev);
653ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return true;
654ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
655ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
656ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void OvFD::setPath(const char* const dev)
657ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
658a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ::strlcpy(mPath, dev, sizeof(mPath));
659ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
660ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
661ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool OvFD::close()
662ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
663ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
664ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(valid()) {
665ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ret = ::close(mFD);
666ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mFD = INVAL;
667ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
668ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return (ret == 0);
669ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
670ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
671ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline bool OvFD::valid() const
672ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
673ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return (mFD != INVAL);
674ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
675ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
676ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline int OvFD::getFD() const { return mFD; }
677ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
678ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void OvFD::copy(int fd) {
679ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mFD = fd;
680ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
681ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
682ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsoninline void OvFD::dump() const
683ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
684ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGE("== Dump OvFD fd=%d path=%s start/end ==",
685ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            mFD, mPath);
686ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
687ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
688ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//--------------- class OvFD stuff ends ---------------------
689ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
690ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // overlay
691ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
692ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
693ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif // OVERLAY_UTILS_H
694