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