1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* 2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2008 The Android Open Source Project 3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. 4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Not a Contribution, Apache license notifications and license are retained 5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * for attribution purposes only. 6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License"); 8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License. 9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at 10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * http://www.apache.org/licenses/LICENSE-2.0 12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software 14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS, 15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and 17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License. 18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*/ 19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayUtils.h" 21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayRotator.h" 22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 23b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace ovutils = overlay::utils; 24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 25b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace overlay { 26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 27b166940edca6e312463461438e2aa66e9852c26aBenoit GobyMdpRot::MdpRot() { 28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby reset(); 29b166940edca6e312463461438e2aa66e9852c26aBenoit Goby init(); 30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 32b166940edca6e312463461438e2aa66e9852c26aBenoit GobyMdpRot::~MdpRot() { close(); } 33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 34b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::enabled() const { return mRotImgInfo.enable; } 35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 36b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setRotations(uint32_t r) { mRotImgInfo.rotations = r; } 37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 38b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint MdpRot::getDstMemId() const { 39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return mRotDataInfo.dst.memory_id; 40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 42b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::getDstOffset() const { 43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return mRotDataInfo.dst.offset; 44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 46b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::getDstFormat() const { 47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return mRotImgInfo.dst.format; 48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 50b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::getSessId() const { return mRotImgInfo.session_id; } 51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 52b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setDownscale(int ds) { 53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if ((utils::ROT_DS_EIGHTH == ds) && (mRotImgInfo.src_rect.h & 0xF)) { 54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // Ensure src_rect.h is a multiple of 16 for 1/8 downscaling. 55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // This is an undocumented MDP Rotator constraint. 56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.src_rect.h = utils::aligndown(mRotImgInfo.src_rect.h, 16); 57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.downscale_ratio = ds; 59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 61b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::save() { 62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mLSRotImgInfo = mRotImgInfo; 63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 65b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::rotConfChanged() const { 66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // 0 means same 67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(0 == ::memcmp(&mRotImgInfo, &mLSRotImgInfo, 68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sizeof (msm_rotator_img_info))) { 69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 74b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::init() 75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{ 76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!mFd.open(Res::rotPath, O_RDWR)){ 77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("MdpRot failed to init %s", Res::rotPath); 78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 83b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setSource(const overlay::utils::Whf& awhf) { 84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::Whf whf(awhf); 85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.src.format = whf.format; 86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.src.width = whf.w; 88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.src.height = whf.h; 89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.src_rect.w = whf.w; 91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.src_rect.h = whf.h; 92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.dst.width = whf.w; 94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.dst.height = whf.h; 95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 97b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setFlags(const utils::eMdpFlags& flags) { 98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.secure = 0; 99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(flags & utils::OV_MDP_SECURE_OVERLAY_SESSION) 100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.secure = 1; 101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 103b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setTransform(const utils::eTransform& rot) 104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{ 105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int r = utils::getMdpOrient(rot); 106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby setRotations(r); 107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //getMdpOrient will switch the flips if the source is 90 rotated. 108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Clients in Android dont factor in 90 rotation while deciding the flip. 109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mOrientation = static_cast<utils::eTransform>(r); 110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE_IF(DEBUG_OVERLAY, "%s: r=%d", __FUNCTION__, r); 111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 113b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::doTransform() { 114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90) 115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby utils::swap(mRotImgInfo.dst.width, mRotImgInfo.dst.height); 116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 118b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::commit() { 119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby doTransform(); 120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(rotConfChanged()) { 121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.enable = 1; 122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!overlay::mdp_wrapper::startRotator(mFd.getFD(), mRotImgInfo)) { 123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("MdpRot commit failed"); 124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby dump(); 125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.enable = 0; 126b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 127b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby save(); 129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotDataInfo.session_id = mRotImgInfo.session_id; 130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 134b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::calcOutputBufSize() { 135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Whf destWhf(mRotImgInfo.dst.width, 136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotImgInfo.dst.height, mRotImgInfo.dst.format); 137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return Rotator::calcOutputBufSize(destWhf); 138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 140b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::open_i(uint32_t numbufs, uint32_t bufsz) 141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{ 142b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OvMem mem; 143b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i"); 145b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!mem.open(numbufs, bufsz, mRotImgInfo.secure)){ 147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: Failed to open", __func__); 148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mem.close(); 149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 151b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(MAP_FAILED != mem.addr(), "MAP failed"); 153b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(mem.getFD() != -1, "getFd is -1"); 154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotDataInfo.dst.memory_id = mem.getFD(); 156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotDataInfo.dst.offset = 0; 157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.curr().m = mem; 158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 161b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::close() { 162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool success = true; 163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mFd.valid() && (getSessId() != 0)) { 164b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!mdp_wrapper::endRotator(mFd.getFD(), getSessId())) { 165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("Mdp Rot error endRotator, fd=%d sessId=%u", 166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mFd.getFD(), getSessId()); 167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby success = false; 168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!mFd.close()) { 171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("Mdp Rot error closing fd"); 172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby success = false; 173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!mMem.close()) { 175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("Mdp Rot error closing mem"); 176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby success = false; 177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby reset(); 179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return success; 180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 182b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::remap(uint32_t numbufs) { 183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // if current size changed, remap 184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby uint32_t opBufSize = calcOutputBufSize(); 185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(opBufSize == mMem.curr().size()) { 186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE_IF(DEBUG_OVERLAY, "%s: same size %d", __FUNCTION__, opBufSize); 187b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE_IF(DEBUG_OVERLAY, "%s: size changed - remapping", __FUNCTION__); 191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(!mMem.prev().valid(), "Prev should not be valid"); 192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // ++mMem will make curr to be prev, and prev will be curr 194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ++mMem; 195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!open_i(numbufs, opBufSize)) { 196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s Error could not open", __FUNCTION__); 197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 198b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby for (uint32_t i = 0; i < numbufs; ++i) { 200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.curr().mRotOffset[i] = i * opBufSize; 201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 205b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::reset() { 206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::memset0(mRotImgInfo); 207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::memset0(mLSRotImgInfo); 208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::memset0(mRotDataInfo); 209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::memset0(mMem.curr().mRotOffset); 210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::memset0(mMem.prev().mRotOffset); 211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.curr().mCurrOffset = 0; 212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.prev().mCurrOffset = 0; 213b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mOrientation = utils::OVERLAY_TRANSFORM_0; 214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 215b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 216b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::queueBuffer(int fd, uint32_t offset) { 217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(enabled()) { 218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotDataInfo.src.memory_id = fd; 219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotDataInfo.src.offset = offset; 220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby remap(RotMem::Mem::ROT_NUM_BUFS); 222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby OVASSERT(mMem.curr().m.numBufs(), 223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby "queueBuffer numbufs is 0"); 224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mRotDataInfo.dst.offset = 225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.curr().mRotOffset[mMem.curr().mCurrOffset]; 226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.curr().mCurrOffset = 227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (mMem.curr().mCurrOffset + 1) % mMem.curr().m.numBufs(); 228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!overlay::mdp_wrapper::rotate(mFd.getFD(), mRotDataInfo)) { 230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("MdpRot failed rotate"); 231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby dump(); 232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // if the prev mem is valid, we need to close 236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mMem.prev().valid()) { 237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // FIXME if no wait for vsync the above 238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // play will return immediatly and might cause 239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // tearing when prev.close is called. 240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!mMem.prev().close()) { 241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s error in closing prev rot mem", __FUNCTION__); 242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 244b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 249b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::dump() const { 250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("== Dump MdpRot start =="); 251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mFd.dump(); 252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mMem.curr().m.dump(); 253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mdp_wrapper::dump("mRotImgInfo", mRotImgInfo); 254b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mdp_wrapper::dump("mRotDataInfo", mRotDataInfo); 255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("== Dump MdpRot end =="); 256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 258b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::getDump(char *buf, size_t len) const { 259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::getDump(buf, len, "MdpRotCtrl(msm_rotator_img_info)", mRotImgInfo); 260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::getDump(buf, len, "MdpRotData(msm_rotator_data_info)", mRotDataInfo); 261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} // namespace overlay 264