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 66c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shahutils::Whf MdssRot::getDstWhf() const { 67c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //For Mdss dst_rect itself represents buffer dimensions. We ignore actual 68c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //aligned values during buffer allocation. Also the driver overwrites the 69c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //src.format field if destination format is different. 70c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //This implementation detail makes it possible to retrieve w,h even before 71c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //buffer allocation, which happens in queueBuffer. 72c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah return utils::Whf(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h, 73c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.src.format); 74c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah} 75c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah 76c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shahutils::Dim MdssRot::getDstDimensions() const { 77c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah return utils::Dim(mRotInfo.dst_rect.x, mRotInfo.dst_rect.y, 78c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.dst_rect.w, mRotInfo.dst_rect.h); 79c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah} 80c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah 81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::getSessId() const { return mRotInfo.id; } 82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::init() { 84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!utils::openDev(mFd, 0, Res::fbPath, O_RDWR)) { 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot failed to init fb0"); 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setSource(const overlay::utils::Whf& awhf) { 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson utils::Whf whf(awhf); 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.format = whf.format; 95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.width = whf.w; 96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.height = whf.h; 97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setCrop(const utils::Dim& crop) { 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.x = crop.x; 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.y = crop.y; 102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.w = crop.w; 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src_rect.h = crop.h; 104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 106a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid MdssRot::setDownscale(int /*ds*/) { 107a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setFlags(const utils::eMdpFlags& flags) { 110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags = flags; 111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::setTransform(const utils::eTransform& rot) 114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // reset rotation flags to avoid stale orientation values 116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags &= ~MDSS_ROT_MASK; 117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int flags = utils::getMdpOrient(rot); 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (flags != -1) 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson setRotations(flags); 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mOrientation = static_cast<utils::eTransform>(flags); 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE_IF(DEBUG_OVERLAY, "%s: rot=%d", __FUNCTION__, flags); 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::doTransform() { 125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags |= mOrientation; 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90) 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson utils::swap(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h); 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::commit() { 131c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah if (utils::isYuv(mRotInfo.src.format)) { 132c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah utils::normalizeCrop(mRotInfo.src_rect.x, mRotInfo.src_rect.w); 133c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah utils::normalizeCrop(mRotInfo.src_rect.y, mRotInfo.src_rect.h); 134c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah // For interlaced, crop.h should be 4-aligned 135c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah if ((mRotInfo.flags & utils::OV_MDP_DEINTERLACE) and 136c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah (mRotInfo.src_rect.h % 4)) 137c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.src_rect.h = utils::aligndown(mRotInfo.src_rect.h, 4); 138c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah } 139c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah 140c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.dst_rect.x = 0; 141c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.dst_rect.y = 0; 142c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.dst_rect.w = mRotInfo.src_rect.w; 143c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah mRotInfo.dst_rect.h = mRotInfo.src_rect.h; 144c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah 145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson doTransform(); 146c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah 147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.flags |= MDSS_MDP_ROT_ONLY; 148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mEnabled = true; 149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!overlay::mdp_wrapper::setOverlay(mFd.getFD(), mRotInfo)) { 150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot commit failed!"); 151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dump(); 152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return (mEnabled = false); 153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.id = mRotInfo.id; 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::queueBuffer(int fd, uint32_t offset) { 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(enabled()) { 160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.data.memory_id = fd; 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.data.offset = offset; 162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 163a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(false == remap(RotMem::ROT_NUM_BUFS)) { 164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s Remap failed, not queuing", __FUNCTION__); 165a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 166a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.dst_data.offset = 169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mRotOffset[mMem.mCurrIndex]; 170a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mCurrIndex = 171a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (mMem.mCurrIndex + 1) % mMem.mem.numBufs(); 172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!overlay::mdp_wrapper::play(mFd.getFD(), mRotData)) { 174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot play failed!"); 175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dump(); 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::open_i(uint32_t numbufs, uint32_t bufsz) 183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OvMem mem; 185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i"); 186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool isSecure = mRotInfo.flags & utils::OV_MDP_SECURE_OVERLAY_SESSION; 187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!mem.open(numbufs, bufsz, isSecure)){ 189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Failed to open", __func__); 190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mem.close(); 191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OVASSERT(MAP_FAILED != mem.addr(), "MAP failed"); 195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson OVASSERT(mem.getFD() != -1, "getFd is -1"); 196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.dst_data.memory_id = mem.getFD(); 198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.dst_data.offset = 0; 199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mem = mem; 200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::remap(uint32_t numbufs) { 204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Calculate the size based on rotator's dst format, w and h. 205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t opBufSize = calcOutputBufSize(); 206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // If current size changed, remap 207a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(opBufSize == mMem.size()) { 208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE_IF(DEBUG_OVERLAY, "%s: same size %d", __FUNCTION__, opBufSize); 209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE_IF(DEBUG_OVERLAY, "%s: size changed - remapping", __FUNCTION__); 213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 214a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!mMem.close()) { 215a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s error in closing prev rot mem", __FUNCTION__); 216a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 217a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 218a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!open_i(numbufs, opBufSize)) { 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s Error could not open", __FUNCTION__); 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 223a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (uint32_t i = 0; i < numbufs; ++i) { 225a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mRotOffset[i] = i * opBufSize; 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 227a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool MdssRot::close() { 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool success = true; 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(mFd.valid() && (getSessId() != (uint32_t) MSMFB_NEW_REQUEST)) { 234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!mdp_wrapper::unsetOverlay(mFd.getFD(), getSessId())) { 235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("MdssRot::close unsetOverlay failed, fd=%d sessId=%d", 236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mFd.getFD(), getSessId()); 237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson success = false; 238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!mFd.close()) { 242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Mdss Rot error closing fd"); 243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson success = false; 244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!mMem.close()) { 246ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Mdss Rot error closing mem"); 247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson success = false; 248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson reset(); 250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return success; 251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::reset() { 254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::memset0(mRotInfo); 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::memset0(mRotData); 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotData.data.memory_id = -1; 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.id = MSMFB_NEW_REQUEST; 258a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::memset0(mMem.mRotOffset); 259a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mCurrIndex = 0; 260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mOrientation = utils::OVERLAY_TRANSFORM_0; 261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::dump() const { 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("== Dump MdssRot start =="); 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mFd.dump(); 266a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mMem.mem.dump(); 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mdp_wrapper::dump("mRotInfo", mRotInfo); 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mdp_wrapper::dump("mRotData", mRotData); 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("== Dump MdssRot end =="); 270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::calcOutputBufSize() { 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t opBufSize = 0; 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::Whf destWhf(mRotInfo.dst_rect.w, mRotInfo.dst_rect.h, 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRotInfo.src.format); //mdss src and dst formats are same. 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (mRotInfo.flags & ovutils::OV_MDSS_MDP_BWC_EN) { 278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson opBufSize = calcCompressedBufSize(destWhf); 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson opBufSize = Rotator::calcOutputBufSize(destWhf); 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return opBufSize; 284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid MdssRot::getDump(char *buf, size_t len) const { 287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::getDump(buf, len, "MdssRotCtrl", mRotInfo); 288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::getDump(buf, len, "MdssRotData", mRotData); 289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Calculate the compressed o/p buffer size for BWC 292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonuint32_t MdssRot::calcCompressedBufSize(const ovutils::Whf& destWhf) { 293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t bufSize = 0; 294e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //Worst case alignments 295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int aWidth = ovutils::align(destWhf.w, 64); 296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int aHeight = ovutils::align(destWhf.h, 4); 297e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah /* 298e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah Format | RAU size (width x height) 299e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ---------------------------------------------- 300e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ARGB | 32 pixel x 4 line 301e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah RGB888 | 32 pixel x 4 line 302e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah Y (Luma) | 64 pixel x 4 line 303e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah CRCB 420 | 32 pixel x 2 line 304e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah CRCB 422 H2V1 | 32 pixel x 4 line 305e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah CRCB 422 H1V2 | 64 pixel x 2 line 306e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 307e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah Metadata requirements:- 308e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 1 byte meta data for every 8 RAUs 309e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 2 byte meta data per RAU 310e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah */ 311e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 312e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //These blocks attempt to allocate for the worst case in each of the 313e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //respective format classes, yuv/rgb. The table above is for reference 314e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah if(utils::isYuv(destWhf.format)) { 315e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int yRauCount = aWidth / 64; //Y 316e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int cRauCount = aWidth / 32; //C 317e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int yStride = (64 * 4 * yRauCount) + alignup(yRauCount, 8) / 8; 318e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int cStride = ((32 * 2 * cRauCount) + alignup(cRauCount, 8) / 8) * 2; 319e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int yStrideOffset = (aHeight / 4); 320e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int cStrideOffset = (aHeight / 2); 321e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah bufSize = (yStride * yStrideOffset + cStride * cStrideOffset) + 322e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah (yRauCount * yStrideOffset * 2) + 323e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah (cRauCount * cStrideOffset * 2) * 2; 324e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s:YUV Y RAU Count = %d C RAU Count = %d", 325e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah __FUNCTION__, yRauCount, cRauCount); 326e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah } else { 327e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int rauCount = aWidth / 32; 328e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah //Single plane 329e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int stride = (32 * 4 * rauCount) + alignup(rauCount, 8) / 8; 330e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah int strideOffset = (aHeight / 4); 331e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah bufSize = (stride * strideOffset * 4 /*bpp*/) + 332e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah (rauCount * strideOffset * 2); 333e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s:RGB RAU count = %d", __FUNCTION__, 334e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah rauCount); 335e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah } 336e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 337e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah ALOGD_IF(DEBUG_MDSS_ROT, "%s: aligned width = %d, aligned height = %d " 338e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah "Buf Size = %d", __FUNCTION__, aWidth, aHeight, bufSize); 339e157971a9f51057686971c0e2c82403ca1756896Saurabh Shah 340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return bufSize; 341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // namespace overlay 344