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