overlayMdssRot.cpp revision e157971a9f51057686971c0e2c82403ca1756896
1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2008 The Android Open Source Project 3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are retained 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * for attribution purposes only. 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*/ 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "overlayUtils.h" 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "overlayRotator.h" 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define DEBUG_MDSS_ROT 0 24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef VENUS_COLOR_FORMAT 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <media/msm_media_info.h> 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#else 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define VENUS_BUFFER_SIZE(args...) 0 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef MDSS_MDP_ROT_ONLY 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MDSS_MDP_ROT_ONLY 0x80 33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MDSS_ROT_MASK (MDP_ROT_90 | MDP_FLIP_UD | MDP_FLIP_LR) 36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace ovutils = overlay::utils; 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace overlay { 40e157971a9f51057686971c0e2c82403ca1756896Saurabh Shahusing namespace utils; 41e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonMdssRot::MdssRot() { 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson reset(); 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson init(); 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonMdssRot::~MdssRot() { close(); } 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::enabled() const { return mEnabled; } 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setRotations(uint32_t flags) { mRotInfo.flags |= flags; } 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint MdssRot::getDstMemId() const { 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return mRotData.dst_data.memory_id; 55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::getDstOffset() const { 58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return mRotData.dst_data.offset; 59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::getDstFormat() const { 62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For mdss src and dst formats are same 63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return mRotInfo.src.format; 64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::getSessId() const { return mRotInfo.id; } 67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::init() { 69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!utils::openDev(mFd, 0, Res::fbPath, O_RDWR)) { 70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot failed to init fb0"); 71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setSource(const overlay::utils::Whf& awhf) { 77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson utils::Whf whf(awhf); 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.format = whf.format; 80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.width = whf.w; 81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.height = whf.h; 82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setCrop(const utils::Dim& crop) { 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.x = crop.x; 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.y = crop.y; 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.w = crop.w; 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.h = crop.h; 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.dst_rect.x = 0; 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.dst_rect.y = 0; 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.dst_rect.w = crop.w; 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.dst_rect.h = crop.h; 95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 97a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid MdssRot::setDownscale(int /*ds*/) { 98a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setFlags(const utils::eMdpFlags& flags) { 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags = flags; 102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setTransform(const utils::eTransform& rot) 105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // reset rotation flags to avoid stale orientation values 107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags &= ~MDSS_ROT_MASK; 108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int flags = utils::getMdpOrient(rot); 109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (flags != -1) 110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson setRotations(flags); 111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mOrientation = static_cast<utils::eTransform>(flags); 112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE_IF(DEBUG_OVERLAY, "%s: rot=%d", __FUNCTION__, flags); 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::doTransform() { 116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags |= mOrientation; 117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90) 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson utils::swap(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h); 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::commit() { 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson doTransform(); 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags |= MDSS_MDP_ROT_ONLY; 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mEnabled = true; 125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!overlay::mdp_wrapper::setOverlay(mFd.getFD(), mRotInfo)) { 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot commit failed!"); 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dump(); 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return (mEnabled = false); 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.id = mRotInfo.id; 131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::queueBuffer(int fd, uint32_t offset) { 135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(enabled()) { 136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.data.memory_id = fd; 137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.data.offset = offset; 138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(false == remap(RotMem::ROT_NUM_BUFS)) { 140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s Remap failed, not queuing", __FUNCTION__); 141a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 142a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.dst_data.offset = 145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mRotOffset[mMem.mCurrIndex]; 146a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mCurrIndex = 147a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (mMem.mCurrIndex + 1) % mMem.mem.numBufs(); 148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!overlay::mdp_wrapper::play(mFd.getFD(), mRotData)) { 150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot play failed!"); 151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dump(); 152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::open_i(uint32_t numbufs, uint32_t bufsz) 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OvMem mem; 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i"); 162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool isSecure = mRotInfo.flags & utils::OV_MDP_SECURE_OVERLAY_SESSION; 163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!mem.open(numbufs, bufsz, isSecure)){ 165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Failed to open", __func__); 166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mem.close(); 167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OVASSERT(MAP_FAILED != mem.addr(), "MAP failed"); 171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OVASSERT(mem.getFD() != -1, "getFd is -1"); 172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.dst_data.memory_id = mem.getFD(); 174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.dst_data.offset = 0; 175a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mem = mem; 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::remap(uint32_t numbufs) { 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Calculate the size based on rotator's dst format, w and h. 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t opBufSize = calcOutputBufSize(); 182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // If current size changed, remap 183a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(opBufSize == mMem.size()) { 184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE_IF(DEBUG_OVERLAY, "%s: same size %d", __FUNCTION__, opBufSize); 185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE_IF(DEBUG_OVERLAY, "%s: size changed - remapping", __FUNCTION__); 189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 190a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!mMem.close()) { 191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s error in closing prev rot mem", __FUNCTION__); 192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 193a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 194a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!open_i(numbufs, opBufSize)) { 196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s Error could not open", __FUNCTION__); 197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (uint32_t i = 0; i < numbufs; ++i) { 201a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mRotOffset[i] = i * opBufSize; 202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 203a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::close() { 208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool success = true; 209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(mFd.valid() && (getSessId() != (uint32_t) MSMFB_NEW_REQUEST)) { 210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!mdp_wrapper::unsetOverlay(mFd.getFD(), getSessId())) { 211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot::close unsetOverlay failed, fd=%d sessId=%d", 212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mFd.getFD(), getSessId()); 213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson success = false; 214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!mFd.close()) { 218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Mdss Rot error closing fd"); 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson success = false; 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!mMem.close()) { 222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Mdss Rot error closing mem"); 223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson success = false; 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson reset(); 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return success; 227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::reset() { 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::memset0(mRotInfo); 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::memset0(mRotData); 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.data.memory_id = -1; 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.id = MSMFB_NEW_REQUEST; 234a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::memset0(mMem.mRotOffset); 235a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mCurrIndex = 0; 236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mOrientation = utils::OVERLAY_TRANSFORM_0; 237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::dump() const { 240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("== Dump MdssRot start =="); 241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mFd.dump(); 242a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mem.dump(); 243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mdp_wrapper::dump("mRotInfo", mRotInfo); 244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mdp_wrapper::dump("mRotData", mRotData); 245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("== Dump MdssRot end =="); 246ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::calcOutputBufSize() { 249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t opBufSize = 0; 250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::Whf destWhf(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h, 251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.format); //mdss src and dst formats are same. 252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (mRotInfo.flags & ovutils::OV_MDSS_MDP_BWC_EN) { 254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson opBufSize = calcCompressedBufSize(destWhf); 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson opBufSize = Rotator::calcOutputBufSize(destWhf); 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return opBufSize; 260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::getDump(char *buf, size_t len) const { 263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::getDump(buf, len, "MdssRotCtrl", mRotInfo); 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::getDump(buf, len, "MdssRotData", mRotData); 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Calculate the compressed o/p buffer size for BWC 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::calcCompressedBufSize(const ovutils::Whf& destWhf) { 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t bufSize = 0; 270e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //Worst case alignments 271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int aWidth = ovutils::align(destWhf.w, 64); 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int aHeight = ovutils::align(destWhf.h, 4); 273e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah /* 274e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah Format | RAU size (width x height) 275e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ---------------------------------------------- 276e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ARGB | 32 pixel x 4 line 277e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah RGB888 | 32 pixel x 4 line 278e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah Y (Luma) | 64 pixel x 4 line 279e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah CRCB 420 | 32 pixel x 2 line 280e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah CRCB 422 H2V1 | 32 pixel x 4 line 281e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah CRCB 422 H1V2 | 64 pixel x 2 line 282e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 283e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah Metadata requirements:- 284e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 1 byte meta data for every 8 RAUs 285e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 2 byte meta data per RAU 286e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah */ 287e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 288e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //These blocks attempt to allocate for the worst case in each of the 289e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //respective format classes, yuv/rgb. The table above is for reference 290e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah if(utils::isYuv(destWhf.format)) { 291e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int yRauCount = aWidth / 64; //Y 292e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int cRauCount = aWidth / 32; //C 293e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int yStride = (64 * 4 * yRauCount) + alignup(yRauCount, 8) / 8; 294e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int cStride = ((32 * 2 * cRauCount) + alignup(cRauCount, 8) / 8) * 2; 295e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int yStrideOffset = (aHeight / 4); 296e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int cStrideOffset = (aHeight / 2); 297e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah bufSize = (yStride * yStrideOffset + cStride * cStrideOffset) + 298e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah (yRauCount * yStrideOffset * 2) + 299e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah (cRauCount * cStrideOffset * 2) * 2; 300e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s:YUV Y RAU Count = %d C RAU Count = %d", 301e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah __FUNCTION__, yRauCount, cRauCount); 302e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah } else { 303e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int rauCount = aWidth / 32; 304e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //Single plane 305e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int stride = (32 * 4 * rauCount) + alignup(rauCount, 8) / 8; 306e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int strideOffset = (aHeight / 4); 307e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah bufSize = (stride * strideOffset * 4 /*bpp*/) + 308e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah (rauCount * strideOffset * 2); 309e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s:RGB RAU count = %d", __FUNCTION__, 310e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah rauCount); 311e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah } 312e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 313e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s: aligned width = %d, aligned height = %d " 314e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah "Buf Size = %d", __FUNCTION__, aWidth, aHeight, bufSize); 315e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return bufSize; 317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // namespace overlay 320