1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 26e146950e61327d425750c1de36bfd70d526acadSushil Chauhan* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. 3befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* 4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Redistribution and use in source and binary forms, with or without 5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* modification, are permitted provided that the following conditions are 6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* met: 7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* * Redistributions of source code must retain the above copyright 8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* notice, this list of conditions and the following disclaimer. 9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* * Redistributions in binary form must reproduce the above 10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* copyright notice, this list of conditions and the following 11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* disclaimer in the documentation and/or other materials provided 12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* with the distribution. 1347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed* * Neither the name of The Linux Foundation nor the names of its 14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* contributors may be used to endorse or promote products derived 15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* from this software without specific prior written permission. 16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* 17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*/ 29befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 30072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah#include <dlfcn.h> 31befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlay.h" 3247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "pipes/overlayGenPipe.h" 3347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "mdp_version.h" 345d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#include "qdMetaData.h" 35befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 3647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define PIPE_DEBUG 0 37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace overlay { 3947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedusing namespace utils; 40314840035b55115a39d526cde009c678ccdacf40Saurabh Shahusing namespace qdutils; 41072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 4247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedOverlay::Overlay() { 43c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan int numPipes = qdutils::MDPVersion::getInstance().getTotalPipes(); 44c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan PipeBook::NUM_PIPES = (numPipes <= utils::OV_MAX)? numPipes : utils::OV_MAX; 4547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[i].init(); 47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 4947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mDumpStr[0] = '\0'; 50072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah initScalar(); 51531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal setDMAMultiplexingSupported(); 52f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed} 53f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed 54f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer AhmedOverlay::~Overlay() { 5547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 5647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[i].destroy(); 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 58072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah destroyScalar(); 59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 6147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::configBegin() { 6247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 6347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //Mark as available for this round. 6447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed PipeBook::resetUse(i); 6547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed PipeBook::resetAllocation(i); 6647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 6747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mDumpStr[0] = '\0'; 6847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 6947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 7047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::configDone() { 7147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 7225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam if((PipeBook::isNotUsed(i) && !sessionInProgress((eDest)i)) || 7325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam isSessionEnded((eDest)i)) { 7447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //Forces UNSET on pipes, flushes rotator memory and session, closes 7547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //fds 7647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(mPipeBook[i].valid()) { 7747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed char str[32]; 78c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan snprintf(str, 32, "Unset=%s dpy=%d mix=%d; ", 791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah PipeBook::getDestStr((eDest)i), 801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mPipeBook[i].mDisplay, mPipeBook[i].mMixer); 81d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#if PIPE_DEBUG 82c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan strlcat(mDumpStr, str, sizeof(mDumpStr)); 83d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#endif 8447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 8547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[i].destroy(); 86f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed } 87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 8847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed dump(); 8947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed PipeBook::save(); 9047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 9147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 9225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alamint Overlay::getPipeId(utils::eDest dest) { 9325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam return mPipeBook[(int)dest].mPipe->getPipeId(); 9425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 9525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 9625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib AlameDest Overlay::getDest(int pipeid) { 9725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam eDest dest = OV_INVALID; 9825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam // finding the dest corresponding to the given pipe 9925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam for(int i=0; i < PipeBook::NUM_PIPES; ++i) { 10025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam if(mPipeBook[i].valid() && mPipeBook[i].mPipe->getPipeId() == pipeid) { 10125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam return (eDest)i; 10225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam } 10325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam } 10425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam return dest; 10525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 10625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 10725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib AlameDest Overlay::reservePipe(int pipeid) { 10825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam eDest dest = getDest(pipeid); 10925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam PipeBook::setAllocation((int)dest); 11025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam return dest; 11125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 11225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 1131a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh ShaheDest Overlay::nextPipe(eMdpPipeType type, int dpy, int mixer) { 11447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed eDest dest = OV_INVALID; 11547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 11647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 1171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if( (type == OV_MDP_PIPE_ANY || //Pipe type match 1181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah type == PipeBook::getPipeType((eDest)i)) && 1191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah (mPipeBook[i].mDisplay == DPY_UNUSED || //Free or same display 1201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mPipeBook[i].mDisplay == dpy) && 1211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah (mPipeBook[i].mMixer == MIXER_UNUSED || //Free or same mixer 1221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mPipeBook[i].mMixer == mixer) && 1231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah PipeBook::isNotAllocated(i) && //Free pipe 124531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal ( (sDMAMultiplexingSupported && dpy) || 125531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal !(sDMAMode == DMA_BLOCK_MODE && //DMA pipe in Line mode 126531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal PipeBook::getPipeType((eDest)i) == OV_MDP_PIPE_DMA)) ){ 127531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal //DMA-Multiplexing is only supported for WB on 8x26 1281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah dest = (eDest)i; 1291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah PipeBook::setAllocation(i); 1301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah break; 131f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed } 132befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 13347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 13447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(dest != OV_INVALID) { 13547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 13647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[index].mDisplay = dpy; 1371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mPipeBook[index].mMixer = mixer; 13847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(not mPipeBook[index].valid()) { 13947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[index].mPipe = new GenericPipe(dpy); 14025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam mPipeBook[index].mSession = PipeBook::NONE; 14147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed char str[32]; 1421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah snprintf(str, 32, "Set=%s dpy=%d mix=%d; ", 1431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah PipeBook::getDestStr(dest), dpy, mixer); 144d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#if PIPE_DEBUG 145c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan strlcat(mDumpStr, str, sizeof(mDumpStr)); 146d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#endif 147f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed } 14847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } else { 1491a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(PIPE_DEBUG, "Pipe unavailable type=%d display=%d mixer=%d", 1501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah (int)type, dpy, mixer); 151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 15247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 15347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return dest; 154befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 155ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 156314840035b55115a39d526cde009c678ccdacf40Saurabh Shahutils::eDest Overlay::getPipe(const PipeSpecs& pipeSpecs) { 157314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(MDPVersion::getInstance().is8x26()) { 158314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return getPipe_8x26(pipeSpecs); 159314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else if(MDPVersion::getInstance().is8x16()) { 160314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return getPipe_8x16(pipeSpecs); 161314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 162314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 163314840035b55115a39d526cde009c678ccdacf40Saurabh Shah eDest dest = OV_INVALID; 164314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 165314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //The default behavior is to assume RGB and VG pipes have scalars 166314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(pipeSpecs.formatClass == FORMAT_YUV) { 167314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 168314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else if(pipeSpecs.fb == false) { //RGB App layers 169314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(not pipeSpecs.needsScaling) { 170314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer); 171314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 172314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 173314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer); 174314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 175314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 176314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 177314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 178314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else { //FB layer 179314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer); 180314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 181314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 182314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 183314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //Some features can cause FB to have scaling as well. 184314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //If we ever come to this block with FB needing scaling, 185314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //the screen will be black for a frame, since the FB won't get a pipe 186314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //but atleast this will prevent a hang 187314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID and (not pipeSpecs.needsScaling)) { 188314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer); 189314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 190314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 191314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return dest; 192314840035b55115a39d526cde009c678ccdacf40Saurabh Shah} 193314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 194314840035b55115a39d526cde009c678ccdacf40Saurabh Shahutils::eDest Overlay::getPipe_8x26(const PipeSpecs& pipeSpecs) { 195314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //Use this to hide all the 8x26 requirements that cannot be humanly 196314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //described in a generic way 197314840035b55115a39d526cde009c678ccdacf40Saurabh Shah eDest dest = OV_INVALID; 198314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(pipeSpecs.formatClass == FORMAT_YUV) { //video 199314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 200314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else if(pipeSpecs.fb == false) { //RGB app layers 201314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(not pipeSpecs.needsScaling) { 202314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer); 203314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 204314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 205314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer); 206314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 207314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 208314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 209314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 210314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else { //FB layer 211314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //For 8x26 Secondary we use DMA always for FB for inline rotation 212314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(pipeSpecs.dpy == DPY_PRIMARY) { 213314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer); 214314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 215314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 216314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 217314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 218314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID and (not pipeSpecs.needsScaling)) { 219314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer); 220314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 221314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 222314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return dest; 223314840035b55115a39d526cde009c678ccdacf40Saurabh Shah} 224314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 225314840035b55115a39d526cde009c678ccdacf40Saurabh Shahutils::eDest Overlay::getPipe_8x16(const PipeSpecs& pipeSpecs) { 226314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //Having such functions help keeping the interface generic but code specific 227314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //and rife with assumptions 228314840035b55115a39d526cde009c678ccdacf40Saurabh Shah eDest dest = OV_INVALID; 229314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(pipeSpecs.formatClass == FORMAT_YUV or pipeSpecs.needsScaling) { 230314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 231314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else if(pipeSpecs.fb == false) { //RGB app layers 232314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //Since this is a specific func, we can assume stuff like RGB pipe not 233314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //having scalar blocks 234314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer); 235314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 236314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer); 237314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 238314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } else { 239314840035b55115a39d526cde009c678ccdacf40Saurabh Shah //For 8x16 Secondary we use DMA always for FB for inline rotation 240314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(pipeSpecs.dpy == DPY_PRIMARY) { 241314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer); 242314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 243314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer); 244314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 245314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 246314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(dest == OV_INVALID) { 247314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer); 248314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 249314840035b55115a39d526cde009c678ccdacf40Saurabh Shah } 250314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return dest; 251314840035b55115a39d526cde009c678ccdacf40Saurabh Shah} 252314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 25325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alamvoid Overlay::endAllSessions() { 25425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 25525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam if(mPipeBook[i].valid() && mPipeBook[i].mSession==PipeBook::START) 25625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam mPipeBook[i].mSession = PipeBook::END; 25725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam } 25825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 25925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 260586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shahbool Overlay::isPipeTypeAttached(eMdpPipeType type) { 261586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 262586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah if(type == PipeBook::getPipeType((eDest)i) && 26376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mPipeBook[i].mDisplay != DPY_UNUSED) { 264586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah return true; 265586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 266586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 267586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah return false; 268586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah} 269586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah 270348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shahint Overlay::comparePipePriority(utils::eDest pipe1Index, 271348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah utils::eDest pipe2Index) { 272348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah validate((int)pipe1Index); 273348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah validate((int)pipe2Index); 274348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah uint8_t pipe1Prio = mPipeBook[(int)pipe1Index].mPipe->getPriority(); 275348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah uint8_t pipe2Prio = mPipeBook[(int)pipe2Index].mPipe->getPriority(); 276348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(pipe1Prio > pipe2Prio) 277348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return -1; 278159568fb06ec2eaa1846e3aef51de95d7586a8dfTatenda Chipeperekwa if(pipe1Prio < pipe2Prio) 279159568fb06ec2eaa1846e3aef51de95d7586a8dfTatenda Chipeperekwa return 1; 280348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return 0; 281348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah} 282348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 28347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedbool Overlay::commit(utils::eDest dest) { 28447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed bool ret = false; 28547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 28647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed validate(index); 287ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 28847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(mPipeBook[index].mPipe->commit()) { 28947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ret = true; 29047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed PipeBook::setUse((int)dest); 29147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } else { 29246731b93be48272c1d4e662a6af3c1d80365eb06Sushil Chauhan int dpy = mPipeBook[index].mDisplay; 293b28b611dec8392c7c8f17bc5e71b0a656fa8daa8Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 29420ab3f49dbdb9482f456759cf2fed2264d1f01e2Saurabh Shah if (mPipeBook[i].mDisplay == dpy) { 29546731b93be48272c1d4e662a6af3c1d80365eb06Sushil Chauhan PipeBook::resetAllocation(i); 29620ab3f49dbdb9482f456759cf2fed2264d1f01e2Saurabh Shah PipeBook::resetUse(i); 29720ab3f49dbdb9482f456759cf2fed2264d1f01e2Saurabh Shah } 298b28b611dec8392c7c8f17bc5e71b0a656fa8daa8Saurabh Shah } 299befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 30047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return ret; 301befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 302ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 30347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedbool Overlay::queueBuffer(int fd, uint32_t offset, 30447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed utils::eDest dest) { 30547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 30647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed bool ret = false; 30747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed validate(index); 30847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //Queue only if commit() has succeeded (and the bit set) 30947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(PipeBook::isUsed((int)dest)) { 31047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ret = mPipeBook[index].mPipe->queueBuffer(fd, offset); 311befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 31247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return ret; 313befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 314befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 31547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setCrop(const utils::Dim& d, 31647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed utils::eDest dest) { 31747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 31847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed validate(index); 31947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[index].mPipe->setCrop(d); 320befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 321befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 32208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhanvoid Overlay::setColor(const uint32_t color, 32308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan utils::eDest dest) { 32408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan int index = (int)dest; 32508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan validate(index); 32608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan mPipeBook[index].mPipe->setColor(color); 32708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan} 32808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan 32947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setPosition(const utils::Dim& d, 33047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed utils::eDest dest) { 33147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 33247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed validate(index); 33347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[index].mPipe->setPosition(d); 334befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 335befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 33647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setTransform(const int orient, 33747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed utils::eDest dest) { 33847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 33947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed validate(index); 34047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 34147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed utils::eTransform transform = 34247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static_cast<utils::eTransform>(orient); 34347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[index].mPipe->setTransform(transform); 34447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 345befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 346befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 34747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setSource(const utils::PipeArgs args, 34847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed utils::eDest dest) { 34947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int index = (int)dest; 35047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed validate(index); 351befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 35247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed PipeArgs newArgs(args); 3536e146950e61327d425750c1de36bfd70d526acadSushil Chauhan if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_VG) { 35447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE); 35547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } else { 35647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE); 35776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 358c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 3596e146950e61327d425750c1de36bfd70d526acadSushil Chauhan if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_DMA) { 360c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA); 361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA); 363c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 364c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 36547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipeBook[index].mPipe->setSource(newArgs); 36647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 36747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 3685d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahvoid Overlay::setVisualParams(const MetaData_t& metadata, utils::eDest dest) { 3695d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah int index = (int)dest; 3705d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah validate(index); 3715d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mPipeBook[index].mPipe->setVisualParams(metadata); 3725d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah} 3735d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 37447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedOverlay* Overlay::getInstance() { 37547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(sInstance == NULL) { 37647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed sInstance = new Overlay(); 37747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 37847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return sInstance; 37976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah} 38076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 3816e146950e61327d425750c1de36bfd70d526acadSushil Chauhan// Clears any VG pipes allocated to the fb devices 3826e146950e61327d425750c1de36bfd70d526acadSushil Chauhan// Generates a LUT for pipe types. 3836e146950e61327d425750c1de36bfd70d526acadSushil Chauhanint Overlay::initOverlay() { 3846e146950e61327d425750c1de36bfd70d526acadSushil Chauhan int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion(); 3856e146950e61327d425750c1de36bfd70d526acadSushil Chauhan int numPipesXType[OV_MDP_PIPE_ANY] = {0}; 3866e146950e61327d425750c1de36bfd70d526acadSushil Chauhan numPipesXType[OV_MDP_PIPE_RGB] = 3876e146950e61327d425750c1de36bfd70d526acadSushil Chauhan qdutils::MDPVersion::getInstance().getRGBPipes(); 3886e146950e61327d425750c1de36bfd70d526acadSushil Chauhan numPipesXType[OV_MDP_PIPE_VG] = 3896e146950e61327d425750c1de36bfd70d526acadSushil Chauhan qdutils::MDPVersion::getInstance().getVGPipes(); 3906e146950e61327d425750c1de36bfd70d526acadSushil Chauhan numPipesXType[OV_MDP_PIPE_DMA] = 3916e146950e61327d425750c1de36bfd70d526acadSushil Chauhan qdutils::MDPVersion::getInstance().getDMAPipes(); 3926e146950e61327d425750c1de36bfd70d526acadSushil Chauhan 3936e146950e61327d425750c1de36bfd70d526acadSushil Chauhan int index = 0; 3946e146950e61327d425750c1de36bfd70d526acadSushil Chauhan for(int X = 0; X < (int)OV_MDP_PIPE_ANY; X++) { //iterate over types 3956e146950e61327d425750c1de36bfd70d526acadSushil Chauhan for(int j = 0; j < numPipesXType[X]; j++) { //iterate over num 3966e146950e61327d425750c1de36bfd70d526acadSushil Chauhan PipeBook::pipeTypeLUT[index] = (utils::eMdpPipeType)X; 3976e146950e61327d425750c1de36bfd70d526acadSushil Chauhan index++; 3986e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 3996e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 4006e146950e61327d425750c1de36bfd70d526acadSushil Chauhan 401a4ab187a1b29575833190181c3a653a4b9ab76deXiaoming Zhou if (mdpVersion < qdutils::MDSS_V5 && mdpVersion != qdutils::MDP_V3_0_4) { 4026e146950e61327d425750c1de36bfd70d526acadSushil Chauhan msmfb_mixer_info_req req; 4036e146950e61327d425750c1de36bfd70d526acadSushil Chauhan mdp_mixer_info *minfo = NULL; 4046e146950e61327d425750c1de36bfd70d526acadSushil Chauhan char name[64]; 4056e146950e61327d425750c1de36bfd70d526acadSushil Chauhan int fd = -1; 40676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah for(int i = 0; i < MAX_FB_DEVICES; i++) { 4076e146950e61327d425750c1de36bfd70d526acadSushil Chauhan snprintf(name, 64, FB_DEVICE_TEMPLATE, i); 4086e146950e61327d425750c1de36bfd70d526acadSushil Chauhan ALOGD("initoverlay:: opening the device:: %s", name); 4096e146950e61327d425750c1de36bfd70d526acadSushil Chauhan fd = ::open(name, O_RDWR, 0); 4106e146950e61327d425750c1de36bfd70d526acadSushil Chauhan if(fd < 0) { 4116e146950e61327d425750c1de36bfd70d526acadSushil Chauhan ALOGE("cannot open framebuffer(%d)", i); 4126e146950e61327d425750c1de36bfd70d526acadSushil Chauhan return -1; 4136e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 4146e146950e61327d425750c1de36bfd70d526acadSushil Chauhan //Get the mixer configuration */ 4156e146950e61327d425750c1de36bfd70d526acadSushil Chauhan req.mixer_num = i; 4166e146950e61327d425750c1de36bfd70d526acadSushil Chauhan if (ioctl(fd, MSMFB_MIXER_INFO, &req) == -1) { 4176e146950e61327d425750c1de36bfd70d526acadSushil Chauhan ALOGE("ERROR: MSMFB_MIXER_INFO ioctl failed"); 4186e146950e61327d425750c1de36bfd70d526acadSushil Chauhan close(fd); 4196e146950e61327d425750c1de36bfd70d526acadSushil Chauhan return -1; 4206e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 4216e146950e61327d425750c1de36bfd70d526acadSushil Chauhan minfo = req.info; 4226e146950e61327d425750c1de36bfd70d526acadSushil Chauhan for (int j = 0; j < req.cnt; j++) { 4236e146950e61327d425750c1de36bfd70d526acadSushil Chauhan ALOGD("ndx=%d num=%d z_order=%d", minfo->pndx, minfo->pnum, 4246e146950e61327d425750c1de36bfd70d526acadSushil Chauhan minfo->z_order); 4256e146950e61327d425750c1de36bfd70d526acadSushil Chauhan // except the RGB base layer with z_order of -1, clear any 4266e146950e61327d425750c1de36bfd70d526acadSushil Chauhan // other pipes connected to mixer. 4276e146950e61327d425750c1de36bfd70d526acadSushil Chauhan if((minfo->z_order) != -1) { 4286e146950e61327d425750c1de36bfd70d526acadSushil Chauhan int index = minfo->pndx; 4296e146950e61327d425750c1de36bfd70d526acadSushil Chauhan ALOGD("Unset overlay with index: %d at mixer %d", index, i); 4306e146950e61327d425750c1de36bfd70d526acadSushil Chauhan if(ioctl(fd, MSMFB_OVERLAY_UNSET, &index) == -1) { 4316e146950e61327d425750c1de36bfd70d526acadSushil Chauhan ALOGE("ERROR: MSMFB_OVERLAY_UNSET failed"); 4326e146950e61327d425750c1de36bfd70d526acadSushil Chauhan close(fd); 4336e146950e61327d425750c1de36bfd70d526acadSushil Chauhan return -1; 4346e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 4356e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 4366e146950e61327d425750c1de36bfd70d526acadSushil Chauhan minfo++; 4376e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 4386e146950e61327d425750c1de36bfd70d526acadSushil Chauhan close(fd); 4396e146950e61327d425750c1de36bfd70d526acadSushil Chauhan fd = -1; 4406e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 44147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 44276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 44376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah FILE *displayDeviceFP = NULL; 44476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah const int MAX_FRAME_BUFFER_NAME_SIZE = 128; 44576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 44676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; 44776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah const char *strDtvPanel = "dtv panel"; 44876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah const char *strWbPanel = "writeback panel"; 44976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 45076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah for(int num = 1; num < MAX_FB_DEVICES; num++) { 45176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah snprintf (msmFbTypePath, sizeof(msmFbTypePath), 45276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah "/sys/class/graphics/fb%d/msm_fb_type", num); 45376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah displayDeviceFP = fopen(msmFbTypePath, "r"); 45476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 45576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(displayDeviceFP){ 45676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 45776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah displayDeviceFP); 45876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 45976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(strncmp(fbType, strDtvPanel, strlen(strDtvPanel)) == 0) { 46076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sDpyFbMap[DPY_EXTERNAL] = num; 46176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } else if(strncmp(fbType, strWbPanel, strlen(strWbPanel)) == 0) { 46276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sDpyFbMap[DPY_WRITEBACK] = num; 46376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 46476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 46576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah fclose(displayDeviceFP); 46676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 46776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 46876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 4696e146950e61327d425750c1de36bfd70d526acadSushil Chauhan return 0; 47047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 47147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 47276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Overlay::displayCommit(const int& fd) { 473c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran utils::Dim lRoi, rRoi; 474c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return displayCommit(fd, lRoi, rRoi); 475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 477c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranbool Overlay::displayCommit(const int& fd, const utils::Dim& lRoi, 478c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran const utils::Dim& rRoi) { 47976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah //Commit 48076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah struct mdp_display_commit info; 48176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah memset(&info, 0, sizeof(struct mdp_display_commit)); 48276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah info.flags = MDP_DISPLAY_COMMIT_OVERLAY; 483c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.l_roi.x = lRoi.x; 484c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.l_roi.y = lRoi.y; 485c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.l_roi.w = lRoi.w; 486c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.l_roi.h = lRoi.h; 487c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.r_roi.x = rRoi.x; 488c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.r_roi.y = rRoi.y; 489c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.r_roi.w = rRoi.w; 490c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran info.r_roi.h = rRoi.h; 491bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 49276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::displayCommit(fd, info)) { 493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE("%s: commit failed", __func__); 494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 49576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 49676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 49776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 49876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 49947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::dump() const { 500d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#if PIPE_DEBUG 50147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(strlen(mDumpStr)) { //dump only on state change 502d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah ALOGD("%s\n", mDumpStr); 50347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 504d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#endif 50547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 50647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 507a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid Overlay::getDump(char *buf, size_t len) { 508a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah int totalPipes = 0; 5094762db4eb027284225be9d10f08d87252612064cSaurabh Shah const char *str = "\nOverlay State\n\n"; 510c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan strlcat(buf, str, len); 511a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 512a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah if(mPipeBook[i].valid()) { 513a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah mPipeBook[i].mPipe->getDump(buf, len); 514a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char str[64] = {'\0'}; 5154762db4eb027284225be9d10f08d87252612064cSaurabh Shah snprintf(str, 64, "Display=%d\n\n", mPipeBook[i].mDisplay); 516c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan strlcat(buf, str, len); 517a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah totalPipes++; 518a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah } 519a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah } 520a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char str_pipes[64] = {'\0'}; 5214762db4eb027284225be9d10f08d87252612064cSaurabh Shah snprintf(str_pipes, 64, "Pipes=%d\n\n", totalPipes); 522c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan strlcat(buf, str_pipes, len); 523a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah} 524a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah 5256c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhanvoid Overlay::clear(int dpy) { 5266c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 5276c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan if (mPipeBook[i].mDisplay == dpy) { 5286c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan // Mark as available for this round 5296c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan PipeBook::resetUse(i); 5306c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan PipeBook::resetAllocation(i); 5316c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan } 5326c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan } 5336c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan} 5346c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan 5351029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shahbool Overlay::validateAndSet(const int& dpy, const int& fbFd) { 5361029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah GenericPipe* pipeArray[PipeBook::NUM_PIPES]; 5371029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah memset(&pipeArray, 0, sizeof(pipeArray)); 5381029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 5391029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah int num = 0; 5401029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 5411029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah if(PipeBook::isUsed(i) && mPipeBook[i].valid() && 5421029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah mPipeBook[i].mDisplay == dpy) { 5431029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah pipeArray[num++] = mPipeBook[i].mPipe; 5441029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 5451029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 5461029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 5471029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah //Protect against misbehaving clients 5481029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah return num ? GenericPipe::validateAndSet(pipeArray, num, fbFd) : true; 5491029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah} 5501029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 551072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shahvoid Overlay::initScalar() { 552072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah if(sLibScaleHandle == NULL) { 553072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah sLibScaleHandle = dlopen("libscale.so", RTLD_NOW); 554bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah if(sLibScaleHandle) { 555bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah *(void **) &sFnProgramScale = 556bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah dlsym(sLibScaleHandle, "programScale"); 557072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah } 558072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah } 559072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah} 560072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 561072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shahvoid Overlay::destroyScalar() { 562072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah if(sLibScaleHandle) { 563072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah dlclose(sLibScaleHandle); 564072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah sLibScaleHandle = NULL; 565072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah } 566072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah} 567072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 56847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::PipeBook::init() { 56947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipe = NULL; 57047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mDisplay = DPY_UNUSED; 5711a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mMixer = MIXER_UNUSED; 57247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 57347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 57447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::PipeBook::destroy() { 57547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(mPipe) { 57647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed delete mPipe; 57747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mPipe = NULL; 57899052c13b84efd00bfc1083e454d660a31cbf38aAjay Dudani } 57947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed mDisplay = DPY_UNUSED; 5801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mMixer = MIXER_UNUSED; 58125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam mSession = NONE; 582befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 583befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 58447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedOverlay* Overlay::sInstance = 0; 58576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahint Overlay::sDpyFbMap[DPY_MAX] = {0, -1, -1}; 58611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahint Overlay::sDMAMode = DMA_LINE_MODE; 587531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamalbool Overlay::sDMAMultiplexingSupported = false; 58847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::NUM_PIPES = 0; 58947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::sPipeUsageBitmap = 0; 59047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::sLastUsageBitmap = 0; 59147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::sAllocatedBitmap = 0; 5926e146950e61327d425750c1de36bfd70d526acadSushil Chauhanutils::eMdpPipeType Overlay::PipeBook::pipeTypeLUT[utils::OV_MAX] = 5936e146950e61327d425750c1de36bfd70d526acadSushil Chauhan {utils::OV_MDP_PIPE_ANY}; 594072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shahvoid *Overlay::sLibScaleHandle = NULL; 595bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shahint (*Overlay::sFnProgramScale)(struct mdp_overlay_list *) = NULL; 59647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 59747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}; // namespace overlay 598