1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (C) 2008 The Android Open Source Project 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Licensed under the Apache License, Version 2.0 (the "License"); 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* you may not use this file except in compliance with the License. 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* You may obtain a copy of the License at 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* http://www.apache.org/licenses/LICENSE-2.0 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Unless required by applicable law or agreed to in writing, software 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* distributed under the License is distributed on an "AS IS" BASIS, 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* See the License for the specific language governing permissions and 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* limitations under the License. 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/ 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <math.h> 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <mdp_version.h> 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayUtils.h" 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayMdp.h" 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "mdp_version.h" 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <overlay.h> 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <dlfcn.h> 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HSIC_SETTINGS_DEBUG 0 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace qdutils; 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic inline bool isEqual(float f1, float f2) { 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return ((int)(f1*100) == (int)(f2*100)) ? true : false; 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace ovutils = overlay::utils; 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace overlay { 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::init(const int& dpy) { 38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int fbnum = Overlay::getFbForDpy(dpy); 39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if( fbnum < 0 ) { 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy); 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // FD init 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!utils::openDev(mFd, fbnum, 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin Res::fbPath, O_RDWR)){ 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Ctrl failed to init fbnum=%d", fbnum); 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mDpy = dpy; 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::reset() { 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::memset0(mOVInfo); 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.id = MSMFB_NEW_REQUEST; 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOrientation = utils::OVERLAY_TRANSFORM_0; 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mDpy = 0; 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&mParams, 0, sizeof(struct compute_params)); 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.conv_params.order = hsic_order_hsc_i; 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.conv_params.interface = interface_rec601; 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.conv_params.cc_matrix[0][0] = 1; 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.conv_params.cc_matrix[1][1] = 1; 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.conv_params.cc_matrix[2][2] = 1; 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::close() { 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool result = true; 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(MSMFB_NEW_REQUEST != static_cast<int>(mOVInfo.id)) { 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) { 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("MdpCtrl close error in unset"); 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin result = false; 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING 78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* free allocated memory in PP */ 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data) 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin free(mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data); 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin reset(); 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mFd.close()) { 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin result = false; 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return result; 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setSource(const utils::PipeArgs& args) { 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setSrcWhf(args.whf); 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //TODO These are hardcoded. Can be moved out of setSource. 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.transp_mask = 0xffffffff; 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //TODO These calls should ideally be a part of setPipeParams API 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setFlags(args.mdpFlags); 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setZ(args.zorder); 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setPlaneAlpha(args.planeAlpha); 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setBlending(args.blending); 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setCrop(const utils::Dim& d) { 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setSrcRectDim(d); 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setColor(const uint32_t color) { 109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.bg_color = color; 110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setPosition(const overlay::utils::Dim& d) { 113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setDstRectDim(d); 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setTransform(const utils::eTransform& orient) { 117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int rot = utils::getMdpOrient(orient); 118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setUserData(rot); 119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOrientation = static_cast<utils::eTransform>(rot); 120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setPipeType(const utils::eMdpPipeType& pType){ 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch((int) pType){ 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case utils::OV_MDP_PIPE_RGB: 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.pipe_type = PIPE_TYPE_RGB; 126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case utils::OV_MDP_PIPE_VG: 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.pipe_type = PIPE_TYPE_VIG; 129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case utils::OV_MDP_PIPE_DMA: 131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.pipe_type = PIPE_TYPE_DMA; 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin default: 134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.pipe_type = PIPE_TYPE_AUTO; 135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::doTransform() { 140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setRotationFlags(); 141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::Whf whf = getSrcWhf(); 142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::Dim dim = getSrcRectDim(); 143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::preRotateSource(mOrientation, whf, dim); 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setSrcWhf(whf); 145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setSrcRectDim(dim); 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::doDownscale() { 149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(MDPVersion::getInstance().supportsDecimation()) { 150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::getDecimationFactor(mOVInfo.src_rect.w, mOVInfo.src_rect.h, 151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.dst_rect.w, mOVInfo.dst_rect.h, mOVInfo.horz_deci, 152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.vert_deci); 153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::set() { 157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mdpVersion = MDPVersion::getInstance().getMDPVersion(); 158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //deferred calcs, so APIs could be called in any order. 159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin doTransform(); 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::Whf whf = getSrcWhf(); 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(utils::isYuv(whf.format)) { 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::normalizeCrop(mOVInfo.src_rect.x, mOVInfo.src_rect.w); 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::normalizeCrop(mOVInfo.src_rect.y, mOVInfo.src_rect.h); 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mdpVersion < MDSS_V5) { 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::even_floor(mOVInfo.dst_rect.w); 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::even_floor(mOVInfo.dst_rect.h); 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else if (mOVInfo.flags & MDP_DEINTERLACE) { 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // For interlaced, crop.h should be 4-aligned 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!(mOVInfo.flags & MDP_SOURCE_ROTATED_90) && 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (mOVInfo.src_rect.h % 4)) 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.src_rect.h = utils::aligndown(mOVInfo.src_rect.h, 4); 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // For interlaced, width must be multiple of 4 when rotated 90deg. 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin else if ((mOVInfo.flags & MDP_SOURCE_ROTATED_90) && 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (mOVInfo.src_rect.w % 4)) 175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.src_rect.w = utils::aligndown(mOVInfo.src_rect.w, 4); 176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mdpVersion >= MDSS_V5) { 179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Check for 1-pixel down-scaling 180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mOVInfo.src_rect.w - mOVInfo.dst_rect.w == 1) 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.src_rect.w -= 1; 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mOVInfo.src_rect.h - mOVInfo.dst_rect.h == 1) 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.src_rect.h -= 1; 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin doDownscale(); 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Update src format based on rotator's destination format. 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::updateSrcFormat(const uint32_t& rotDestFmt) { 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::Whf whf = getSrcWhf(); 194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin whf.format = rotDestFmt; 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin setSrcWhf(whf); 196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::dump() const { 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("== Dump MdpCtrl start =="); 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFd.dump(); 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_wrapper::dump("mOVInfo", mOVInfo); 202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("== Dump MdpCtrl end =="); 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::getDump(char *buf, size_t len) { 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ovutils::getDump(buf, len, "Ctrl", mOVInfo); 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpData::dump() const { 210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("== Dump MdpData start =="); 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFd.dump(); 212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_wrapper::dump("mOvData", mOvData); 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("== Dump MdpData end =="); 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpData::getDump(char *buf, size_t len) { 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ovutils::getDump(buf, len, "Data", mOvData); 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::setVisualParams(const MetaData_t& data) { 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGD_IF(0, "In %s: data.operation = %d", __FUNCTION__, data.operation); 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Set Color Space for MDP to configure CSC matrix 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.color_space = ITU_R_601; 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (data.operation & UPDATE_COLOR_SPACE) { 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.color_space = data.colorSpace; 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool needUpdate = false; 231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* calculate the data */ 232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (data.operation & PP_PARAM_HSIC) { 233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mParams.params.pa_params.hue != data.hsicData.hue) { 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGD_IF(HSIC_SETTINGS_DEBUG, 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "Hue has changed from %d to %d", 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.hue,data.hsicData.hue); 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!isEqual(mParams.params.pa_params.sat, 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.hsicData.saturation)) { 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGD_IF(HSIC_SETTINGS_DEBUG, 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "Saturation has changed from %f to %f", 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.sat, 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.hsicData.saturation); 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mParams.params.pa_params.intensity != data.hsicData.intensity) { 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGD_IF(HSIC_SETTINGS_DEBUG, 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "Intensity has changed from %d to %d", 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.intensity, 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.hsicData.intensity); 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!isEqual(mParams.params.pa_params.contrast, 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.hsicData.contrast)) { 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGD_IF(HSIC_SETTINGS_DEBUG, 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "Contrast has changed from %f to %f", 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.contrast, 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.hsicData.contrast); 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (needUpdate) { 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.hue = (float)data.hsicData.hue; 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.sat = data.hsicData.saturation; 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.intensity = data.hsicData.intensity; 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.contrast = data.hsicData.contrast; 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.pa_params.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.operation |= PP_OP_PA; 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (data.operation & PP_PARAM_SHARP2) { 277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mParams.params.sharp_params.strength != data.Sharp2Data.strength) { 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mParams.params.sharp_params.edge_thr != data.Sharp2Data.edge_thr) { 281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mParams.params.sharp_params.smooth_thr != 284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.Sharp2Data.smooth_thr) { 285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mParams.params.sharp_params.noise_thr != 288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.Sharp2Data.noise_thr) { 289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (needUpdate) { 293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.sharp_params.strength = data.Sharp2Data.strength; 294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.sharp_params.edge_thr = data.Sharp2Data.edge_thr; 295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.sharp_params.smooth_thr = 296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.Sharp2Data.smooth_thr; 297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.sharp_params.noise_thr = data.Sharp2Data.noise_thr; 298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.sharp_params.ops = 299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; 300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.operation |= PP_OP_SHARP; 301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (data.operation & PP_PARAM_IGC) { 305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data == NULL){ 306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint32_t *igcData 307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin = (uint32_t *)malloc(2 * MAX_IGC_LUT_ENTRIES * sizeof(uint32_t)); 308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!igcData) { 309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("IGC storage allocated failed"); 310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data = igcData; 313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOVInfo.overlay_pp_cfg.igc_cfg.c2_data 314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin = igcData + MAX_IGC_LUT_ENTRIES; 315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memcpy(mParams.params.igc_lut_params.c0, 318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.igcData.c0, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES); 319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memcpy(mParams.params.igc_lut_params.c1, 320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.igcData.c1, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES); 321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memcpy(mParams.params.igc_lut_params.c2, 322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin data.igcData.c2, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES); 323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.igc_lut_params.ops 325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; 326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.operation |= PP_OP_IGC; 327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (data.operation & PP_PARAM_VID_INTFC) { 331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mParams.params.conv_params.interface = 332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (interface_type) data.video_interface; 333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin needUpdate = true; 334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (needUpdate) { 337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int (*sFnppParams)(const struct compute_params *, 338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_overlay_pp_params *) = 339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin Overlay::getFnPpParams(); 340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(sFnppParams) { 341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int ret = sFnppParams(&mParams, &mOVInfo.overlay_pp_cfg); 342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ret) { 343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Unable to set PP params", __FUNCTION__); 344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 345054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 346054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 347054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 348054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 349054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 350054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::validateAndSet(MdpCtrl* mdpCtrlArray[], const int& count, 352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const int& fbFd) { 353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_overlay* ovArray[count]; 354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&ovArray, 0, sizeof(ovArray)); 355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 3568e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R uint8_t max_horz_deci = 0, max_vert_deci = 0; 3578e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R 3588e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R // Decimation factor for the left and right pipe differs, when there is a 3598e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R // one pixel difference in the dst width of right pipe and the left pipe. 3608e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R // libscalar returns a failure as it expects decimation on both the pipe 3618e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R // to be same. So compare the decimation factor on both the pipes and assign 3628e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R // the maximum of it. 363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for(int i = 0; i < count; i++) { 3648e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R mdp_overlay *ov_current = &mdpCtrlArray[i]->mOVInfo; 3658e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R for(int j = i + 1; j < count; j++) { 3668e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R mdp_overlay *ov_next = &mdpCtrlArray[j]->mOVInfo; 3678e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R if(ov_current->z_order == ov_next->z_order) { 3688e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R max_horz_deci = utils::max(ov_current->horz_deci, 3698e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ov_next->horz_deci); 3708e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R max_vert_deci = utils::max(ov_current->vert_deci, 3718e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ov_next->vert_deci); 3728e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R 3738e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ov_current->horz_deci = max_horz_deci; 3748e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ov_next->horz_deci = max_horz_deci; 3758e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ov_current->vert_deci = max_vert_deci; 3768e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ov_next->vert_deci = max_vert_deci; 3778e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R break; 3788e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R } 3798e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R } 3808e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R ovArray[i] = ov_current; 381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_overlay_list list; 384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&list, 0, sizeof(struct mdp_overlay_list)); 385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list.num_overlays = count; 386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list.overlay_list = ovArray; 387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int (*fnProgramScale)(struct mdp_overlay_list *) = 389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin Overlay::getFnProgramScale(); 390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(fnProgramScale) { 391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin fnProgramScale(&list); 392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Error value is based on file errno-base.h 395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // 0 - indicates no error. 396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int errVal = mdp_wrapper::validateAndSet(fbFd, list); 397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(errVal) { 398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* No dump for failure due to insufficient resource */ 399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(errVal != E2BIG) { 400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_wrapper::dump("Bad ov dump: ", 401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *list.overlay_list[list.processed_overlays]); 402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//// MdpData //////////// 411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpData::init(const int& dpy) { 412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int fbnum = Overlay::getFbForDpy(dpy); 413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if( fbnum < 0 ) { 414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy); 415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // FD init 419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){ 420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Ctrl failed to init fbnum=%d", fbnum); 421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} // overlay 427