1bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah/* 247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Copyright (C) 2008 The Android Open Source Project 3fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R * Copyright (c) 2010-2014, 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. 18bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah*/ 19bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 20bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah#include "overlayUtils.h" 21bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah#include "overlayRotator.h" 22bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 2330323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan#define DEBUG_MDSS_ROT 0 2430323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan 25da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#ifdef VENUS_COLOR_FORMAT 26da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#include <media/msm_media_info.h> 27da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#else 28da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#define VENUS_BUFFER_SIZE(args...) 0 29da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#endif 30da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan 31a34d74561f653dd083c7f3765fce719eafb88521Naseer Ahmed#ifndef MDSS_MDP_ROT_ONLY 32a34d74561f653dd083c7f3765fce719eafb88521Naseer Ahmed#define MDSS_MDP_ROT_ONLY 0x80 33a34d74561f653dd083c7f3765fce719eafb88521Naseer Ahmed#endif 34a34d74561f653dd083c7f3765fce719eafb88521Naseer Ahmed 3526a80a197c792e833131a2abc923d52db732d5a3Sushil Chauhan#define MDSS_ROT_MASK (MDP_ROT_90 | MDP_FLIP_UD | MDP_FLIP_LR) 36201b32ddd456ed8ffe60818d57e88d43e7ac08c6Sushil Chauhan 37bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahnamespace ovutils = overlay::utils; 38bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 39bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahnamespace overlay { 40cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shahusing namespace utils; 41cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 4247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedMdssRot::MdssRot() { 4347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed reset(); 4447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed init(); 4547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 4747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedMdssRot::~MdssRot() { close(); } 4847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 49327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahbool MdssRot::enabled() const { return mEnabled; } 5047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 51327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdssRot::setRotations(uint32_t flags) { mRotInfo.flags |= flags; } 5247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 53327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahint MdssRot::getDstMemId() const { 5447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return mRotData.dst_data.memory_id; 5547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 5647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 57327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahuint32_t MdssRot::getDstOffset() const { 5847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return mRotData.dst_data.offset; 5947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 6047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 61327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahuint32_t MdssRot::getDstFormat() const { 6247c130ffbafe12d6ddf6e8df4ffdd9916318c379Raj kamal //For mdss src and dst formats are same 6347c130ffbafe12d6ddf6e8df4ffdd9916318c379Raj kamal return mRotInfo.src.format; 6447c130ffbafe12d6ddf6e8df4ffdd9916318c379Raj kamal} 6547c130ffbafe12d6ddf6e8df4ffdd9916318c379Raj kamal 66327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahuint32_t MdssRot::getSessId() const { return mRotInfo.id; } 6747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 68327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahbool MdssRot::init() { 69bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if(!utils::openDev(mFd, 0, Res::fbPath, O_RDWR)) { 70bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("MdssRot failed to init fb0"); 71bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return false; 72bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 73bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return true; 74bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 75bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 76bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahvoid MdssRot::setSource(const overlay::utils::Whf& awhf) { 77bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah utils::Whf whf(awhf); 78bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 79bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotInfo.src.format = whf.format; 80bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotInfo.src.width = whf.w; 81bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotInfo.src.height = whf.h; 82e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan} 83e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan 84e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhanvoid MdssRot::setCrop(const utils::Dim& crop) { 85bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 86e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.src_rect.x = crop.x; 87e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.src_rect.y = crop.y; 88e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.src_rect.w = crop.w; 89e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.src_rect.h = crop.h; 90bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 91e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.dst_rect.x = 0; 92e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.dst_rect.y = 0; 93e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.dst_rect.w = crop.w; 94e7fd567eb00aea104a726a88540dba639e17bf29Sushil Chauhan mRotInfo.dst_rect.h = crop.h; 95bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 96bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 97fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.Rvoid MdssRot::setDownscale(int /*ds*/) { 98fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R} 998b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan 100327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdssRot::setFlags(const utils::eMdpFlags& flags) { 1019bea850d6ebbb94c6e5806e5914b2c2aa376269cSushil Chauhan mRotInfo.flags = flags; 102bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 103bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 104327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdssRot::setTransform(const utils::eTransform& rot) 105bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah{ 106565bcd227933ac067efa29c52a9660f04f3c976fSaurabh Shah // reset rotation flags to avoid stale orientation values 107565bcd227933ac067efa29c52a9660f04f3c976fSaurabh Shah mRotInfo.flags &= ~MDSS_ROT_MASK; 108bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah int flags = utils::getMdpOrient(rot); 109bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if (flags != -1) 110bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah setRotations(flags); 111bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mOrientation = static_cast<utils::eTransform>(flags); 112bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE_IF(DEBUG_OVERLAY, "%s: rot=%d", __FUNCTION__, flags); 1138b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan} 114bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 115327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdssRot::doTransform() { 1169bea850d6ebbb94c6e5806e5914b2c2aa376269cSushil Chauhan mRotInfo.flags |= mOrientation; 117bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90) 118bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah utils::swap(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h); 119bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 120bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 121bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahbool MdssRot::commit() { 122bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah doTransform(); 123bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotInfo.flags |= MDSS_MDP_ROT_ONLY; 124327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah mEnabled = true; 125bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if(!overlay::mdp_wrapper::setOverlay(mFd.getFD(), mRotInfo)) { 126bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("MdssRot commit failed!"); 127bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah dump(); 128327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return (mEnabled = false); 129bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 130bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.id = mRotInfo.id; 131bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return true; 132bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 133bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 134bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahbool MdssRot::queueBuffer(int fd, uint32_t offset) { 135bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if(enabled()) { 136bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.data.memory_id = fd; 137bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.data.offset = offset; 138bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 1398bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah if(false == remap(RotMem::ROT_NUM_BUFS)) { 1408bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah ALOGE("%s Remap failed, not queuing", __FUNCTION__); 1418bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah return false; 1428bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah } 143bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 144bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.dst_data.offset = 1458bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah mMem.mRotOffset[mMem.mCurrIndex]; 1468bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah mMem.mCurrIndex = 1478bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah (mMem.mCurrIndex + 1) % mMem.mem.numBufs(); 148bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 149bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if(!overlay::mdp_wrapper::play(mFd.getFD(), mRotData)) { 150bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("MdssRot play failed!"); 151bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah dump(); 152bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return false; 153bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 154bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 155bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return true; 156bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 157bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 158bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahbool MdssRot::open_i(uint32_t numbufs, uint32_t bufsz) 159bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah{ 160bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah OvMem mem; 161bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i"); 1620522d5648711e45384699d4ccb295d64e7227c87Sushil Chauhan bool isSecure = mRotInfo.flags & utils::OV_MDP_SECURE_OVERLAY_SESSION; 163bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 1640522d5648711e45384699d4ccb295d64e7227c87Sushil Chauhan if(!mem.open(numbufs, bufsz, isSecure)){ 165bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("%s: Failed to open", __func__); 166bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mem.close(); 167bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return false; 168bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 169bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 170bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah OVASSERT(MAP_FAILED != mem.addr(), "MAP failed"); 171bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah OVASSERT(mem.getFD() != -1, "getFd is -1"); 172bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 173bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.dst_data.memory_id = mem.getFD(); 174bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.dst_data.offset = 0; 1758bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah mMem.mem = mem; 176bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return true; 177bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 178bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 179bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahbool MdssRot::remap(uint32_t numbufs) { 180e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah // Calculate the size based on rotator's dst format, w and h. 181e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah uint32_t opBufSize = calcOutputBufSize(); 182e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah // If current size changed, remap 1838bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah if(opBufSize == mMem.size()) { 184e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah ALOGE_IF(DEBUG_OVERLAY, "%s: same size %d", __FUNCTION__, opBufSize); 185bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return true; 186bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 187bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 188bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE_IF(DEBUG_OVERLAY, "%s: size changed - remapping", __FUNCTION__); 189bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 1908bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah if(!mMem.close()) { 1918bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah ALOGE("%s error in closing prev rot mem", __FUNCTION__); 1928bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah return false; 1938bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah } 1948bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah 195e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah if(!open_i(numbufs, opBufSize)) { 196bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("%s Error could not open", __FUNCTION__); 197bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return false; 198bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 1998bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah 200bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah for (uint32_t i = 0; i < numbufs; ++i) { 2018bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah mMem.mRotOffset[i] = i * opBufSize; 202bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 2038bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah 204bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return true; 205bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 206bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 207bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahbool MdssRot::close() { 208bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah bool success = true; 209df785e9cf231c7ff755920e60553fc743c0de64dKen Zhang if(mFd.valid() && (getSessId() != (uint32_t) MSMFB_NEW_REQUEST)) { 210bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if(!mdp_wrapper::unsetOverlay(mFd.getFD(), getSessId())) { 211bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("MdssRot::close unsetOverlay failed, fd=%d sessId=%d", 212bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mFd.getFD(), getSessId()); 213df785e9cf231c7ff755920e60553fc743c0de64dKen Zhang success = false; 214df785e9cf231c7ff755920e60553fc743c0de64dKen Zhang } 215bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 216bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 217bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if (!mFd.close()) { 218bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("Mdss Rot error closing fd"); 219bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah success = false; 220bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 221bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah if (!mMem.close()) { 222bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("Mdss Rot error closing mem"); 223bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah success = false; 224bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah } 225bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah reset(); 226bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah return success; 227bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 228bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 229bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahvoid MdssRot::reset() { 230bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ovutils::memset0(mRotInfo); 231bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ovutils::memset0(mRotData); 232bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotData.data.memory_id = -1; 233bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mRotInfo.id = MSMFB_NEW_REQUEST; 2348bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah ovutils::memset0(mMem.mRotOffset); 2358bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah mMem.mCurrIndex = 0; 236bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mOrientation = utils::OVERLAY_TRANSFORM_0; 237bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 238bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 239bf4ef717fabff427327613de76b69f964c51484dSaurabh Shahvoid MdssRot::dump() const { 240bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("== Dump MdssRot start =="); 241bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mFd.dump(); 2428bc12cba5e3e8377cd5ea3410609af005c01335dSaurabh Shah mMem.mem.dump(); 243bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mdp_wrapper::dump("mRotInfo", mRotInfo); 244bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah mdp_wrapper::dump("mRotData", mRotData); 245bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah ALOGE("== Dump MdssRot end =="); 246bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} 247bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah 248e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shahuint32_t MdssRot::calcOutputBufSize() { 249e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah uint32_t opBufSize = 0; 250e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah ovutils::Whf destWhf(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h, 251e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah mRotInfo.src.format); //mdss src and dst formats are same. 252e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah 25330323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan if (mRotInfo.flags & ovutils::OV_MDSS_MDP_BWC_EN) { 254b79d3ca8afad0421450869bd3058d15b71201a30Sushil Chauhan opBufSize = calcCompressedBufSize(destWhf); 25530323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan } else { 25630323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan opBufSize = Rotator::calcOutputBufSize(destWhf); 25730323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan } 2586be1d0f8c034cbb734a770fc04f00615cea943aaSushil Chauhan 259e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah return opBufSize; 260270550d926a2e3c4d65b9c1c1d3b696f8a49b4ccSushil Chauhan} 261a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah 262a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid MdssRot::getDump(char *buf, size_t len) const { 2634762db4eb027284225be9d10f08d87252612064cSaurabh Shah ovutils::getDump(buf, len, "MdssRotCtrl", mRotInfo); 2644762db4eb027284225be9d10f08d87252612064cSaurabh Shah ovutils::getDump(buf, len, "MdssRotData", mRotData); 265a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah} 266a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah 26730323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan// Calculate the compressed o/p buffer size for BWC 268b79d3ca8afad0421450869bd3058d15b71201a30Sushil Chauhanuint32_t MdssRot::calcCompressedBufSize(const ovutils::Whf& destWhf) { 26930323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan uint32_t bufSize = 0; 270cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah //Worst case alignments 271b79d3ca8afad0421450869bd3058d15b71201a30Sushil Chauhan int aWidth = ovutils::align(destWhf.w, 64); 272b79d3ca8afad0421450869bd3058d15b71201a30Sushil Chauhan int aHeight = ovutils::align(destWhf.h, 4); 273cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah /* 274cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah Format | RAU size (width x height) 275cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah ---------------------------------------------- 276cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah ARGB | 32 pixel x 4 line 277cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah RGB888 | 32 pixel x 4 line 278cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah Y (Luma) | 64 pixel x 4 line 279cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah CRCB 420 | 32 pixel x 2 line 280cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah CRCB 422 H2V1 | 32 pixel x 4 line 281cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah CRCB 422 H1V2 | 64 pixel x 2 line 282cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 283cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah Metadata requirements:- 284cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 1 byte meta data for every 8 RAUs 285cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 2 byte meta data per RAU 286cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah */ 287cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 288cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah //These blocks attempt to allocate for the worst case in each of the 289cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah //respective format classes, yuv/rgb. The table above is for reference 290cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah if(utils::isYuv(destWhf.format)) { 291cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int yRauCount = aWidth / 64; //Y 292cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int cRauCount = aWidth / 32; //C 293cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int yStride = (64 * 4 * yRauCount) + alignup(yRauCount, 8) / 8; 294cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int cStride = ((32 * 2 * cRauCount) + alignup(cRauCount, 8) / 8) * 2; 295cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int yStrideOffset = (aHeight / 4); 296cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int cStrideOffset = (aHeight / 2); 297cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah bufSize = (yStride * yStrideOffset + cStride * cStrideOffset) + 298cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah (yRauCount * yStrideOffset * 2) + 299cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah (cRauCount * cStrideOffset * 2) * 2; 300cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s:YUV Y RAU Count = %d C RAU Count = %d", 301cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah __FUNCTION__, yRauCount, cRauCount); 302cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah } else { 303cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int rauCount = aWidth / 32; 304cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah //Single plane 305cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int stride = (32 * 4 * rauCount) + alignup(rauCount, 8) / 8; 306cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah int strideOffset = (aHeight / 4); 307cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah bufSize = (stride * strideOffset * 4 /*bpp*/) + 308cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah (rauCount * strideOffset * 2); 309cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s:RGB RAU count = %d", __FUNCTION__, 310cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah rauCount); 311cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah } 312cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 313cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s: aligned width = %d, aligned height = %d " 314cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah "Buf Size = %d", __FUNCTION__, aWidth, aHeight, bufSize); 315cbefbc5940c49ab5eb7af4fb3e4dc229e617c0c2Saurabh Shah 31630323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan return bufSize; 31730323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan} 31830323b98c1abab90dce91c3d226d4e65a24076fcSushil Chauhan 319bf4ef717fabff427327613de76b69f964c51484dSaurabh Shah} // namespace overlay 320