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_H 31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define OVERLAY_H 32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayUtils.h" 34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "utils/threads.h" 35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 36b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct MetaData_t; 37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 38b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace overlay { 39b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass GenericPipe; 40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 41b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass Overlay : utils::NoCopy { 42b166940edca6e312463461438e2aa66e9852c26aBenoit Gobypublic: 43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* dtor close */ 44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ~Overlay(); 45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Marks the beginning of a drawing round, resets usage bits on pipes 47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Should be called when drawing begins before any pipe config is done. 48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */ 49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void configBegin(); 50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Marks the end of config for this drawing round 52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Will do garbage collection of pipe objects and thus calling UNSETs, 53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * closing FDs, removing rotator objects and memory, if allocated. 54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Should be called after all pipe configs are done. 55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */ 56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void configDone(); 57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Returns an available pipe based on the type of pipe requested. When ANY 59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * is requested, the first available VG or RGB is returned. If no pipe is 60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * available for the display "dpy" then INV is returned. Note: If a pipe is 61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * assigned to a certain display, then it cannot be assigned to another 62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * display without being garbage-collected once */ 63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eDest nextPipe(utils::eMdpPipeType, int dpy); 64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void setSource(const utils::PipeArgs args, utils::eDest dest); 66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void setCrop(const utils::Dim& d, utils::eDest dest); 67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void setTransform(const int orientation, utils::eDest dest); 68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void setPosition(const utils::Dim& dim, utils::eDest dest); 69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void setVisualParams(const MetaData_t& data, utils::eDest dest); 70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool commit(utils::eDest dest); 71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool queueBuffer(int fd, uint32_t offset, utils::eDest dest); 72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Closes open pipes, called during startup */ 74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static int initOverlay(); 75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Returns the singleton instance of overlay */ 76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static Overlay* getInstance(); 77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Returns available ("unallocated") pipes for a display */ 78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int availablePipes(int dpy); 79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* set the framebuffer index for external display */ 80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void setExtFbNum(int fbNum); 81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Returns framebuffer index of the current external display */ 82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int getExtFbNum(); 83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Returns pipe dump. Expects a NULL terminated buffer of big enough size 84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * to populate. 85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */ 86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void getDump(char *buf, size_t len); 87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 88b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyprivate: 89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Ctor setup */ 90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby explicit Overlay(); 91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /*Validate index range, abort if invalid */ 92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void validate(int index); 93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void dump() const; 94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Just like a Facebook for pipes, but much less profile info */ 96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby struct PipeBook { 97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby enum { DPY_PRIMARY, DPY_EXTERNAL, DPY_UNUSED }; 98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void init(); 100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby void destroy(); 101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Check if pipe exists and return true, false otherwise */ 102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool valid(); 103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Hardware pipe wrapper */ 105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby GenericPipe *mPipe; 106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Display using this pipe. Refer to enums above */ 107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int mDisplay; 108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* operations on bitmap */ 110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static bool pipeUsageUnchanged(); 111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static void setUse(int index); 112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static void resetUse(int index); 113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static bool isUsed(int index); 114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static bool isNotUsed(int index); 115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static void save(); 116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static void setAllocation(int index); 118b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static void resetAllocation(int index); 119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static bool isAllocated(int index); 120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static bool isNotAllocated(int index); 121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static utils::eMdpPipeType getPipeType(utils::eDest dest); 123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static const char* getDestStr(utils::eDest dest); 124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static int NUM_PIPES; 126b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static utils::eMdpPipeType pipeTypeLUT[utils::OV_MAX]; 127b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby private: 130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //usage tracks if a successful commit happened. So a pipe could be 131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //allocated to a display, but it may not end up using it for various 132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //reasons. If one display actually uses a pipe then it amy not be 133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //used by another display, without an UNSET in between. 134b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static int sPipeUsageBitmap; 135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static int sLastUsageBitmap; 136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Tracks which pipe objects are allocated. This does not imply that they 137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //will actually be used. For example, a display might choose to acquire 138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //3 pipe objects in one shot and proceed with config only if it gets all 139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //3. The bitmap helps allocate different pipe objects on each request. 140b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static int sAllocatedBitmap; 141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby }; 142b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 143b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook mPipeBook[utils::OV_INVALID]; //Used as max 144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 145b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Dump string */ 146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby char mDumpStr[256]; 147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* Singleton Instance*/ 149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static Overlay *sInstance; 150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static int sExtFbIndex; 151b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}; 152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 153b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::validate(int index) { 154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(index >=0 && index < PipeBook::NUM_PIPES, \ 155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby "%s, Index out of bounds: %d", __FUNCTION__, index); 156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(mPipeBook[index].valid(), "Pipe does not exist %s", 157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::getDestStr((utils::eDest)index)); 158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 160b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int Overlay::availablePipes(int dpy) { 161b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int avail = 0; 162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if((mPipeBook[i].mDisplay == PipeBook::DPY_UNUSED || 164b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[i].mDisplay == dpy) && PipeBook::isNotAllocated(i)) { 165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby avail++; 166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return avail; 169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 171b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::setExtFbNum(int fbNum) { 172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sExtFbIndex = fbNum; 173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 175b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline int Overlay::getExtFbNum() { 176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return sExtFbIndex; 177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 179b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool Overlay::PipeBook::valid() { 180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return (mPipe != NULL); 181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 182b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 183b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool Overlay::PipeBook::pipeUsageUnchanged() { 184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return (sPipeUsageBitmap == sLastUsageBitmap); 185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 187b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::PipeBook::setUse(int index) { 188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sPipeUsageBitmap |= (1 << index); 189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 191b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::PipeBook::resetUse(int index) { 192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sPipeUsageBitmap &= ~(1 << index); 193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 195b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool Overlay::PipeBook::isUsed(int index) { 196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return sPipeUsageBitmap & (1 << index); 197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 198b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 199b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool Overlay::PipeBook::isNotUsed(int index) { 200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return !isUsed(index); 201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 203b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::PipeBook::save() { 204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sLastUsageBitmap = sPipeUsageBitmap; 205b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 207b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::PipeBook::setAllocation(int index) { 208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sAllocatedBitmap |= (1 << index); 209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 211b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void Overlay::PipeBook::resetAllocation(int index) { 212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sAllocatedBitmap &= ~(1 << index); 213b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 215b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool Overlay::PipeBook::isAllocated(int index) { 216b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return sAllocatedBitmap & (1 << index); 217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 219b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline bool Overlay::PipeBook::isNotAllocated(int index) { 220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return !isAllocated(index); 221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 223b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline utils::eMdpPipeType Overlay::PipeBook::getPipeType(utils::eDest dest) { 224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return pipeTypeLUT[(int)dest]; 225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 227b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline const char* Overlay::PipeBook::getDestStr(utils::eDest dest) { 228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby switch(getPipeType(dest)) { 229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby case utils::OV_MDP_PIPE_RGB: return "RGB"; 230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby case utils::OV_MDP_PIPE_VG: return "VG"; 231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby case utils::OV_MDP_PIPE_DMA: return "DMA"; 232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby default: return "Invalid"; 233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return "Invalid"; 235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}; // overlay 238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif // OVERLAY_H 240