1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Copyright (C) 2008 The Android Open Source Project 3fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R* Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. 4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* 5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Licensed under the Apache License, Version 2.0 (the "License"); 6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* you may not use this file except in compliance with the License. 7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* You may obtain a copy of the License at 8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* 9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* http://www.apache.org/licenses/LICENSE-2.0 10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* 11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Unless required by applicable law or agreed to in writing, software 12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* distributed under the License is distributed on an "AS IS" BASIS, 13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* See the License for the specific language governing permissions and 15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* limitations under the License. 16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*/ 17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 188fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah#include <math.h> 1947c130ffbafe12d6ddf6e8df4ffdd9916318c379Raj kamal#include <mdp_version.h> 20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayUtils.h" 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayMdp.h" 225d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#include "mdp_version.h" 23072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah#include <overlay.h> 24072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 255d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#define HSIC_SETTINGS_DEBUG 0 265d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 278fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 288fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah 295d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahstatic inline bool isEqual(float f1, float f2) { 305d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah return ((int)(f1*100) == (int)(f2*100)) ? true : false; 315d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah} 32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace ovutils = overlay::utils; 34befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace overlay { 3597f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah 36b4144169bc4681fe47647bc127be3da2e59e9623Saurabh Shahbool MdpCtrl::init(const int& dpy) { 37072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah int fbnum = Overlay::getFbForDpy(dpy); 38072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah if( fbnum < 0 ) { 39072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy); 40072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah return false; 41072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah } 42072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 43ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed // FD init 44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!utils::openDev(mFd, fbnum, 45ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed Res::fbPath, O_RDWR)){ 46ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed ALOGE("Ctrl failed to init fbnum=%d", fbnum); 47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return false; 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 49072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah mDpy = dpy; 50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return true; 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpCtrl::reset() { 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed utils::memset0(mOVInfo); 55ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed mOVInfo.id = MSMFB_NEW_REQUEST; 56ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed mOrientation = utils::OVERLAY_TRANSFORM_0; 57327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah mDownscale = 0; 58072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah mDpy = 0; 595d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#ifdef USES_POST_PROCESSING 605d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah memset(&mParams, 0, sizeof(struct compute_params)); 615d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.conv_params.order = hsic_order_hsc_i; 625d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.conv_params.interface = interface_rec601; 635d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.conv_params.cc_matrix[0][0] = 1; 645d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.conv_params.cc_matrix[1][1] = 1; 655d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.conv_params.cc_matrix[2][2] = 1; 665d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#endif 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedbool MdpCtrl::close() { 70095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah bool result = true; 71095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah if(MSMFB_NEW_REQUEST != static_cast<int>(mOVInfo.id)) { 72095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) { 73095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah ALOGE("MdpCtrl close error in unset"); 74095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah result = false; 75095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah } 76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 775d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#ifdef USES_POST_PROCESSING 785d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah /* free allocated memory in PP */ 795d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data) 805d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah free(mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data); 815d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#endif 82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reset(); 83327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!mFd.close()) { 85095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah result = false; 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 87095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah 88095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah return result; 89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 91327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setSource(const utils::PipeArgs& args) { 92ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setSrcWhf(args.whf); 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 94ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed //TODO These are hardcoded. Can be moved out of setSource. 95ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed mOVInfo.transp_mask = 0xffffffff; 96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 97ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed //TODO These calls should ideally be a part of setPipeParams API 98ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setFlags(args.mdpFlags); 99ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setZ(args.zorder); 100ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setIsFg(args.isFg); 10112a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed setPlaneAlpha(args.planeAlpha); 10212a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed setBlending(args.blending); 103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 105327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setCrop(const utils::Dim& d) { 106ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setSrcRectDim(d); 107befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 108befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 10908cbd816733f17c957411ae915f2543afea70b67Sushil Chauhanvoid MdpCtrl::setColor(const uint32_t color) { 11008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan mOVInfo.bg_color = color; 11108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan} 11208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan 113327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setPosition(const overlay::utils::Dim& d) { 114327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah setDstRectDim(d); 115befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 116befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 117327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setTransform(const utils::eTransform& orient) { 118ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed int rot = utils::getMdpOrient(orient); 119ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setUserData(rot); 120835713dc4f444860a7718205ab95d9fe24adc469Saurabh Shah mOrientation = static_cast<utils::eTransform>(rot); 1218b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan} 1228b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan 123ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid MdpCtrl::doTransform() { 124ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed setRotationFlags(); 125327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah utils::Whf whf = getSrcWhf(); 126327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah utils::Dim dim = getSrcRectDim(); 127327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah utils::preRotateSource(mOrientation, whf, dim); 128327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah setSrcWhf(whf); 129327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah setSrcRectDim(dim); 1308b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan} 1318b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan 132327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::doDownscale() { 1338fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah int mdpVersion = MDPVersion::getInstance().getMDPVersion(); 1348fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if(mdpVersion < MDSS_V5) { 1358fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.src_rect.x >>= mDownscale; 1368fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.src_rect.y >>= mDownscale; 1378fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.src_rect.w >>= mDownscale; 1388fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.src_rect.h >>= mDownscale; 1398fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah } else if(MDPVersion::getInstance().supportsDecimation()) { 1408fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah //Decimation + MDP Downscale 1418fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.horz_deci = 0; 1428fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.vert_deci = 0; 1438fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah int minHorDeci = 0; 1448fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if(mOVInfo.src_rect.w > 2048) { 1458fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah //If the client sends us something > what a layer mixer supports 1468fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah //then it means it doesn't want to use split-pipe but wants us to 1478fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah //decimate. A minimum decimation of 2 will ensure that the width is 1488fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah //always within layer mixer limits. 1498fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah minHorDeci = 2; 1508fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah } 1518fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah 152f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah float horDscale = 0.0f; 153f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah float verDscale = 0.0f; 154f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah 155f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah utils::getDecimationFactor(mOVInfo.src_rect.w, mOVInfo.src_rect.h, 156f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah mOVInfo.dst_rect.w, mOVInfo.dst_rect.h, horDscale, verDscale); 1578fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah 1588fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if(horDscale < minHorDeci) 1598fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah horDscale = minHorDeci; 1608fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah 1618fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if((int)horDscale) 1628fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.horz_deci = (int)log2f(horDscale); 1638fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah 1648fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if((int)verDscale) 1658fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah mOVInfo.vert_deci = (int)log2f(verDscale); 1668fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah } 1678b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan} 1688b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan 169ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedbool MdpCtrl::set() { 1708fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah int mdpVersion = MDPVersion::getInstance().getMDPVersion(); 171ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed //deferred calcs, so APIs could be called in any order. 172327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah doTransform(); 17397f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah utils::Whf whf = getSrcWhf(); 17497f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah if(utils::isYuv(whf.format)) { 175e2f07405d2d04aaf5577080761cd2b11a9e3c736Sushil Chauhan utils::normalizeCrop(mOVInfo.src_rect.x, mOVInfo.src_rect.w); 176e2f07405d2d04aaf5577080761cd2b11a9e3c736Sushil Chauhan utils::normalizeCrop(mOVInfo.src_rect.y, mOVInfo.src_rect.h); 1778fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if(mdpVersion < MDSS_V5) { 178c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah utils::even_floor(mOVInfo.dst_rect.w); 179c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah utils::even_floor(mOVInfo.dst_rect.h); 180d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan } else if (mOVInfo.flags & MDP_DEINTERLACE) { 181d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan // For interlaced, crop.h should be 4-aligned 182d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan if (!(mOVInfo.flags & MDP_SOURCE_ROTATED_90) && 183d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan (mOVInfo.src_rect.h % 4)) 184d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan mOVInfo.src_rect.h = utils::aligndown(mOVInfo.src_rect.h, 4); 18591bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N // For interlaced, width must be multiple of 4 when rotated 90deg. 18691bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N else if ((mOVInfo.flags & MDP_SOURCE_ROTATED_90) && 18791bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N (mOVInfo.src_rect.w % 4)) 18891bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N mOVInfo.src_rect.w = utils::aligndown(mOVInfo.src_rect.w, 4); 189c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah } 190113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan } else { 191113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan if (mdpVersion >= MDSS_V5) { 192113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan // Check for 1-pixel down-scaling 193113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan if (mOVInfo.src_rect.w - mOVInfo.dst_rect.w == 1) 194113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan mOVInfo.src_rect.w -= 1; 195113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan if (mOVInfo.src_rect.h - mOVInfo.dst_rect.h == 1) 196113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan mOVInfo.src_rect.h -= 1; 197113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan } 19897f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah } 19997f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah 200113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan doDownscale(); 201befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return true; 202befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 203befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 204327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Update src format based on rotator's destination format. 205327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::updateSrcFormat(const uint32_t& rotDestFmt) { 206e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah utils::Whf whf = getSrcWhf(); 207327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah whf.format = rotDestFmt; 208e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah setSrcWhf(whf); 209ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed} 210ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 211befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpCtrl::dump() const { 212befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("== Dump MdpCtrl start =="); 213befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed mFd.dump(); 214befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed mdp_wrapper::dump("mOVInfo", mOVInfo); 215befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("== Dump MdpCtrl end =="); 216befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 217befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 218a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid MdpCtrl::getDump(char *buf, size_t len) { 2194762db4eb027284225be9d10f08d87252612064cSaurabh Shah ovutils::getDump(buf, len, "Ctrl", mOVInfo); 220a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah} 221a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah 222befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpData::dump() const { 223befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("== Dump MdpData start =="); 224befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed mFd.dump(); 225befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed mdp_wrapper::dump("mOvData", mOvData); 226befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("== Dump MdpData end =="); 227befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 228befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 229a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid MdpData::getDump(char *buf, size_t len) { 2304762db4eb027284225be9d10f08d87252612064cSaurabh Shah ovutils::getDump(buf, len, "Data", mOvData); 231a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah} 232a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah 233befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpCtrl3D::dump() const { 234befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("== Dump MdpCtrl start =="); 235befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed mFd.dump(); 236befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("== Dump MdpCtrl end =="); 237befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 238befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 2395d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahbool MdpCtrl::setVisualParams(const MetaData_t& data) { 240fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R ALOGD_IF(0, "In %s: data.operation = %d", __FUNCTION__, data.operation); 2415d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#ifdef USES_POST_PROCESSING 242fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R bool needUpdate = false; 2435d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah /* calculate the data */ 2445d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (data.operation & PP_PARAM_HSIC) { 2455d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mParams.params.pa_params.hue != data.hsicData.hue) { 2465d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah ALOGD_IF(HSIC_SETTINGS_DEBUG, 2475d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah "Hue has changed from %d to %d", 2485d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.hue,data.hsicData.hue); 2495d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2505d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2515d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 2525d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (!isEqual(mParams.params.pa_params.sat, 2535d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.hsicData.saturation)) { 2545d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah ALOGD_IF(HSIC_SETTINGS_DEBUG, 2555d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah "Saturation has changed from %f to %f", 2565d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.sat, 2575d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.hsicData.saturation); 2585d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2595d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2605d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 2615d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mParams.params.pa_params.intensity != data.hsicData.intensity) { 2625d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah ALOGD_IF(HSIC_SETTINGS_DEBUG, 2635d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah "Intensity has changed from %d to %d", 2645d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.intensity, 2655d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.hsicData.intensity); 2665d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2675d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2685d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 2695d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (!isEqual(mParams.params.pa_params.contrast, 2705d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.hsicData.contrast)) { 2715d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah ALOGD_IF(HSIC_SETTINGS_DEBUG, 2725d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah "Contrast has changed from %f to %f", 2735d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.contrast, 2745d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.hsicData.contrast); 2755d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2765d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2775d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 2785d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (needUpdate) { 2795d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.hue = data.hsicData.hue; 2805d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.sat = data.hsicData.saturation; 2815d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.intensity = data.hsicData.intensity; 2825d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.contrast = data.hsicData.contrast; 2835d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.pa_params.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; 2845d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.operation |= PP_OP_PA; 2855d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2865d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2875d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 2885d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (data.operation & PP_PARAM_SHARP2) { 2895d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mParams.params.sharp_params.strength != data.Sharp2Data.strength) { 2905d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2915d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2925d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mParams.params.sharp_params.edge_thr != data.Sharp2Data.edge_thr) { 2935d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2945d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2955d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mParams.params.sharp_params.smooth_thr != 2965d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.Sharp2Data.smooth_thr) { 2975d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 2985d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 2995d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mParams.params.sharp_params.noise_thr != 3005d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.Sharp2Data.noise_thr) { 3015d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 3025d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3035d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3045d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (needUpdate) { 3055d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.sharp_params.strength = data.Sharp2Data.strength; 3065d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.sharp_params.edge_thr = data.Sharp2Data.edge_thr; 3075d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.sharp_params.smooth_thr = 3085d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.Sharp2Data.smooth_thr; 3095d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.sharp_params.noise_thr = data.Sharp2Data.noise_thr; 3105d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.sharp_params.ops = 3115d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; 3125d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.operation |= PP_OP_SHARP; 3135d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3145d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3155d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3165d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (data.operation & PP_PARAM_IGC) { 3175d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data == NULL){ 3185d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah uint32_t *igcData 3195d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah = (uint32_t *)malloc(2 * MAX_IGC_LUT_ENTRIES * sizeof(uint32_t)); 3205d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (!igcData) { 3215d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah ALOGE("IGC storage allocated failed"); 3225d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah return false; 3235d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3245d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data = igcData; 3255d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mOVInfo.overlay_pp_cfg.igc_cfg.c2_data 3265d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah = igcData + MAX_IGC_LUT_ENTRIES; 3275d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3285d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3295d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah memcpy(mParams.params.igc_lut_params.c0, 3305d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.igcData.c0, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES); 3315d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah memcpy(mParams.params.igc_lut_params.c1, 3325d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.igcData.c1, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES); 3335d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah memcpy(mParams.params.igc_lut_params.c2, 3345d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah data.igcData.c2, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES); 3355d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3365d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.igc_lut_params.ops 3375d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; 3385d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.operation |= PP_OP_IGC; 3395d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 3405d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3415d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3425d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (data.operation & PP_PARAM_VID_INTFC) { 3435d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah mParams.params.conv_params.interface = 3445d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah (interface_type) data.video_interface; 3455d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah needUpdate = true; 3465d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3475d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3485d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah if (needUpdate) { 3495d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah display_pp_compute_params(&mParams, &mOVInfo.overlay_pp_cfg); 3505d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah } 3515d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#endif 3525d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah return true; 3535d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah} 3545d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 3551029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shahbool MdpCtrl::validateAndSet(MdpCtrl* mdpCtrlArray[], const int& count, 3561029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah const int& fbFd) { 3571029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah mdp_overlay* ovArray[count]; 3581029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah memset(&ovArray, 0, sizeof(ovArray)); 3591029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 3601029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah for(int i = 0; i < count; i++) { 3611029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ovArray[i] = &mdpCtrlArray[i]->mOVInfo; 3621029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 3631029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 3641029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah struct mdp_overlay_list list; 3651029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah memset(&list, 0, sizeof(struct mdp_overlay_list)); 3661029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah list.num_overlays = count; 3671029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah list.overlay_list = ovArray; 3681029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 369bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah int (*fnProgramScale)(struct mdp_overlay_list *) = 370bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah Overlay::getFnProgramScale(); 371bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah if(fnProgramScale) { 372bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah fnProgramScale(&list); 3731029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 3741029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 3751029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah if(!mdp_wrapper::validateAndSet(fbFd, list)) { 3761e4d70d866537955876c11a279498579842b8a41Jeykumar Sankaran /* No dump for failure due to insufficient resource */ 3771e4d70d866537955876c11a279498579842b8a41Jeykumar Sankaran if(errno != E2BIG) { 3781029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah mdp_wrapper::dump("Bad ov dump: ", 3791029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah *list.overlay_list[list.processed_overlays]); 3801029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 3811029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah return false; 3821029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 3831029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 3841029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah return true; 3851029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah} 3861029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 387072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 388072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah//// MdpData //////////// 389b4144169bc4681fe47647bc127be3da2e59e9623Saurabh Shahbool MdpData::init(const int& dpy) { 390072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah int fbnum = Overlay::getFbForDpy(dpy); 391072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah if( fbnum < 0 ) { 392072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy); 393072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah return false; 394072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah } 395072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 396072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah // FD init 397072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){ 398072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah ALOGE("Ctrl failed to init fbnum=%d", fbnum); 399072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah return false; 400072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah } 401072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah return true; 402072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah} 403072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 404befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} // overlay 405