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#include "overlay.h" 31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "pipes/overlayGenPipe.h" 32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "mdp_version.h" 33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "qdMetaData.h" 34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define PIPE_DEBUG 0 36b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 37b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace overlay { 38b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyusing namespace utils; 39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 40b166940edca6e312463461438e2aa66e9852c26aBenoit GobyOverlay::Overlay() { 41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::NUM_PIPES = qdutils::MDPVersion::getInstance().getTotalPipes(); 42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[i].init(); 44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDumpStr[0] = '\0'; 47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 49b166940edca6e312463461438e2aa66e9852c26aBenoit GobyOverlay::~Overlay() { 50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[i].destroy(); 52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 55b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::configBegin() { 56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Mark as available for this round. 58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::resetUse(i); 59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::resetAllocation(i); 60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDumpStr[0] = '\0'; 62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 64b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::configDone() { 65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(PipeBook::pipeUsageUnchanged()) return; 66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(PipeBook::isNotUsed(i)) { 69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Forces UNSET on pipes, flushes rotator memory and session, closes 70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //fds 71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mPipeBook[i].valid()) { 72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby char str[32]; 73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sprintf(str, "Unset pipe=%s dpy=%d; ", 74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::getDestStr((eDest)i), mPipeBook[i].mDisplay); 75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby strncat(mDumpStr, str, strlen(str)); 76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[i].destroy(); 78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby dump(); 81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::save(); 82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 84b166940edca6e312463461438e2aa66e9852c26aBenoit GobyeDest Overlay::nextPipe(eMdpPipeType type, int dpy) { 85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby eDest dest = OV_INVALID; 86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Match requested pipe type 89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(type == OV_MDP_PIPE_ANY || type == PipeBook::getPipeType((eDest)i)) { 90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //If the pipe is not allocated to any display or used by the 91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //requesting display already in previous round. 92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if((mPipeBook[i].mDisplay == PipeBook::DPY_UNUSED || 93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[i].mDisplay == dpy) && 94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::isNotAllocated(i)) { 95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby dest = (eDest)i; 96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::setAllocation(i); 97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby break; 98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(dest != OV_INVALID) { 103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //If the pipe is not registered with any display OR if the pipe is 105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //requested again by the same display using it, then go ahead. 106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mDisplay = dpy; 107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(not mPipeBook[index].valid()) { 108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mPipe = new GenericPipe(dpy); 109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby char str[32]; 110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby snprintf(str, 32, "Set pipe=%s dpy=%d; ", 111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::getDestStr(dest), dpy); 112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby strncat(mDumpStr, str, strlen(str)); 113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } else { 115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(PIPE_DEBUG, "Pipe unavailable type=%d display=%d", 116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (int)type, dpy); 117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 118b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return dest; 120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 122b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool Overlay::commit(utils::eDest dest) { 123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool ret = false; 124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 126b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 127b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mPipeBook[index].mPipe->commit()) { 128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = true; 129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::setUse((int)dest); 130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } else { 131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::resetUse((int)dest); 132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int dpy = mPipeBook[index].mDisplay; 133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) 134b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (mPipeBook[i].mDisplay == dpy) 135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::resetAllocation(i); 136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return ret; 138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 140b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool Overlay::queueBuffer(int fd, uint32_t offset, 141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eDest dest) { 142b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 143b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool ret = false; 144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 145b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Queue only if commit() has succeeded (and the bit set) 146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(PipeBook::isUsed((int)dest)) { 147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = mPipeBook[index].mPipe->queueBuffer(fd, offset); 148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return ret; 150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 151b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 152b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::setCrop(const utils::Dim& d, 153b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eDest dest) { 154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mPipe->setCrop(d); 157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 159b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::setPosition(const utils::Dim& d, 160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eDest dest) { 161b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mPipe->setPosition(d); 164b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 166b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::setTransform(const int orient, 167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eDest dest) { 168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eTransform transform = 172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static_cast<utils::eTransform>(orient); 173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mPipe->setTransform(transform); 174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 177b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::setSource(const utils::PipeArgs args, 178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::eDest dest) { 179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 182b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeArgs newArgs(args); 183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_VG) { 184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE); 185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } else { 186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE); 187b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_DMA) { 190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA); 191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } else { 192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA); 193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mPipe->setSource(newArgs); 196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 198b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::setVisualParams(const MetaData_t& metadata, utils::eDest dest) { 199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = (int)dest; 200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby validate(index); 201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[index].mPipe->setVisualParams(metadata); 202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 204b166940edca6e312463461438e2aa66e9852c26aBenoit GobyOverlay* Overlay::getInstance() { 205b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(sInstance == NULL) { 206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sInstance = new Overlay(); 207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return sInstance; 209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Clears any VG pipes allocated to the fb devices 212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Generates a LUT for pipe types. 213b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint Overlay::initOverlay() { 214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion(); 215b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int numPipesXType[OV_MDP_PIPE_ANY] = {0}; 216b166940edca6e312463461438e2aa66e9852c26aBenoit Goby numPipesXType[OV_MDP_PIPE_RGB] = 217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby qdutils::MDPVersion::getInstance().getRGBPipes(); 218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby numPipesXType[OV_MDP_PIPE_VG] = 219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby qdutils::MDPVersion::getInstance().getVGPipes(); 220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby numPipesXType[OV_MDP_PIPE_DMA] = 221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby qdutils::MDPVersion::getInstance().getDMAPipes(); 222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = 0; 224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int X = 0; X < (int)OV_MDP_PIPE_ANY; X++) { //iterate over types 225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int j = 0; j < numPipesXType[X]; j++) { //iterate over num 226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby PipeBook::pipeTypeLUT[index] = (utils::eMdpPipeType)X; 227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby index++; 228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (mdpVersion < qdutils::MDSS_V5) { 232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby msmfb_mixer_info_req req; 233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mdp_mixer_info *minfo = NULL; 234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby char name[64]; 235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int fd = -1; 236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < NUM_FB_DEVICES; i++) { 237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby snprintf(name, 64, FB_DEVICE_TEMPLATE, i); 238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD("initoverlay:: opening the device:: %s", name); 239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby fd = ::open(name, O_RDWR, 0); 240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(fd < 0) { 241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("cannot open framebuffer(%d)", i); 242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return -1; 243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 244b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Get the mixer configuration */ 245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby req.mixer_num = i; 246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (ioctl(fd, MSMFB_MIXER_INFO, &req) == -1) { 247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("ERROR: MSMFB_MIXER_INFO ioctl failed"); 248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby close(fd); 249b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return -1; 250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby minfo = req.info; 252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for (int j = 0; j < req.cnt; j++) { 253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD("ndx=%d num=%d z_order=%d", minfo->pndx, minfo->pnum, 254b166940edca6e312463461438e2aa66e9852c26aBenoit Goby minfo->z_order); 255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // clear any pipe connected to mixer including base pipe. 256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int index = minfo->pndx; 257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD("Unset overlay with index: %d at mixer %d", index, i); 258b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(ioctl(fd, MSMFB_OVERLAY_UNSET, &index) == -1) { 259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("ERROR: MSMFB_OVERLAY_UNSET failed"); 260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby close(fd); 261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return -1; 262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby minfo++; 264b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 265b166940edca6e312463461438e2aa66e9852c26aBenoit Goby close(fd); 266b166940edca6e312463461438e2aa66e9852c26aBenoit Goby fd = -1; 267b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 268b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 269b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return 0; 270b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 271b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 272b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::dump() const { 273b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(strlen(mDumpStr)) { //dump only on state change 274b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(PIPE_DEBUG, "%s\n", mDumpStr); 275b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 276b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 277b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 278b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::getDump(char *buf, size_t len) { 279b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int totalPipes = 0; 280b166940edca6e312463461438e2aa66e9852c26aBenoit Goby const char *str = "\nOverlay State\n==========================\n"; 281b166940edca6e312463461438e2aa66e9852c26aBenoit Goby strncat(buf, str, strlen(str)); 282b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 283b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mPipeBook[i].valid()) { 284b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipeBook[i].mPipe->getDump(buf, len); 285b166940edca6e312463461438e2aa66e9852c26aBenoit Goby char str[64] = {'\0'}; 286b166940edca6e312463461438e2aa66e9852c26aBenoit Goby snprintf(str, 64, "Attached to dpy=%d\n\n", mPipeBook[i].mDisplay); 287b166940edca6e312463461438e2aa66e9852c26aBenoit Goby strncat(buf, str, strlen(str)); 288b166940edca6e312463461438e2aa66e9852c26aBenoit Goby totalPipes++; 289b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 290b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 291b166940edca6e312463461438e2aa66e9852c26aBenoit Goby char str_pipes[64] = {'\0'}; 292b166940edca6e312463461438e2aa66e9852c26aBenoit Goby snprintf(str_pipes, 64, "Pipes used=%d\n\n", totalPipes); 293b166940edca6e312463461438e2aa66e9852c26aBenoit Goby strncat(buf, str_pipes, strlen(str_pipes)); 294b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 295b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 296b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::PipeBook::init() { 297b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipe = NULL; 298b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDisplay = DPY_UNUSED; 299b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 300b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 301b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid Overlay::PipeBook::destroy() { 302b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mPipe) { 303b166940edca6e312463461438e2aa66e9852c26aBenoit Goby delete mPipe; 304b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mPipe = NULL; 305b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 306b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDisplay = DPY_UNUSED; 307b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 308b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 309b166940edca6e312463461438e2aa66e9852c26aBenoit GobyOverlay* Overlay::sInstance = 0; 310b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint Overlay::sExtFbIndex = 1; 311b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint Overlay::PipeBook::NUM_PIPES = 0; 312b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint Overlay::PipeBook::sPipeUsageBitmap = 0; 313b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint Overlay::PipeBook::sLastUsageBitmap = 0; 314b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint Overlay::PipeBook::sAllocatedBitmap = 0; 315b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyutils::eMdpPipeType Overlay::PipeBook::pipeTypeLUT[utils::OV_MAX] = 316b166940edca6e312463461438e2aa66e9852c26aBenoit Goby {utils::OV_MDP_PIPE_ANY}; 317b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 318b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}; // namespace overlay 319