1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Redistribution and use in source and binary forms, with or without
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* modification, are permitted provided that the following conditions are
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* met:
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*    * Redistributions of source code must retain the above copyright
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      notice, this list of conditions and the following disclaimer.
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*    * Redistributions in binary form must reproduce the above
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      copyright notice, this list of conditions and the following
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      disclaimer in the documentation and/or other materials provided
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      with the distribution.
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*    * Neither the name of The Linux Foundation nor the names of its
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      contributors may be used to endorse or promote products derived
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      from this software without specific prior written permission.
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*/
29b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifndef OVERLAY_UTILS_H
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define OVERLAY_UTILS_H
32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <cutils/log.h> // ALOGE, etc
34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <errno.h>
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <fcntl.h> // open, O_RDWR, etc
36b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <hardware/hardware.h>
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <hardware/gralloc.h> // buffer_handle_t
38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <linux/msm_mdp.h> // flags
39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <linux/msm_rotator.h>
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <stdio.h>
41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <stdlib.h>
42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <string.h>
43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/stat.h>
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/types.h>
45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <utils/Log.h>
46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "gralloc_priv.h" //for interlace
47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Older platforms do not support Venus.
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifndef VENUS_COLOR_FORMAT
50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define MDP_Y_CBCR_H2V2_VENUS (MDP_IMGTYPE_LIMIT2 + 1)
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Collection of utilities functions/structs/enums etc...
56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* */
58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// comment that out if you want to remove asserts
60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// or put it as -D in Android.mk. your choice.
61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define OVERLAY_HAS_ASSERT
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifdef OVERLAY_HAS_ASSERT
64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby# define OVASSERT(x, ...) if(!(x)) { ALOGE(__VA_ARGS__); abort(); }
65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#else
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby# define OVASSERT(x, ...) ALOGE_IF(!(x), __VA_ARGS__)
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif // OVERLAY_HAS_ASSERT
68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define DEBUG_OVERLAY 0
70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define PROFILE_OVERLAY 0
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifndef MDSS_MDP_RIGHT_MIXER
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define MDSS_MDP_RIGHT_MIXER 0x100
74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifndef MDP_OV_PIPE_FORCE_DMA
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define MDP_OV_PIPE_FORCE_DMA 0x4000
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define FB_DEVICE_TEMPLATE "/dev/graphics/fb%u"
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define NUM_FB_DEVICES 3
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
83b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace overlay {
84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// fwd
86b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass Overlay;
87b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass OvFD;
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* helper function to open by using fbnum */
90b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool open(OvFD& fd, uint32_t fbnum, const char* const dev,
91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int flags = O_RDWR);
92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
93b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace utils {
94b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct Whf;
95b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct Dim;
96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
97b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline uint32_t setBit(uint32_t x, uint32_t mask) {
98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (x | mask);
99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
101b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline uint32_t clrBit(uint32_t x, uint32_t mask) {
102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (x & ~mask);
103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* Utility class to help avoid copying instances by making the copy ctor
106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* and assignment operator private
107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Usage:
109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*    class SomeClass : utils::NoCopy {...};
110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*/
111b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass NoCopy {
112b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyprotected:
113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    NoCopy(){}
114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ~NoCopy() {}
115b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyprivate:
116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    NoCopy(const NoCopy&);
117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    const NoCopy& operator=(const NoCopy&);
118b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* 3D related utils, defines etc...
122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * The compound format passed to the overlay is
123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * ABCCC where A is the input 3D format
124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * B is the output 3D format
125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * CCC is the color format e.g YCbCr420SP YCrCb420SP etc */
126b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { SHIFT_OUT_3D = 12,
127b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    SHIFT_TOT_3D = 16 };
128b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { INPUT_3D_MASK = 0xFFFF0000,
129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OUTPUT_3D_MASK = 0x0000FFFF };
130b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { BARRIER_LAND = 1,
131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    BARRIER_PORT = 2 };
132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
133b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline uint32_t format3D(uint32_t x) { return x & 0xFF000; }
134b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline uint32_t format3DOutput(uint32_t x) {
135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (x & 0xF000) >> SHIFT_OUT_3D; }
136b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline uint32_t format3DInput(uint32_t x) { return x & 0xF0000; }
137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
138b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool isHDMIConnected ();
139b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool is3DTV();
140b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool isPanel3D();
141b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool usePanel3D();
142b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool send3DInfoPacket (uint32_t fmt);
143b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool enableBarrier (uint32_t orientation);
144b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t getS3DFormat(uint32_t fmt);
145b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool isMdssRotator();
146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
147b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int CHAN>
148b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool getPositionS3D(const Whf& whf, Dim& out);
149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
150b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int CHAN>
151b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool getCropS3D(const Dim& in, Dim& out, uint32_t fmt);
152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
153b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <class Type>
154b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid swapWidthHeight(Type& width, Type& height);
155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
156b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct Dim {
157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Dim () : x(0), y(0),
158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    w(0), h(0),
159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    o(0) {}
160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Dim(uint32_t _x, uint32_t _y, uint32_t _w, uint32_t _h) :
161b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        x(_x), y(_y),
162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        w(_w), h(_h) {}
163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Dim(uint32_t _x, uint32_t _y, uint32_t _w, uint32_t _h, uint32_t _o) :
164b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        x(_x), y(_y),
165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        w(_w), h(_h),
166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        o(_o) {}
167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool check(uint32_t _w, uint32_t _h) const {
168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return (x+w <= _w && y+h <= _h);
169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool operator==(const Dim& d) const {
173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return d.x == x && d.y == y &&
174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                d.w == w && d.h == h &&
175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                d.o == o;
176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool operator!=(const Dim& d) const {
179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return !operator==(d);
180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
182b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void dump() const;
183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t x;
184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t y;
185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t w;
186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t h;
187b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t o;
188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// TODO have Whfz
191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
192b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct Whf {
193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Whf() : w(0), h(0), format(0), size(0) {}
194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Whf(uint32_t wi, uint32_t he, uint32_t f) :
195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        w(wi), h(he), format(f), size(0) {}
196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Whf(uint32_t wi, uint32_t he, uint32_t f, uint32_t s) :
197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        w(wi), h(he), format(f), size(s) {}
198b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // FIXME not comparing size at the moment
199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool operator==(const Whf& whf) const {
200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return whf.w == w && whf.h == h &&
201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                whf.format == format;
202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool operator!=(const Whf& whf) const {
204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return !operator==(whf);
205b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void dump() const;
207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t w;
208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t h;
209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t format;
210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t size;
211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
213b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { MAX_PATH_LEN = 256 };
214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
215b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { DEFAULT_PLANE_ALPHA = 0xFF };
216b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/**
218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Rotator flags: not to be confused with orientation flags.
219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Usually, you want to open the rotator to make sure it is
220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * ready for business.
221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * */
222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby enum eRotFlags {
223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_FLAGS_NONE = 0,
224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Use rotator for 0 rotation. It is used anyway for others.
225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_0_ENABLED = 1 << 0,
226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Enable rotator downscale optimization for hardware bugs not handled in
227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //driver. If downscale optimizatation is required,
228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //then rotator will be used even if its 0 rotation case.
229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_DOWNSCALE_ENABLED = 1 << 1,
230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_PREROTATED = 1 << 2,
231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
233b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eRotDownscale {
234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_DS_NONE = 0,
235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_DS_HALF = 1,
236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_DS_FOURTH = 2,
237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_DS_EIGHTH = 3,
238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* The values for is_fg flag for control alpha and transp
241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * IS_FG_OFF means is_fg = 0
242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * IS_FG_SET means is_fg = 1
243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */
244b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eIsFg {
245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    IS_FG_OFF = 0,
246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    IS_FG_SET = 1
247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
249b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Various mdp flags like PIPE SHARE, DEINTERLACE etc...
251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * kernel/common/linux/msm_mdp.h
252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * INTERLACE_MASK: hardware/qcom/display/libgralloc/badger/fb_priv.h
253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * */
254b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eMdpFlags {
255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_FLAGS_NONE = 0,
256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PIPE_SHARE =  MDP_OV_PIPE_SHARE,
257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PIPE_FORCE_DMA = MDP_OV_PIPE_FORCE_DMA,
258b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_DEINTERLACE = MDP_DEINTERLACE,
259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_SECURE_OVERLAY_SESSION = MDP_SECURE_OVERLAY_SESSION,
260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_SOURCE_ROTATED_90 = MDP_SOURCE_ROTATED_90,
261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_BACKEND_COMPOSITION = MDP_BACKEND_COMPOSITION,
262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_BLEND_FG_PREMULT = MDP_BLEND_FG_PREMULT,
263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_FLIP_H = MDP_FLIP_LR,
264b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_FLIP_V = MDP_FLIP_UD,
265b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDSS_MDP_RIGHT_MIXER = MDSS_MDP_RIGHT_MIXER,
266b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PP_EN = MDP_OVERLAY_PP_CFG_EN,
267b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
268b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
269b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eZorder {
270b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ZORDER_0 = 0,
271b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ZORDER_1,
272b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ZORDER_2,
273b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ZORDER_3,
274b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Z_SYSTEM_ALLOC = 0xFFFF
275b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
276b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
277b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eMdpPipeType {
278b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PIPE_RGB = 0,
279b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PIPE_VG,
280b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PIPE_DMA,
281b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MDP_PIPE_ANY, //Any
282b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
283b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
284b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Identify destination pipes
285b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// TODO Names useless, replace with int and change all interfaces
286b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eDest {
287b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P0 = 0,
288b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P1,
289b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P2,
290b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P3,
291b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P4,
292b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P5,
293b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P6,
294b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P7,
295b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P8,
296b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_P9,
297b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_INVALID,
298b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_MAX = OV_INVALID,
299b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
300b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
301b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* Used when a buffer is split over 2 pipes and sent to display */
302b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum {
303b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_LEFT_SPLIT = 0,
304b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OV_RIGHT_SPLIT,
305b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
306b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
307b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* values for copybit_set_parameter(OVERLAY_TRANSFORM) */
308b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eTransform {
309b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* No rot */
310b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_0 = 0x0,
311b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* flip source image horizontally 0x1 */
312b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H,
313b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* flip source image vertically 0x2 */
314b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V,
315b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* rotate source image 180 degrees
316b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     * It is basically bit-or-ed  H | V == 0x3 */
317b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180,
318b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* rotate source image 90 degrees 0x4 */
319b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90,
320b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* rotate source image 90 degrees and flip horizontally 0x5 */
321b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_ROT_90_FLIP_H = HAL_TRANSFORM_ROT_90 |
322b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                      HAL_TRANSFORM_FLIP_H,
323b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* rotate source image 90 degrees and flip vertically 0x6 */
324b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_ROT_90_FLIP_V = HAL_TRANSFORM_ROT_90 |
325b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                      HAL_TRANSFORM_FLIP_V,
326b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* rotate source image 270 degrees
327b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     * Basically 180 | 90 == 0x7 */
328b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270,
329b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* rotate invalid like in Transform.h */
330b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_TRANSFORM_INV = 0x80
331b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
332b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
333b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eBlending {
334b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_BLENDING_UNDEFINED = 0x0,
335b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* No blending */
336b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_BLENDING_OPAQUE,
337b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* src.rgb + dst.rgb*(1-src_alpha) */
338b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_BLENDING_PREMULT,
339b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* src.rgb * src_alpha + dst.rgb (1 - src_alpha) */
340b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVERLAY_BLENDING_COVERAGE,
341b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
342b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
343b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Used to consolidate pipe params
344b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct PipeArgs {
345b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    PipeArgs() : mdpFlags(OV_MDP_FLAGS_NONE),
346b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        zorder(Z_SYSTEM_ALLOC),
347b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        isFg(IS_FG_OFF),
348b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        rotFlags(ROT_FLAGS_NONE),
349b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        planeAlpha(DEFAULT_PLANE_ALPHA),
350b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        blending(OVERLAY_BLENDING_COVERAGE){
351b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
352b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
353b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    PipeArgs(eMdpFlags f, Whf _whf,
354b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            eZorder z, eIsFg fg, eRotFlags r,
355b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            int pA, eBlending b) :
356b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mdpFlags(f),
357b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        whf(_whf),
358b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        zorder(z),
359b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        isFg(fg),
360b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        rotFlags(r),
361b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        planeAlpha(pA),
362b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        blending(b){
363b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
364b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
365b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    eMdpFlags mdpFlags; // for mdp_overlay flags
366b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Whf whf;
367b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    eZorder zorder; // stage number
368b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    eIsFg isFg; // control alpha & transp
369b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    eRotFlags rotFlags;
370b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int planeAlpha;
371b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    eBlending blending;
372b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
373b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
374b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Cannot use HW_OVERLAY_MAGNIFICATION_LIMIT, since at the time
375b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// of integration, HW_OVERLAY_MAGNIFICATION_LIMIT was a define
376b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { HW_OV_MAGNIFICATION_LIMIT = 20,
377b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HW_OV_MINIFICATION_LIMIT  = 8
378b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
379b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
380b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void setMdpFlags(eMdpFlags& f, eMdpFlags v) {
381b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    f = static_cast<eMdpFlags>(setBit(f, v));
382b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
383b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
384b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void clearMdpFlags(eMdpFlags& f, eMdpFlags v) {
385b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    f = static_cast<eMdpFlags>(clrBit(f, v));
386b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
387b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
388b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// fb 0/1/2
389b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { FB0, FB1, FB2 };
390b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
391b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//Panels could be categorized as primary and external
392b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { PRIMARY, EXTERNAL };
393b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
394b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// 2 for rgb0/1 double bufs
395b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { RGB_PIPE_NUM_BUFS = 2 };
396b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
397b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct ScreenInfo {
398b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ScreenInfo() : mFBWidth(0),
399b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFBHeight(0),
400b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFBbpp(0),
401b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFBystride(0) {}
402b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void dump(const char* const s) const;
403b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t mFBWidth;
404b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t mFBHeight;
405b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t mFBbpp;
406b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t mFBystride;
407b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
408b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
409b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint getMdpFormat(int format);
410b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint getHALFormat(int mdpFormat);
411b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint getDownscaleFactor(const int& src_w, const int& src_h,
412b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        const int& dst_w, const int& dst_h);
413b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
414b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* flip is upside down and such. V, H flip
415b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * rotation is 90, 180 etc
416b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * It returns MDP related enum/define that match rot+flip*/
417b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint getMdpOrient(eTransform rotation);
418b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyconst char* getFormatString(int format);
419b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
420b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <class T>
421b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void memset0(T& t) { ::memset(&t, 0, sizeof(T)); }
422b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
423b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <class T> inline void swap ( T& a, T& b )
424b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
425b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    T c(a); a=b; b=c;
426b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
427b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
428b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int alignup(int value, int a) {
429b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //if align = 0, return the value. Else, do alignment.
430b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return a ? ((((value - 1) / a) + 1) * a) : value;
431b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
432b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
433b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int aligndown(int value, int a) {
434b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //if align = 0, return the value. Else, do alignment.
435b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return a ? ((value) & ~(a-1)) : value;
436b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
437b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
438b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// FIXME that align should replace the upper one.
439b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int align(int value, int a) {
440b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //if align = 0, return the value. Else, do alignment.
441b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return a ? ((value + (a-1)) & ~(a-1)) : value;
442b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
443b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
444b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum eRotOutFmt {
445b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_OUT_FMT_DEFAULT,
446b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ROT_OUT_FMT_Y_CRCB_H2V2
447b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
448b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
449b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int ROT_OUT_FMT> struct RotOutFmt;
450b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
451b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// FIXME, taken from gralloc_priv.h. Need to
452b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// put it back as soon as overlay takes place of the old one
453b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* possible formats for 3D content*/
454b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum {
455b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_NO_3D                         = 0x0000,
456b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_IN_SIDE_BY_SIDE_L_R        = 0x10000,
457b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_IN_TOP_BOTTOM              = 0x20000,
458b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_IN_INTERLEAVE              = 0x40000,
459b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_IN_SIDE_BY_SIDE_R_L        = 0x80000,
460b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_SIDE_BY_SIDE           = 0x1000,
461b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_TOP_BOTTOM             = 0x2000,
462b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_INTERLEAVE             = 0x4000,
463b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_MONOSCOPIC             = 0x8000
464b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
465b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
466b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyenum { HAL_3D_OUT_SBS_MASK =
467b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_SIDE_BY_SIDE >> overlay::utils::SHIFT_OUT_3D,
468b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_TOP_BOT_MASK =
469b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            HAL_3D_OUT_TOP_BOTTOM >> overlay::utils::SHIFT_OUT_3D,
470b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_INTERL_MASK =
471b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            HAL_3D_OUT_INTERLEAVE >> overlay::utils::SHIFT_OUT_3D,
472b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    HAL_3D_OUT_MONOS_MASK =
473b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            HAL_3D_OUT_MONOSCOPIC >> overlay::utils::SHIFT_OUT_3D
474b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
475b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
476b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
477b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool isYuv(uint32_t format) {
478b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch(format){
479b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CBCR_H2V1:
480b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CBCR_H2V2:
481b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CRCB_H2V2:
482b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CRCB_H1V1:
483b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CRCB_H2V1:
484b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CRCB_H2V2_TILE:
485b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CBCR_H2V2_TILE:
486b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CR_CB_H2V2:
487b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CR_CB_GH2V2:
488b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_Y_CBCR_H2V2_VENUS:
489b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return true;
490b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
491b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
492b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
493b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return false;
494b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
495b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
496b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool isRgb(uint32_t format) {
497b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch(format) {
498b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_RGBA_8888:
499b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_BGRA_8888:
500b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_RGBX_8888:
501b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case MDP_RGB_565:
502b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return true;
503b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
504b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
505b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
506b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return false;
507b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
508b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
509b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline const char* getFormatString(int format){
510b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    static const char* const formats[] = {
511b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_RGB_565",
512b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_XRGB_8888",
513b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H2V2",
514b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H2V2_ADRENO",
515b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_ARGB_8888",
516b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_RGB_888",
517b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CRCB_H2V2",
518b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_YCRYCB_H2V1",
519b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CRCB_H2V1",
520b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H2V1",
521b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CRCB_H1V2",
522b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H1V2",
523b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_RGBA_8888",
524b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_BGRA_8888",
525b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_RGBX_8888",
526b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CRCB_H2V2_TILE",
527b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H2V2_TILE",
528b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CR_CB_H2V2",
529b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CR_CB_GH2V2",
530b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CB_CR_H2V2",
531b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CRCB_H1V1",
532b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H1V1",
533b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_YCRCB_H1V1",
534b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_YCBCR_H1V1",
535b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_BGR_565",
536b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_BGR_888",
537b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_Y_CBCR_H2V2_VENUS",
538b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_IMGTYPE_LIMIT",
539b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_RGB_BORDERFILL",
540b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_FB_FORMAT",
541b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        "MDP_IMGTYPE_LIMIT2"
542b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    };
543b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(format < 0 || format >= (int)(sizeof(formats) / sizeof(formats[0]))) {
544b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("%s wrong fmt %d", __FUNCTION__, format);
545b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return "Unsupported format";
546b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
547b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return formats[format];
548b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
549b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
550b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Whf::dump() const {
551b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump WHF w=%d h=%d f=%d s=%d start/end ==",
552b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            w, h, format, size);
553b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
554b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
555b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Dim::dump() const {
556b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump Dim x=%d y=%d w=%d h=%d start/end ==", x, y, w, h);
557b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
558b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
559b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int getMdpOrient(eTransform rotation) {
560b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE_IF(DEBUG_OVERLAY, "%s: rot=%d", __FUNCTION__, rotation);
561b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch(rotation)
562b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    {
563b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_0 : return 0;
564b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_FLIP_V:  return MDP_FLIP_UD;
565b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_FLIP_H:  return MDP_FLIP_LR;
566b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_ROT_90:  return MDP_ROT_90;
567b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //getMdpOrient will switch the flips if the source is 90 rotated.
568b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //Clients in Android dont factor in 90 rotation while deciding flip.
569b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_ROT_90_FLIP_V:
570b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                return MDP_ROT_90 | MDP_FLIP_LR;
571b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_ROT_90_FLIP_H:
572b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                return MDP_ROT_90 | MDP_FLIP_UD;
573b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_ROT_180: return MDP_ROT_180;
574b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case OVERLAY_TRANSFORM_ROT_270: return MDP_ROT_270;
575b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
576b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: invalid rotation value (value = 0x%x",
577b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                    __FUNCTION__, rotation);
578b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
579b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return -1;
580b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
581b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
582b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// FB0
583b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int CHAN>
584b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline Dim getPositionS3DImpl(const Whf& whf)
585b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
586b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch (whf.format & OUTPUT_3D_MASK)
587b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    {
588b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_SBS_MASK:
589b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            // x, y, w, h
590b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, 0, whf.w/2, whf.h);
591b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_TOP_BOT_MASK:
592b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, 0, whf.w, whf.h/2);
593b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_MONOS_MASK:
594b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim();
595b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_INTERL_MASK:
596b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            // FIXME error?
597b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s HAL_3D_OUT_INTERLEAVE_MASK", __FUNCTION__);
598b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim();
599b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
600b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s Unsupported 3D output format %d", __FUNCTION__,
601b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                    whf.format);
602b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
603b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return Dim();
604b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
605b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
606b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <>
607b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline Dim getPositionS3DImpl<utils::OV_RIGHT_SPLIT>(const Whf& whf)
608b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
609b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch (whf.format & OUTPUT_3D_MASK)
610b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    {
611b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_SBS_MASK:
612b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(whf.w/2, 0, whf.w/2, whf.h);
613b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_TOP_BOT_MASK:
614b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, whf.h/2, whf.w, whf.h/2);
615b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_MONOS_MASK:
616b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, 0, whf.w, whf.h);
617b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_OUT_INTERL_MASK:
618b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            // FIXME error?
619b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s HAL_3D_OUT_INTERLEAVE_MASK", __FUNCTION__);
620b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim();
621b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
622b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s Unsupported 3D output format %d", __FUNCTION__,
623b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                    whf.format);
624b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
625b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return Dim();
626b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
627b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
628b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int CHAN>
629b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool getPositionS3D(const Whf& whf, Dim& out) {
630b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    out = getPositionS3DImpl<CHAN>(whf);
631b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (out != Dim());
632b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
633b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
634b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int CHAN>
635b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline Dim getCropS3DImpl(const Dim& in, uint32_t fmt) {
636b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch (fmt & INPUT_3D_MASK)
637b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    {
638b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_SIDE_BY_SIDE_L_R:
639b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, 0, in.w/2, in.h);
640b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_SIDE_BY_SIDE_R_L:
641b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(in.w/2, 0, in.w/2, in.h);
642b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_TOP_BOTTOM:
643b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, 0, in.w, in.h/2);
644b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_INTERLEAVE:
645b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s HAL_3D_IN_INTERLEAVE", __FUNCTION__);
646b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            break;
647b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
648b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s Unsupported 3D format %d", __FUNCTION__, fmt);
649b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            break;
650b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
651b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return Dim();
652b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
653b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
654b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <>
655b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline Dim getCropS3DImpl<utils::OV_RIGHT_SPLIT>(const Dim& in, uint32_t fmt) {
656b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    switch (fmt & INPUT_3D_MASK)
657b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    {
658b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_SIDE_BY_SIDE_L_R:
659b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(in.w/2, 0, in.w/2, in.h);
660b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_SIDE_BY_SIDE_R_L:
661b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, 0, in.w/2, in.h);
662b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_TOP_BOTTOM:
663b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return Dim(0, in.h/2, in.w, in.h/2);
664b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        case HAL_3D_IN_INTERLEAVE:
665b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s HAL_3D_IN_INTERLEAVE", __FUNCTION__);
666b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            break;
667b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        default:
668b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s Unsupported 3D format %d", __FUNCTION__, fmt);
669b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            break;
670b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
671b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return Dim();
672b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
673b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
674b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <int CHAN>
675b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool getCropS3D(const Dim& in, Dim& out, uint32_t fmt)
676b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
677b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    out = getCropS3DImpl<CHAN>(in, fmt);
678b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (out != Dim());
679b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
680b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
681b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <class Type>
682b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid swapWidthHeight(Type& width, Type& height) {
683b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    Type tmp = width;
684b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    width = height;
685b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    height = tmp;
686b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
687b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
688b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void ScreenInfo::dump(const char* const s) const {
689b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump %s ScreenInfo w=%d h=%d"
690b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            " bpp=%d stride=%d start/end ==",
691b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            s, mFBWidth, mFBHeight, mFBbpp, mFBystride);
692b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
693b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
694b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool openDev(OvFD& fd, int fbnum,
695b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    const char* const devpath, int flags) {
696b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return overlay::open(fd, fbnum, devpath, flags);
697b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
698b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
699b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <class T>
700b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void even_ceil(T& value) {
701b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(value & 1)
702b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        value++;
703b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
704b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
705b166940edca6e312463461438e2aa66e9852c26aBenoit Gobytemplate <class T>
706b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void even_floor(T& value) {
707b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(value & 1)
708b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        value--;
709b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
710b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
711b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid preRotateSource(const eTransform& tr, Whf& whf, Dim& srcCrop);
712b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix, const mdp_overlay& ov);
713b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix, const msmfb_img& ov);
714b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix, const mdp_rect& ov);
715b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix,
716b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        const msmfb_overlay_data& ov);
717b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix, const msmfb_data& ov);
718b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix,
719b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        const msm_rotator_img_info& ov);
720b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid getDump(char *buf, size_t len, const char *prefix,
721b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        const msm_rotator_data_info& ov);
722b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
723b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} // namespace utils ends
724b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
725b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//--------------------Class Res stuff (namespace overlay only) -----------
726b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
727b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass Res {
728b166940edca6e312463461438e2aa66e9852c26aBenoit Gobypublic:
729b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // /dev/graphics/fb%u
730b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    static const char* const fbPath;
731b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // /dev/msm_rotator
732b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    static const char* const rotPath;
733b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // /sys/class/graphics/fb1/format_3d
734b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    static const char* const format3DFile;
735b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // /sys/class/graphics/fb1/3d_present
736b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    static const char* const edid3dInfoFile;
737b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // /sys/devices/platform/mipi_novatek.0/enable_3d_barrier
738b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    static const char* const barrierFile;
739b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
740b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
741b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
742b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//--------------------Class OvFD stuff (namespace overlay only) -----------
743b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
744b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
745b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Holds one FD
746b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Dtor will NOT close the underlying FD.
747b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* That enables us to copy that object around
748b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* */
749b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass OvFD {
750b166940edca6e312463461438e2aa66e9852c26aBenoit Gobypublic:
751b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* Ctor */
752b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    explicit OvFD();
753b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
754b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* dtor will NOT close the underlying FD */
755b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ~OvFD();
756b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
757b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* Open fd using the path given by dev.
758b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     * return false in failure */
759b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool open(const char* const dev,
760b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            int flags = O_RDWR);
761b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
762b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* populate path */
763b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void setPath(const char* const dev);
764b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
765b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* Close fd if we have a valid fd. */
766b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool close();
767b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
768b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* returns underlying fd.*/
769b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int getFD() const;
770b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
771b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* returns true if fd is valid */
772b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool valid() const;
773b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
774b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* like operator= */
775b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void copy(int fd);
776b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
777b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* dump the state of the instance */
778b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void dump() const;
779b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyprivate:
780b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* helper enum for determine valid/invalid fd */
781b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    enum { INVAL = -1 };
782b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
783b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* actual os fd */
784b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int mFD;
785b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
786b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* path, for debugging */
787b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    char mPath[utils::MAX_PATH_LEN];
788b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
789b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
790b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//-------------------Inlines--------------------------
791b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
792b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool open(OvFD& fd, uint32_t fbnum, const char* const dev, int flags)
793b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
794b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    char dev_name[64] = {0};
795b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    snprintf(dev_name, sizeof(dev_name), dev, fbnum);
796b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return fd.open(dev_name, flags);
797b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
798b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
799b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline OvFD::OvFD() : mFD (INVAL) {
800b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mPath[0] = 0;
801b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
802b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
803b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline OvFD::~OvFD() {
804b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //no op since copy() can be used to share fd, in 3d cases.
805b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
806b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
807b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool OvFD::open(const char* const dev, int flags)
808b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
809b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFD = ::open(dev, flags, 0);
810b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (mFD < 0) {
811b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // FIXME errno, strerror in bionic?
812b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("Cant open device %s err=%d", dev, errno);
813b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
814b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
815b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setPath(dev);
816b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
817b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
818b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
819b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void OvFD::setPath(const char* const dev)
820b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
821b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ::strncpy(mPath, dev, utils::MAX_PATH_LEN);
822b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
823b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
824b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool OvFD::close()
825b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
826b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int ret = 0;
827b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(valid()) {
828b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ret = ::close(mFD);
829b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mFD = INVAL;
830b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
831b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (ret == 0);
832b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
833b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
834b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool OvFD::valid() const
835b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
836b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (mFD != INVAL);
837b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
838b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
839b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int OvFD::getFD() const { return mFD; }
840b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
841b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void OvFD::copy(int fd) {
842b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFD = fd;
843b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
844b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
845b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void OvFD::dump() const
846b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
847b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump OvFD fd=%d path=%s start/end ==",
848b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mFD, mPath);
849b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
850b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
851b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//--------------- class OvFD stuff ends ---------------------
852b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
853b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} // overlay
854b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
855b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
856b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif // OVERLAY_UTILS_H
857