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