1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Redistribution and use in source and binary forms, with or without 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* modification, are permitted provided that the following conditions are 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* met: 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* * Redistributions of source code must retain the above copyright 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* notice, this list of conditions and the following disclaimer. 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* * Redistributions in binary form must reproduce the above 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* copyright notice, this list of conditions and the following 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* disclaimer in the documentation and/or other materials provided 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* with the distribution. 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* * Neither the name of The Linux Foundation. nor the names of its 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* contributors may be used to endorse or promote products derived 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* from this software without specific prior written permission. 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/ 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef OVERLAY_H 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define OVERLAY_H 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayUtils.h" 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "mdp_version.h" 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "utils/threads.h" 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "lib-postproc.h" 38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct MetaData_t; 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace overlay { 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass GenericPipe; 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass Overlay : utils::NoCopy { 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic: 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { DMA_BLOCK_MODE, DMA_LINE_MODE }; 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Abstract Display types. Each backed by a LayerMixer, 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //represented by a fb node. 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //High res panels can be backed by 2 layer mixers and a single fb node. 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { DPY_PRIMARY, DPY_EXTERNAL, DPY_WRITEBACK, DPY_UNUSED }; 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { DPY_MAX = DPY_UNUSED }; 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { MIXER_LEFT, MIXER_RIGHT, MIXER_UNUSED }; 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { MIXER_DEFAULT = MIXER_LEFT, MIXER_MAX = MIXER_UNUSED }; 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { MAX_FB_DEVICES = DPY_MAX }; 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum { FORMAT_YUV, FORMAT_RGB , FORMAT_NONE }; 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct PipeSpecs { 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeSpecs() : formatClass(FORMAT_RGB), needsScaling(false), fb(false), 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin dpy(DPY_PRIMARY), mixer(MIXER_DEFAULT), numActiveDisplays(1) {} 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int formatClass; 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool needsScaling; 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool fb; 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int dpy; 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mixer; 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int numActiveDisplays; 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* dtor close */ 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ~Overlay(); 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Marks the beginning of a drawing round, resets usage bits on pipes 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Should be called when drawing begins before any pipe config is done. 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void configBegin(); 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Marks the end of config for this drawing round 78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Will do garbage collection of pipe objects and thus calling UNSETs, 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * closing FDs, removing rotator objects and memory, if allocated. 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Should be called after all pipe configs are done. 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void configDone(); 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Get a pipe that supported the specified format class (yuv, rgb) and has 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * scaling capabilities. 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest getPipe(const PipeSpecs& pipeSpecs); 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns the eDest corresponding to an already allocated pipeid. 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Useful for the reservation case, when libvpu reserves the pipe at its 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * end, and expect the overlay to allocate a given pipe for a layer. 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest reservePipe(int pipeid); 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* getting dest for the given pipeid */ 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest getDest(int pipeid); 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* getting overlay.pipeid for the given dest */ 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int getPipeId(utils::eDest dest); 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setSource(const utils::PipeArgs args, utils::eDest dest); 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setCrop(const utils::Dim& d, utils::eDest dest); 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setColor(const uint32_t color, utils::eDest dest); 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setTransform(const int orientation, utils::eDest dest); 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setPosition(const utils::Dim& dim, utils::eDest dest); 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setVisualParams(const MetaData_t& data, utils::eDest dest); 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool commit(utils::eDest dest); 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool queueBuffer(int fd, uint32_t offset, utils::eDest dest); 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* pipe reservation session is running */ 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool sessionInProgress(utils::eDest dest); 109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* pipe reservation session has ended*/ 110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool isSessionEnded(utils::eDest dest); 111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* start session for the pipe reservation */ 112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void startSession(utils::eDest dest); 113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* end all started sesisons */ 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void endAllSessions(); 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns available ("unallocated") pipes for a display's mixer */ 116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int availablePipes(int dpy, int mixer); 117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns available ("unallocated") pipes for a display */ 118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int availablePipes(int dpy); 119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns available ("unallocated") pipe of given type for a display */ 120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int availablePipes(int dpy, utils::eMdpPipeType type); 121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns if any of the requested pipe type is attached to any of the 122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * displays 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool isPipeTypeAttached(utils::eMdpPipeType type); 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Compare pipe priorities and return 126a4a71c6d0a4553a9edbbd2398ea05032abe395d6Arun Kumar K.R * true - A swap is needed to fix the priority. 127a4a71c6d0a4553a9edbbd2398ea05032abe395d6Arun Kumar K.R * false - Good, priority wise. 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 129a4a71c6d0a4553a9edbbd2398ea05032abe395d6Arun Kumar K.R bool needsPrioritySwap(utils::eDest pipe1Index, utils::eDest pipe2Index); 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns pipe dump. Expects a NULL terminated buffer of big enough size 131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * to populate. 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns if DMA pipe multiplexing is supported by the mdss driver */ 134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isDMAMultiplexingSupported(); 135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns if UI scaling on external is supported on the targets */ 136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isUIScalingOnExternalSupported(); 137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void getDump(char *buf, size_t len); 138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Reset usage and allocation bits on all pipes for given display */ 139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void clear(int dpy); 140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Validate the set of pipes for a display and set them in driver */ 141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool validateAndSet(const int& dpy, const int& fbFd); 142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Closes open pipes, called during startup */ 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int initOverlay(); 145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns the singleton instance of overlay */ 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static Overlay* getInstance(); 147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void setDMAMode(const int& mode); 148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int getDMAMode(); 149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns the framebuffer node backing up the display */ 150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int getFbForDpy(const int& dpy); 151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool displayCommit(const int& fd); 153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Overloads display commit with ROI's of each halves. 154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Single interface panels will only update left ROI. */ 155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool displayCommit(const int& fd, const utils::Dim& lRoi, 156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const utils::Dim& rRoi); 157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Logs pipe lifecycle events like set, unset, commit when enabled */ 158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void debugPipeLifecycle(const bool& enable); 159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns true if pipe life cycle logging is enabled */ 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isDebugPipeLifecycle(); 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate: 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Ctor setup */ 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin explicit Overlay(); 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /*Validate index range, abort if invalid */ 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void validate(int index); 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void setDMAMultiplexingSupported(); 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns an available pipe based on the type of pipe requested. When ANY 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * is requested, the first available VG or RGB is returned. If no pipe is 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * available for the display "dpy" then INV is returned. Note: If a pipe is 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * assigned to a certain display, then it cannot be assigned to another 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * display without being garbage-collected once. To add if a pipe is 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * asisgned to a mixer within a display it cannot be reused for another 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * mixer without being UNSET once*/ 175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest nextPipe(utils::eMdpPipeType, const PipeSpecs& pipeSpecs); 176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Helpers that enfore target specific policies while returning pipes */ 177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest getPipe_8x26(const PipeSpecs& pipeSpecs); 178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest getPipe_8x16(const PipeSpecs& pipeSpecs); 179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest getPipe_8x39(const PipeSpecs& pipeSpecs); 180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::eDest getPipe_8994(const PipeSpecs& pipeSpecs); 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Returns the handle to libscale.so's programScale function */ 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int (*getFnProgramScale())(struct mdp_overlay_list *); 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Creates a scalar object using libscale.so */ 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void initScalar(); 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Destroys the scalar object using libscale.so */ 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void destroyScalar(); 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Sets the pipe type RGB/VG/DMA*/ 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void setPipeType(utils::eDest pipeIndex, const utils::eMdpPipeType pType); 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Dynamically link ABL library */ 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void initPostProc(); 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void destroyPostProc(); 194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int (*getFnPpParams())(const struct compute_params *, 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_overlay_pp_params *); 196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Just like a Facebook for pipes, but much less profile info */ 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct PipeBook { 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void init(); 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void destroy(); 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Check if pipe exists and return true, false otherwise */ 202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool valid(); 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Hardware pipe wrapper */ 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GenericPipe *mPipe; 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Display using this pipe. Refer to enums above */ 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mDisplay; 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Mixer within a split display this pipe is attached to */ 209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mMixer; 210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Format for which this pipe is attached to the mixer*/ 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mFormatType; 212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* operations on bitmap */ 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool pipeUsageUnchanged(); 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void setUse(int index); 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void resetUse(int index); 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isUsed(int index); 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isNotUsed(int index); 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void save(); 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void setAllocation(int index); 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void resetAllocation(int index); 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isAllocated(int index); 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool isNotAllocated(int index); 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static utils::eMdpPipeType getPipeType(utils::eDest dest); 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static const char* getDestStr(utils::eDest dest); 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int NUM_PIPES; 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static utils::eMdpPipeType pipeTypeLUT[utils::OV_MAX]; 231a4a71c6d0a4553a9edbbd2398ea05032abe395d6Arun Kumar K.R static int pipeMinID[utils::OV_MDP_PIPE_ANY]; 232a4a71c6d0a4553a9edbbd2398ea05032abe395d6Arun Kumar K.R static int pipeMaxID[utils::OV_MDP_PIPE_ANY]; 233a4a71c6d0a4553a9edbbd2398ea05032abe395d6Arun Kumar K.R 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Session for reserved pipes */ 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum Session { 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin NONE, 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin START, 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin END 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin Session mSession; 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private: 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //usage tracks if a successful commit happened. So a pipe could be 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //allocated to a display, but it may not end up using it for various 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //reasons. If one display actually uses a pipe then it amy not be 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //used by another display, without an UNSET in between. 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int sPipeUsageBitmap; 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int sLastUsageBitmap; 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Tracks which pipe objects are allocated. This does not imply that they 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //will actually be used. For example, a display might choose to acquire 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //3 pipe objects in one shot and proceed with config only if it gets all 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //3. The bitmap helps allocate different pipe objects on each request. 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int sAllocatedBitmap; 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook mPipeBook[utils::OV_INVALID]; //Used as max 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Singleton Instance*/ 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static Overlay *sInstance; 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int sDpyFbMap[DPY_MAX]; 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int sDMAMode; 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool sDMAMultiplexingSupported; 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void *sLibScaleHandle; 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int (*sFnProgramScale)(struct mdp_overlay_list *); 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* Dynamically link ABL library */ 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static void *sLibAblHandle; 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static int (*sFnppParams)(const struct compute_params *, 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_overlay_pp_params *); 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static bool sDebugPipeLifecycle; 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin friend class MdpCtrl; 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::validate(int index) { 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin OVASSERT(index >=0 && index < PipeBook::NUM_PIPES, \ 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "%s, Index out of bounds: %d", __FUNCTION__, index); 277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin OVASSERT(mPipeBook[index].valid(), "Pipe does not exist %s", 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook::getDestStr((utils::eDest)index)); 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int Overlay::availablePipes(int dpy, int mixer) { 282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int avail = 0; 283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if( (mPipeBook[i].mDisplay == DPY_UNUSED || 285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mPipeBook[i].mDisplay == dpy) && 286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (mPipeBook[i].mMixer == MIXER_UNUSED || 287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mPipeBook[i].mMixer == mixer) && 288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook::isNotAllocated(i) && 289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin !(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE && 290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook::getPipeType((utils::eDest)i) == 291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::OV_MDP_PIPE_DMA)) { 292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin avail++; 293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return avail; 296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int Overlay::availablePipes(int dpy) { 299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int avail = 0; 300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if( (mPipeBook[i].mDisplay == DPY_UNUSED || 302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mPipeBook[i].mDisplay == dpy) && 303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook::isNotAllocated(i) && 304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin !(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE && 305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook::getPipeType((utils::eDest)i) == 306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::OV_MDP_PIPE_DMA)) { 307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin avail++; 308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return avail; 311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int Overlay::availablePipes(int dpy, utils::eMdpPipeType type) { 314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int avail = 0; 315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if((mPipeBook[i].mDisplay == DPY_UNUSED || 317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mPipeBook[i].mDisplay == dpy) && 318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin PipeBook::isNotAllocated(i) && 319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin type == PipeBook::getPipeType((utils::eDest)i)) { 320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin avail++; 321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return avail; 324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::setDMAMode(const int& mode) { 327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mode == DMA_LINE_MODE || mode == DMA_BLOCK_MODE) 328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sDMAMode = mode; 329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::setDMAMultiplexingSupported() { 332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sDMAMultiplexingSupported = false; 333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(qdutils::MDPVersion::getInstance().is8x26()) 334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sDMAMultiplexingSupported = true; 335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::isDMAMultiplexingSupported() { 338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sDMAMultiplexingSupported; 339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::isUIScalingOnExternalSupported() { 342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(qdutils::MDPVersion::getInstance().is8x26() or 343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin qdutils::MDPVersion::getInstance().is8x16() or 344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin qdutils::MDPVersion::getInstance().is8x39()) { 345054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 346054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 347054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 348054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 349054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 350054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int Overlay::getDMAMode() { 351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sDMAMode; 352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int Overlay::getFbForDpy(const int& dpy) { 355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin OVASSERT(dpy >= 0 && dpy < DPY_MAX, "Invalid dpy %d", dpy); 356054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sDpyFbMap[dpy]; 357054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 358054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 359054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int (*Overlay::getFnProgramScale())(struct mdp_overlay_list *) { 360054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sFnProgramScale; 361054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 362054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline int (*Overlay::getFnPpParams())(const struct compute_params *, 364054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_overlay_pp_params *) { 365054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sFnppParams; 366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::debugPipeLifecycle(const bool& enable) { 369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sDebugPipeLifecycle = enable; 370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::isDebugPipeLifecycle() { 373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sDebugPipeLifecycle; 374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::PipeBook::valid() { 377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (mPipe != NULL); 378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::PipeBook::pipeUsageUnchanged() { 381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (sPipeUsageBitmap == sLastUsageBitmap); 382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::PipeBook::setUse(int index) { 385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sPipeUsageBitmap |= (1 << index); 386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::PipeBook::resetUse(int index) { 389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sPipeUsageBitmap &= ~(1 << index); 390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::PipeBook::isUsed(int index) { 393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sPipeUsageBitmap & (1 << index); 394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::PipeBook::isNotUsed(int index) { 397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return !isUsed(index); 398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::PipeBook::save() { 401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sLastUsageBitmap = sPipeUsageBitmap; 402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::PipeBook::setAllocation(int index) { 405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sAllocatedBitmap |= (1 << index); 406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::PipeBook::resetAllocation(int index) { 409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sAllocatedBitmap &= ~(1 << index); 410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::PipeBook::isAllocated(int index) { 413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sAllocatedBitmap & (1 << index); 414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::PipeBook::isNotAllocated(int index) { 417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return !isAllocated(index); 418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline utils::eMdpPipeType Overlay::PipeBook::getPipeType(utils::eDest dest) { 421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return pipeTypeLUT[(int)dest]; 422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline void Overlay::startSession(utils::eDest dest) { 425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mPipeBook[(int)dest].mSession = PipeBook::START; 426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::sessionInProgress(utils::eDest dest) { 429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (mPipeBook[(int)dest].mSession == PipeBook::START); 430054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 431054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 432054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline bool Overlay::isSessionEnded(utils::eDest dest) { 433054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (mPipeBook[(int)dest].mSession == PipeBook::END); 434054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 435054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 436054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjininline const char* Overlay::PipeBook::getDestStr(utils::eDest dest) { 437054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch(getPipeType(dest)) { 438054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case utils::OV_MDP_PIPE_RGB: return "RGB"; 439054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case utils::OV_MDP_PIPE_VG: return "VG"; 440054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case utils::OV_MDP_PIPE_DMA: return "DMA"; 441054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin default: return "Invalid"; 442054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 443054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return "Invalid"; 444054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 445054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 446054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; // overlay 447054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 448054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif // OVERLAY_H 449