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