overlay.cpp revision cf2536998ecd888681570bd713836115f8979cd0
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. 329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Redistribution and use in source and binary forms, with or without 529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* modification, are permitted provided that the following conditions are 629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* met: 729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* * Redistributions of source code must retain the above copyright 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* notice, this list of conditions and the following disclaimer. 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* * Redistributions in binary form must reproduce the above 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* copyright notice, this list of conditions and the following 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* disclaimer in the documentation and/or other materials provided 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* with the distribution. 13d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed* * Neither the name of The Linux Foundation nor the names of its 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* contributors may be used to endorse or promote products derived 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* from this software without specific prior written permission. 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*/ 2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlay.h" 31d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include "pipes/overlayGenPipe.h" 32d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include "mdp_version.h" 33e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#include "qdMetaData.h" 3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 35d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#define PIPE_DEBUG 0 3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay { 38d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedusing namespace utils; 3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 40d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer AhmedOverlay::Overlay() { 4144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah PipeBook::NUM_PIPES = qdutils::MDPVersion::getInstance().getTotalPipes(); 42d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 43d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[i].init(); 4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 46d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mDumpStr[0] = '\0'; 471ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed} 481ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed 491ddf366c267e01dbb7ac736d9c40272d5541b724Naseer AhmedOverlay::~Overlay() { 50d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 51d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[i].destroy(); 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 55d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::configBegin() { 56d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 57d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //Mark as available for this round. 58d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::resetUse(i); 59d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::resetAllocation(i); 60d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } 61d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mDumpStr[0] = '\0'; 62d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed} 63d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 64d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::configDone() { 65d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(PipeBook::pipeUsageUnchanged()) return; 66d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 67d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 68d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(PipeBook::isNotUsed(i)) { 69d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //Forces UNSET on pipes, flushes rotator memory and session, closes 70d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //fds 71d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(mPipeBook[i].valid()) { 72d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed char str[32]; 7344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah sprintf(str, "Unset pipe=%s dpy=%d; ", 7444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah PipeBook::getDestStr((eDest)i), mPipeBook[i].mDisplay); 75d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed strncat(mDumpStr, str, strlen(str)); 76d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } 77d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[i].destroy(); 781ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 80d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed dump(); 81d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::save(); 82d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed} 83d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 84d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer AhmedeDest Overlay::nextPipe(eMdpPipeType type, int dpy) { 85d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed eDest dest = OV_INVALID; 86d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 87d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 88d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //Match requested pipe type 8944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah if(type == OV_MDP_PIPE_ANY || type == PipeBook::getPipeType((eDest)i)) { 90d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //If the pipe is not allocated to any display or used by the 91d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //requesting display already in previous round. 92d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if((mPipeBook[i].mDisplay == PipeBook::DPY_UNUSED || 93d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[i].mDisplay == dpy) && 94d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::isNotAllocated(i)) { 955fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah //In block mode we don't allow line operations 965fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah if(sDMAMode == DMA_BLOCK_MODE && 975fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah PipeBook::getPipeType((eDest)i) == OV_MDP_PIPE_DMA) 985fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah continue; 995fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah 100d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed dest = (eDest)i; 101d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::setAllocation(i); 102d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed break; 103d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } 1041ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 10529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 106d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 107d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(dest != OV_INVALID) { 108d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 109d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //If the pipe is not registered with any display OR if the pipe is 110d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //requested again by the same display using it, then go ahead. 111d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[index].mDisplay = dpy; 112d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(not mPipeBook[index].valid()) { 113d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[index].mPipe = new GenericPipe(dpy); 114d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed char str[32]; 11544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah snprintf(str, 32, "Set pipe=%s dpy=%d; ", 11644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah PipeBook::getDestStr(dest), dpy); 117d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed strncat(mDumpStr, str, strlen(str)); 1181ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 119d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } else { 120d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ALOGD_IF(PIPE_DEBUG, "Pipe unavailable type=%d display=%d", 121d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed (int)type, dpy); 12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 123d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 124d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed return dest; 12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 126f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1275a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shahbool Overlay::isPipeTypeAttached(eMdpPipeType type) { 1285a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 1295a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah if(type == PipeBook::getPipeType((eDest)i) && 1305a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah mPipeBook[i].mDisplay != PipeBook::DPY_UNUSED) { 1315a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah return true; 1325a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah } 1335a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah } 1345a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah return false; 1355a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah} 1365a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah 137d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedbool Overlay::commit(utils::eDest dest) { 138d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed bool ret = false; 139d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 140d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed validate(index); 141f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 142d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(mPipeBook[index].mPipe->commit()) { 143d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ret = true; 144d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::setUse((int)dest); 145d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } else { 146d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeBook::resetUse((int)dest); 147dbe48d71be758dd07d7f64417aef57f30c478a54Sushil Chauhan int dpy = mPipeBook[index].mDisplay; 148dbe48d71be758dd07d7f64417aef57f30c478a54Sushil Chauhan for(int i = 0; i < PipeBook::NUM_PIPES; i++) 149dbe48d71be758dd07d7f64417aef57f30c478a54Sushil Chauhan if (mPipeBook[i].mDisplay == dpy) 150dbe48d71be758dd07d7f64417aef57f30c478a54Sushil Chauhan PipeBook::resetAllocation(i); 15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 152d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed return ret; 15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 154f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 155d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedbool Overlay::queueBuffer(int fd, uint32_t offset, 156d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed utils::eDest dest) { 157d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 158d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed bool ret = false; 159d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed validate(index); 160d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed //Queue only if commit() has succeeded (and the bit set) 161d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(PipeBook::isUsed((int)dest)) { 162d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ret = mPipeBook[index].mPipe->queueBuffer(fd, offset); 16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 164d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed return ret; 16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 167d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::setCrop(const utils::Dim& d, 168d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed utils::eDest dest) { 169d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 170d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed validate(index); 171d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[index].mPipe->setCrop(d); 17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 174d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::setPosition(const utils::Dim& d, 175d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed utils::eDest dest) { 176d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 177d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed validate(index); 178d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[index].mPipe->setPosition(d); 17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 181d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::setTransform(const int orient, 182d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed utils::eDest dest) { 183d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 184d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed validate(index); 185d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 186d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed utils::eTransform transform = 187d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed static_cast<utils::eTransform>(orient); 188d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[index].mPipe->setTransform(transform); 189d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 19029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 19129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 192d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::setSource(const utils::PipeArgs args, 193d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed utils::eDest dest) { 194d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed int index = (int)dest; 195d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed validate(index); 19629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 197d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed PipeArgs newArgs(args); 19844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_VG) { 199d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE); 200d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } else { 201d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE); 202c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 2036371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 20444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_DMA) { 2056371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA); 2066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } else { 2076371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA); 2086371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 2096371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 210d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipeBook[index].mPipe->setSource(newArgs); 211d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed} 212d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 213e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shahvoid Overlay::setVisualParams(const MetaData_t& metadata, utils::eDest dest) { 214e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah int index = (int)dest; 215e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah validate(index); 216e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah mPipeBook[index].mPipe->setVisualParams(metadata); 217e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah} 218e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah 219d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer AhmedOverlay* Overlay::getInstance() { 220d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(sInstance == NULL) { 221d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed sInstance = new Overlay(); 222d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } 223d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed return sInstance; 224c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah} 225c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 22644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah// Clears any VG pipes allocated to the fb devices 22744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah// Generates a LUT for pipe types. 22844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shahint Overlay::initOverlay() { 22944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion(); 23044d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah int numPipesXType[OV_MDP_PIPE_ANY] = {0}; 23144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah numPipesXType[OV_MDP_PIPE_RGB] = 23244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah qdutils::MDPVersion::getInstance().getRGBPipes(); 23344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah numPipesXType[OV_MDP_PIPE_VG] = 23444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah qdutils::MDPVersion::getInstance().getVGPipes(); 23544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah numPipesXType[OV_MDP_PIPE_DMA] = 23644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah qdutils::MDPVersion::getInstance().getDMAPipes(); 23744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah 23844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah int index = 0; 23944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah for(int X = 0; X < (int)OV_MDP_PIPE_ANY; X++) { //iterate over types 24044d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah for(int j = 0; j < numPipesXType[X]; j++) { //iterate over num 24144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah PipeBook::pipeTypeLUT[index] = (utils::eMdpPipeType)X; 24244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah index++; 24344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 24444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 24544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah 246804e5a7dd92125415251701d866b792cb0c22913Xiaoming Zhou if (mdpVersion < qdutils::MDSS_V5 && mdpVersion != qdutils::MDP_V3_0_4) { 24744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah msmfb_mixer_info_req req; 24844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mdp_mixer_info *minfo = NULL; 24944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah char name[64]; 25044d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah int fd = -1; 25144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah for(int i = 0; i < NUM_FB_DEVICES; i++) { 25244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah snprintf(name, 64, FB_DEVICE_TEMPLATE, i); 25344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah ALOGD("initoverlay:: opening the device:: %s", name); 25444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah fd = ::open(name, O_RDWR, 0); 25544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah if(fd < 0) { 25644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah ALOGE("cannot open framebuffer(%d)", i); 25744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah return -1; 25844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 25944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah //Get the mixer configuration */ 26044d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah req.mixer_num = i; 26144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah if (ioctl(fd, MSMFB_MIXER_INFO, &req) == -1) { 26244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah ALOGE("ERROR: MSMFB_MIXER_INFO ioctl failed"); 26344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah close(fd); 26444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah return -1; 26544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 26644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah minfo = req.info; 26744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah for (int j = 0; j < req.cnt; j++) { 26844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah ALOGD("ndx=%d num=%d z_order=%d", minfo->pndx, minfo->pnum, 26944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah minfo->z_order); 27030851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed // clear any pipe connected to mixer including base pipe. 27130851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed int index = minfo->pndx; 27230851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed ALOGD("Unset overlay with index: %d at mixer %d", index, i); 27330851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed if(ioctl(fd, MSMFB_OVERLAY_UNSET, &index) == -1) { 27430851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed ALOGE("ERROR: MSMFB_OVERLAY_UNSET failed"); 27530851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed close(fd); 27630851159787a142ff3144bc34013eaed2d6f9e9bNaseer Ahmed return -1; 27744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 27844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah minfo++; 27944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 28044d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah close(fd); 28144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah fd = -1; 28244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 283d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } 28444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah return 0; 285d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed} 286d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 287d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::dump() const { 288d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(strlen(mDumpStr)) { //dump only on state change 289f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ALOGD_IF(PIPE_DEBUG, "%s\n", mDumpStr); 290d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed } 291d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed} 292d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 293f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shahvoid Overlay::getDump(char *buf, size_t len) { 294f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah int totalPipes = 0; 29589cadba6f59425c741d9f376a1f407fcb3bae675Saurabh Shah const char *str = "\nOverlay State\n\n"; 296f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah strncat(buf, str, strlen(str)); 297f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 298f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah if(mPipeBook[i].valid()) { 299f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah mPipeBook[i].mPipe->getDump(buf, len); 300f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah char str[64] = {'\0'}; 30189cadba6f59425c741d9f376a1f407fcb3bae675Saurabh Shah snprintf(str, 64, "Display=%d\n\n", mPipeBook[i].mDisplay); 302f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah strncat(buf, str, strlen(str)); 303f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah totalPipes++; 304f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah } 305f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah } 306f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah char str_pipes[64] = {'\0'}; 30789cadba6f59425c741d9f376a1f407fcb3bae675Saurabh Shah snprintf(str_pipes, 64, "Pipes=%d\n\n", totalPipes); 308f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah strncat(buf, str_pipes, strlen(str_pipes)); 309f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah} 310f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah 311cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhanvoid Overlay::clear(int dpy) { 312cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 313cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan if (mPipeBook[i].mDisplay == dpy) { 314cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan // Mark as available for this round 315cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan PipeBook::resetUse(i); 316cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan PipeBook::resetAllocation(i); 317cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan } 318cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan } 319cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan} 320cf2536998ecd888681570bd713836115f8979cd0Sushil Chauhan 321d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::PipeBook::init() { 322d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipe = NULL; 323d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mDisplay = DPY_UNUSED; 324d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed} 325d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 326d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedvoid Overlay::PipeBook::destroy() { 327d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed if(mPipe) { 328d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed delete mPipe; 329d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mPipe = NULL; 330cb3da0a5e4313f55bd27514006c3ce64293ff8a2Ajay Dudani } 331d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed mDisplay = DPY_UNUSED; 33229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 33329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 334d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer AhmedOverlay* Overlay::sInstance = 0; 335c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint Overlay::sExtFbIndex = 1; 3365fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shahint Overlay::sDMAMode = DMA_LINE_MODE; 337d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedint Overlay::PipeBook::NUM_PIPES = 0; 338d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedint Overlay::PipeBook::sPipeUsageBitmap = 0; 339d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedint Overlay::PipeBook::sLastUsageBitmap = 0; 340d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmedint Overlay::PipeBook::sAllocatedBitmap = 0; 34144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shahutils::eMdpPipeType Overlay::PipeBook::pipeTypeLUT[utils::OV_MAX] = 34244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah {utils::OV_MDP_PIPE_ANY}; 343d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 344d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed}; // namespace overlay 345