1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Copyright (C) 2008 The Android Open Source Project
347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * for attribution purposes only.
647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed *
747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * you may not use this file except in compliance with the License.
947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * You may obtain a copy of the License at
1047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed *
1147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed *
1347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
1447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * See the License for the specific language governing permissions and
1747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * limitations under the License.
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*/
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayRotator.h"
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayUtils.h"
22bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah#include "mdp_version.h"
23e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah#include "gr.h"
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace ovutils = overlay::utils;
26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace overlay {
28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
2943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah//============Rotator=========================
3043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
3147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedRotator::~Rotator() {}
3247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
3347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedRotator* Rotator::getRotator() {
3447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int type = getRotatorHwType();
3547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(type == TYPE_MDP) {
3647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        return new MdpRot(); //will do reset
3747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    } else if(type == TYPE_MDSS) {
3847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        return new MdssRot();
3947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    } else {
4047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        ALOGE("%s Unknown h/w type %d", __FUNCTION__, type);
4147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        return NULL;
4247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    }
4347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
4447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
45e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shahuint32_t Rotator::calcOutputBufSize(const utils::Whf& destWhf) {
46e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    //dummy aligned w & h.
47e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    int alW = 0, alH = 0;
48e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    int halFormat = ovutils::getHALFormat(destWhf.format);
49e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    //A call into gralloc/memalloc
50e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    return getBufferSizeAndDimensions(
51e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah            destWhf.w, destWhf.h, halFormat, alW, alH);
52e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah}
53e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah
5447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Rotator::getRotatorHwType() {
55bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah    int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion();
56bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah    if (mdpVersion == qdutils::MDSS_V5)
57bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah        return TYPE_MDSS;
58ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    return TYPE_MDP;
59ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
6143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
6243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah//============RotMem=========================
6343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
64ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedbool RotMem::close() {
65ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    bool ret = true;
668bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah    if(valid()) {
678bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah        if(mem.close() == false) {
688bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah            ALOGE("%s error in closing rot mem", __FUNCTION__);
698bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah            ret = false;
70ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed        }
71ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    }
72ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    return ret;
73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
74befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
758bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh ShahRotMem::RotMem() : mCurrIndex(0) {
7643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    utils::memset0(mRotOffset);
7743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    for(int i = 0; i < ROT_NUM_BUFS; i++) {
7843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        mRelFence[i] = -1;
7943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    }
8043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah}
8143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
828bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh ShahRotMem::~RotMem() {
8343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    for(int i = 0; i < ROT_NUM_BUFS; i++) {
8443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        ::close(mRelFence[i]);
8543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        mRelFence[i] = -1;
8643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    }
8743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah}
8843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
898bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shahvoid RotMem::setReleaseFd(const int& fence) {
9043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    int ret = 0;
9143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
928bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah    if(mRelFence[mCurrIndex] >= 0) {
9343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        //Wait for previous usage of this buffer to be over.
9443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        //Can happen if rotation takes > vsync and a fast producer. i.e queue
9543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        //happens in subsequent vsyncs either because content is 60fps or
9643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        //because the producer is hasty sometimes.
978bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah        ret = sync_wait(mRelFence[mCurrIndex], 1000);
9843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        if(ret < 0) {
9943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah            ALOGE("%s: sync_wait error!! error no = %d err str = %s",
10043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah                __FUNCTION__, errno, strerror(errno));
10143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        }
1028bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah        ::close(mRelFence[mCurrIndex]);
10343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    }
1048bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah    mRelFence[mCurrIndex] = fence;
10543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah}
10643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
10743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah//============RotMgr=========================
108834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh ShahRotMgr * RotMgr::sRotMgr = NULL;
109834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh Shah
110834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh ShahRotMgr* RotMgr::getInstance() {
111834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh Shah    if(sRotMgr == NULL) {
112834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh Shah        sRotMgr = new RotMgr();
113834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh Shah    }
114834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh Shah    return sRotMgr;
115834852cce5c3e5ab2eabde1c6ca151228abbac6fSaurabh Shah}
11643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
117327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh ShahRotMgr::RotMgr() {
118327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    for(int i = 0; i < MAX_ROT_SESS; i++) {
119327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        mRot[i] = 0;
120327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    }
121327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    mUseCount = 0;
12243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    mRotDevFd = -1;
123327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
124327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
125327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh ShahRotMgr::~RotMgr() {
126327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    clear();
127327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
128327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
129327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid RotMgr::configBegin() {
130327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    //Reset the number of objects used
131327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    mUseCount = 0;
132327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
133327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
134327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid RotMgr::configDone() {
135327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    //Remove the top most unused objects. Videos come and go.
136327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    for(int i = mUseCount; i < MAX_ROT_SESS; i++) {
137327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(mRot[i]) {
138327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            delete mRot[i];
139327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            mRot[i] = 0;
140327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
141327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    }
142327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
143327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
144327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh ShahRotator* RotMgr::getNext() {
145327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    //Return a rot object, creating one if necessary
146327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    overlay::Rotator *rot = NULL;
147327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    if(mUseCount >= MAX_ROT_SESS) {
148d28bdc304736bee79cf2756e0504d5cb5310074aSaurabh Shah        ALOGW("%s, MAX rotator sessions reached, request rejected", __func__);
149327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    } else {
150327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(mRot[mUseCount] == NULL)
151327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            mRot[mUseCount] = overlay::Rotator::getRotator();
152327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        rot = mRot[mUseCount++];
153327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    }
154327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    return rot;
155327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
156327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
157327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid RotMgr::clear() {
158327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    //Brute force obj destruction, helpful in suspend.
159327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    for(int i = 0; i < MAX_ROT_SESS; i++) {
160327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(mRot[i]) {
161327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            delete mRot[i];
162327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            mRot[i] = 0;
163327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
164327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    }
165327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    mUseCount = 0;
16643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    ::close(mRotDevFd);
16743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    mRotDevFd = -1;
168327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
169327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
170327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid RotMgr::getDump(char *buf, size_t len) {
171327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    for(int i = 0; i < MAX_ROT_SESS; i++) {
172327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(mRot[i]) {
173327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            mRot[i]->getDump(buf, len);
174327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
175327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    }
176d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    char str[4] = {'\0'};
177d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    snprintf(str, 4, "\n");
178c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan    strlcat(buf, str, len);
179327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}
180327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
18143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahint RotMgr::getRotDevFd() {
182050c8e4005bd400436a48e34289b8ce7defe614dSaurabh Shah    if(mRotDevFd < 0 && Rotator::getRotatorHwType() == Rotator::TYPE_MDSS) {
183050c8e4005bd400436a48e34289b8ce7defe614dSaurabh Shah        mRotDevFd = ::open("/dev/graphics/fb0", O_RDWR, 0);
18443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        if(mRotDevFd < 0) {
185050c8e4005bd400436a48e34289b8ce7defe614dSaurabh Shah            ALOGE("%s failed to open fb0", __FUNCTION__);
18643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah        }
18743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    }
18843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah    return mRotDevFd;
18943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah}
19043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah
191befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
192