hwc_mdpcomp.cpp revision dfe40345210611d4548daa7ba1fc032fac238e97
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 2404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained 4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only. 5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License. 8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at 9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and 16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License. 17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h> 20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h" 2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h> 22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 23361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h" 24591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h" 258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h" 26699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h" 27f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h" 28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 3011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils; 3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 35327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 36327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 41e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnanbool MDPComp::sHandleTimeout = false; 42c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 4316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 44e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true; 45bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::sEnablePartialFrameUpdate = false; 46f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 4715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::sEnable4k2kYUVSplit = false; 48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) { 50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(isDisplaySplit(ctx, dpy)) { 51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompSplit(dpy); 52c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 53f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompNonSplit(dpy); 54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 56f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 66efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d " 67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah "fbCount:%2d \n", mCurrentFrame.layerCount, 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 79bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 81bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.drop[index] ? "DROP" : 82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"), 83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 99f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 104e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 116bc35f9e7e36658230062bdb96f1ea51798c699b7Jeykumar Sankaran if(property_get("persist.hwc.partialupdate", property, NULL) > 0) { 117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL && 118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran qdutils::MDPVersion::getInstance().is8x74v2()) 119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate = true; 120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__, 122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate); 123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 12511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 129f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1316bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1326bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1336bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1346bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1356bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1366bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 138c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1396bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 142c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 149c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 15015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 15115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((property_get("debug.mdpcomp.4k2kSplit", property, "0") > 0) && 15215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 15315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 15415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna sEnable4k2kYUVSplit = true; 15515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 159c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::reset(hwc_context_t *ctx) { 160c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 162c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mOverlay->clear(mDpy); 163c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mLayerRotMap[mDpy]->clear(); 164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah} 165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 173e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan Locker::Autolock _l(ctx->mDrawLock); 174e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan // Handle timeout event only if the previous composition is MDP or MIXED. 175e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan if(!sHandleTimeout) { 176e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan ALOGD_IF(isDebug(), "%s:Do not handle this timeout", __FUNCTION__); 177e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan return; 178e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan } 179359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 185359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 187c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 194f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 197f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 198f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 199bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Drop the layer when its already present in FB OR when it lies 200bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * outside frame's ROI */ 201bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) { 202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 203bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 206c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 20716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 208c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::setRedraw(hwc_context_t *ctx, 209c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 210c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.needsRedraw = false; 211c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!mCachedFrame.isSameFrame(mCurrentFrame, list) || 212c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 213c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah isSkipPresent(ctx, mDpy)) { 214c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.needsRedraw = true; 215c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 216c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah} 217c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 218f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 221c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 229c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 230c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 232f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 235f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 239ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 2402b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah fbZ = -1; 241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 254f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 255f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 256f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 26087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&isFBComposed, true, sizeof(isFBComposed)); 26187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&drop, false, sizeof(drop)); 262f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 264af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 265af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 270af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 271af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 272af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 273af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 27487957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed)); 27587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&drop, &curFrame.drop, sizeof(drop)); 27687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula} 27787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula 278e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaranbool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame, 279e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran hwc_display_contents_1_t* list) { 28087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if(layerCount != curFrame.layerCount) 28187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 28287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula for(int i = 0; i < curFrame.layerCount; i++) { 28387957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if((curFrame.isFBComposed[i] != isFBComposed[i]) || 28487957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula (curFrame.drop[i] != drop[i])) { 28587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 28687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 287e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran if(curFrame.isFBComposed[i] && 288e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran (hnd[i] != list->hwLayers[i].handle)){ 289e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran return false; 290e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran } 29187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 29287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return true; 293c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 294c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 295efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) { 296efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 297efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((not isYuvBuffer(hnd) and has90Transform(layer)) or 298efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (not isValidDimension(ctx,layer)) 299efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //More conditions here, SKIP, sRGB+Blend etc 300efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ) { 301efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 302efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 303efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 304efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 305efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 3061b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 3070ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 3080ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3090ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 31008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (layer->flags & HWC_COLOR_FILL) { 31108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // Color layer 31208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return true; 31308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 3140ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 3150ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3160ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 3170ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 31880864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed //XXX: Investigate doing this with pixel phase on MDSS 3198d07dd7a9493c19215acf1e992502d1f51329fe0Naseer Ahmed if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf)) 32080864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return false; 32180864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed 3228f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 32341269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 3240ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 3250ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 3260ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 3270ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 328df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran float w_scale = ((float)crop_w / (float)dst_w); 329df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran float h_scale = ((float)crop_h / (float)dst_h); 3300ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3341b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3351b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3361b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3380ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3390ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 340df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if((w_scale > 1.0f) || (h_scale > 1.0f)) { 341bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran const uint32_t downscale = 34241269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 343df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float w_dscale = w_scale; 344df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float h_dscale = h_scale; 345df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 346bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(ctx->mMDP.version >= qdutils::MDSS_V5) { 347bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran /* Workaround for downscales larger than 4x. 348bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran * Will be removed once decimator block is enabled for MDSS 349bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran */ 350bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 351bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 352bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran h_dscale > downscale) 353bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 354bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { 355bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(w_dscale > 64 || h_dscale > 64) 356bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 357bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } 358bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { //A-family 359bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(w_dscale > downscale || h_dscale > downscale) 36041269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 36141269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 36241269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 36341269096daf2363b16dcd89627dd674529a26601Saurabh Shah 364df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if((w_scale < 1.0f) || (h_scale < 1.0f)) { 365df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const uint32_t upscale = 366df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran qdutils::MDPVersion::getInstance().getMaxMDPUpscale(); 367df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float w_uscale = 1.0f / w_scale; 368df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float h_uscale = 1.0f / h_scale; 369df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 370df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if(w_uscale > upscale || h_uscale > upscale) 371df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran return false; 372df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran } 373df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 3740ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3750ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type, 3781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 379c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 381c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 382c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 3841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer); 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 3901a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer); 391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 392f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 393f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 4001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer); 401f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 402f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 403f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 409af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 410f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 412f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 41456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 415140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mVideoTransFlag && 416140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan isSecondaryConnected(ctx)) { 41756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 41856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 41956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 42056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 421140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } else if(isSecondaryConfiguring(ctx)) { 422c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 423f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 42603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ALOGD_IF(isDebug(), "%s: padding round invoked for dpy %d", 42703514577d0c705056352898f66ed2a8e9b131df8Raj Kamal __FUNCTION__,mDpy); 428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 429586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 431f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 432f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 433a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran/* 434a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 1) Identify layers that are not visible in the updating ROI and drop them 435a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * from composition. 436a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 2) If we have a scaling layers which needs cropping against generated ROI. 437a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * Reset ROI to full resolution. 438a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran */ 439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx, 440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_display_contents_1_t* list, hwc_rect_t roi) { 441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 442bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 443bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(roi)) 444bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 445bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 446a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t visibleRect = roi; 447a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 448a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran for(int i = numAppLayers - 1; i >= 0; i--){ 449a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 450a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(!isValidRect(visibleRect)) { 451a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.drop[i] = true; 452a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.dropCount++; 453f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran continue; 454a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran } 455a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran const hwc_layer_1_t* layer = &list->hwLayers[i]; 457bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = layer->displayFrame; 459f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t srcRect = integerizeSourceCrop(layer->sourceCropf); 460bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 461a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t res = getIntersection(visibleRect, dstRect); 462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_w = res.right - res.left; 464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_h = res.bottom - res.top; 465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_w = dstRect.right - dstRect.left; 466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_h = dstRect.bottom - dstRect.top; 467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(res)) { 469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.drop[i] = true; 470bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount++; 471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran }else { 472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Reset frame ROI when any layer which needs scaling also needs ROI 473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * cropping */ 474f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran if((res_w != dst_w || res_h != dst_h) && needsScaling (layer)) { 4750938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee ALOGI("%s: Resetting ROI due to scaling", __FUNCTION__); 476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 477bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 478bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 479bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 480a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 481f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran /* deduct any opaque region from visibleRect */ 482f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran if (layer->blending == HWC_BLENDING_NONE) 483f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran visibleRect = deductRect(visibleRect, res); 484f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran } 485bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 486bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return true; 487bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 488bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 489bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 490bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 491bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 492bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!sEnablePartialFrameUpdate) { 493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 495bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 496bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(mDpy || isDisplaySplit(ctx, mDpy)){ 497bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: ROI not supported for" 498bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran "the (1) external / virtual display's (2) dual DSI displays", 499bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran __FUNCTION__); 500bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 501bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 502bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 503a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) 504a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran return; 505a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 506bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(list->flags & HWC_GEOMETRY_CHANGED) 507bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 508bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 509bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0}; 510bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran for(int index = 0; index < numAppLayers; index++ ) { 511bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) || 512bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) { 513bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = list->hwLayers[index].displayFrame; 514f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t srcRect = integerizeSourceCrop( 515f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R list->hwLayers[index].sourceCropf); 516bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 517bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Intersect against display boundaries */ 518bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = getUnion(roi, dstRect); 519bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 520bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 521bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 522bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!validateAndApplyROI(ctx, list, roi)){ 523bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = (struct hwc_rect) {0, 0, 524bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres}; 525bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 526bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 527bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.x = roi.left; 528bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.y = roi.top; 529bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.w = roi.right - roi.left; 530bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.h = roi.bottom - roi.top; 531bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 532bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__, 533bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi.left, roi.top, roi.right, roi.bottom); 534bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 535bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 538c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryFullFrame(hwc_context_t *ctx, 539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 54269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R int priDispW = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 5441b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) { 54533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 54633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 54733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 54833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 553c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 554c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 555c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 55669f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R if(mDpy > HWC_DISPLAY_PRIMARY && (priDispW > MAX_DISPLAY_DIM) && 55769f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R (ctx->dpyAttr[mDpy].xres < MAX_DISPLAY_DIM)) { 55869f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // Disable MDP comp on Secondary when the primary is highres panel and 55969f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // the secondary is a normal 1080p, because, MDP comp on secondary under 56069f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // in such usecase, decimation gets used for downscale and there will be 56169f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // a quality mismatch when there will be a fallback to GPU comp 56269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R ALOGD_IF(isDebug(), "%s: Disable MDP Compositon for Secondary Disp", 56369f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R __FUNCTION__); 56469f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R return false; 56569f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R } 56669f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R 567ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan // check for action safe flag and downscale mode which requires scaling. 568ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan if(ctx->dpyAttr[mDpy].mActionSafePresent 569ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan || ctx->dpyAttr[mDpy].mDownScaleMode) { 570ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan ALOGD_IF(isDebug(), "%s: Scaling needed for this frame",__FUNCTION__); 571ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan return false; 572ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan } 573ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan 574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 575c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 576c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 577f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 578efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(isYuvBuffer(hnd) && has90Transform(layer)) { 579efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!canUseRotator(ctx, mDpy)) { 580efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d", 581efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__, mDpy); 58286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 58386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 584c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 5852902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 5862902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 5872902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 5882902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 5892902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 5902902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 5912902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 5922902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 593c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 594af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 595f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 596f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 597f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 598f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 599af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 601af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 602af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 603e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 60686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 607af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 608af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 609af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 610af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 611efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit presentation / secondary-only layer. 612efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) && 613efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (list->numHwLayers - 1) > MAX_SEC_LAYERS) { 614efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 615efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 616efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 617efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 618efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 619efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 620efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 621efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 622efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__); 623efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 624efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 62584a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu 62684a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //For 8x26, if there is only one layer which needs scale for secondary 62784a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //while no scale for primary display, DMA pipe is occupied by primary. 62884a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //If need to fall back to GLES composition, virtual display lacks DMA 62984a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //pipe and error is reported. 63084a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu if(qdutils::MDPVersion::getInstance().is8x26() && 63184a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu mDpy >= HWC_DISPLAY_EXTERNAL && 63286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qhwc::needsScaling(layer)) 63384a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu return false; 634efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 635c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 637bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop, 638bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 639bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount - 640bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount; 641af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 64215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 643f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 64415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 64515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 646c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 647c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 648c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 6498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 6508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 6518eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 652af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 653af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 654af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 655af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 657e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 658e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 659e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 660e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 661e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 66294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah bool ret = false; 663116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah if(list->flags & HWC_GEOMETRY_CHANGED) { //Try load based first 664dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ret = loadBasedComp(ctx, list) or 665116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah cacheBasedComp(ctx, list); 666116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } else { 667116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah ret = cacheBasedComp(ctx, list) or 668dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah loadBasedComp(ctx, list); 66994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 67094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 67194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return ret; 67294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 67394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 67494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::cacheBasedComp(hwc_context_t *ctx, 67594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 67694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 677af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 678af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 679efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 680efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //If an MDP marked layer is unsupported cannot do partial MDP Comp 681efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 682efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 683efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 684efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 685efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list", 686efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__); 687c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 688efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 689efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 690efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 691efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 692efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 69311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, false /*secure only*/); 69436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula bool ret = markLayersForCaching(ctx, list); //sets up fbZ also 695efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!ret) { 696efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy); 697c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 698efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 699efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 702efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 70315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 704f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 70515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 70615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 707efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit cases where a video has non-updating background. 708efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) and 709efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (mdpCount > MAX_SEC_LAYERS)) { 710efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 711c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 712efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 713efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 714efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 715c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 716c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 717c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 7188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 7198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 724dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shahbool MDPComp::loadBasedComp(hwc_context_t *ctx, 72594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 726404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(not isLoadBasedCompDoable(ctx)) { 727116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah return false; 728116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } 729116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 730dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 731dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah const int numNonDroppedLayers = numAppLayers - mCurrentFrame.dropCount; 732dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah const int stagesForMDP = min(sMaxPipesPerMixer, 733dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ctx->mOverlay->availablePipes(mDpy, Overlay::MIXER_DEFAULT)); 734dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah 735dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int mdpBatchSize = stagesForMDP - 1; //1 stage for FB 736dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int fbBatchSize = numNonDroppedLayers - mdpBatchSize; 737dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int lastMDPSupportedIndex = numAppLayers; 738dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int dropCount = 0; 739dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah 740dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Find the minimum MDP batch size 741dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah for(int i = 0; i < numAppLayers;i++) { 742dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(mCurrentFrame.drop[i]) { 743dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah dropCount++; 744e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran continue; 74594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 746dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 747dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 748dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah lastMDPSupportedIndex = i; 749dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mdpBatchSize = min(i - dropCount, stagesForMDP - 1); 750dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah fbBatchSize = numNonDroppedLayers - mdpBatchSize; 751dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah break; 75294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 75394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 75494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 755dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s:Before optimizing fbBatch, mdpbatch %d, fbbatch %d " 756dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah "dropped %d", __FUNCTION__, mdpBatchSize, fbBatchSize, 757dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.dropCount); 75815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 759dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Start at a point where the fb batch should at least have 2 layers, for 760dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //this mode to be justified. 761dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah while(fbBatchSize < 2) { 762dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ++fbBatchSize; 763dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah --mdpBatchSize; 76494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 76594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 766dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //If there are no layers for MDP, this mode doesnt make sense. 767dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(mdpBatchSize < 1) { 768dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s: No MDP layers after optimizing for fbBatch", 769dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah __FUNCTION__); 770116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah return false; 771116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } 772116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 773116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah mCurrentFrame.reset(numAppLayers); 774116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 775dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Try with successively smaller mdp batch sizes until we succeed or reach 1 776dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah while(mdpBatchSize > 0) { 777dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Mark layers for MDP comp 778dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int mdpBatchLeft = mdpBatchSize; 779dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah for(int i = 0; i < lastMDPSupportedIndex and mdpBatchLeft; i++) { 780dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(mCurrentFrame.drop[i]) { 781dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah continue; 782e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 783e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 784dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah --mdpBatchLeft; 78595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 78695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 787dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.fbZ = mdpBatchSize; 788dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.fbCount = fbBatchSize; 789dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.mdpCount = mdpBatchSize; 79095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 791dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s:Trying with: mdpbatch %d fbbatch %d dropped %d", 792dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah __FUNCTION__, mdpBatchSize, fbBatchSize, 793dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.dropCount); 794c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 795dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(postHeuristicsHandling(ctx, list)) { 796dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s: Postheuristics handling succeeded", 797dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah __FUNCTION__); 798dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah return true; 799dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah } 80015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 801c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 802dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah --mdpBatchSize; 803dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ++fbBatchSize; 80495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 80595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 806dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah return false; 80795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah} 80895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 809404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::isLoadBasedCompDoable(hwc_context_t *ctx) { 8107cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula if(mDpy or isSecurePresent(ctx, mDpy) or 8117cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula isYuvPresent(ctx, mDpy)) { 81294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 81394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 81494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return true; 81594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 81694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 817c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryVideoOnly(hwc_context_t *ctx, 818c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 819c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah const bool secureOnly = true; 820c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return videoOnlyComp(ctx, list, not secureOnly) or 821c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah videoOnlyComp(ctx, list, secureOnly); 822c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah} 823c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 824c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::videoOnlyComp(hwc_context_t *ctx, 82511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list, bool secureOnly) { 826af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 827bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 828af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 82911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, secureOnly); 83041269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 831af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 832c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!isYuvPresent(ctx, mDpy) or (mdpCount == 0)) { 833c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 834af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 835af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 836af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 83711c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran /* Bail out if we are processing only secured video layers 83811c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran * and we dont have any */ 83911c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran if(!isSecurePresent(ctx, mDpy) && secureOnly){ 840c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 84111c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran return false; 84211c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran } 84311c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran 844c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(mCurrentFrame.fbCount) 845c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 84641269096daf2363b16dcd89627dd674529a26601Saurabh Shah 847c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(sEnable4k2kYUVSplit){ 848c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah adjustForSourceSplit(ctx, list); 849c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 850c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 851c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 852c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 853c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 8548eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 8558eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 8568eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 859c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 860f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 861f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 862c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(isSkipLayer(layer)) { 863e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 866c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 86786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 86886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 86986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 87086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 87186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 872f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 873f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 875f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 876f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 87741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 87841269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 87941269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 88041269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 88241269096daf2363b16dcd89627dd674529a26601Saurabh Shah 883a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 884a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 885a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 886a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 887a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 888a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 889a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 891c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 89336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* starts at fromIndex and check for each layer to find 89436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * if it it has overlapping with any Updating layer above it in zorder 89536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * till the end of the batch. returns true if it finds any intersection */ 89636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::canPushBatchToTop(const hwc_display_contents_1_t* list, 89736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex) { 89836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i < toIndex; i++) { 89936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) { 90036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(intersectingUpdatingLayers(list, i+1, toIndex, i)) { 90136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 90236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 90336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 90436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 90536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 90636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 90736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 90836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* Checks if given layer at targetLayerIndex has any 90936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * intersection with all the updating layers in beween 91036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * fromIndex and toIndex. Returns true if it finds intersectiion */ 91136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::intersectingUpdatingLayers(const hwc_display_contents_1_t* list, 91236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex, int targetLayerIndex) { 91336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i <= toIndex; i++) { 91436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 91536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(areLayersIntersecting(&list->hwLayers[i], 91636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula &list->hwLayers[targetLayerIndex])) { 91736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 91836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 91936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 92036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 92136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 92236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 92336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 92436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulaint MDPComp::getBatch(hwc_display_contents_1_t* list, 92536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchStart, int& maxBatchEnd, 92636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchCount) { 92736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int i = 0; 92836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZOrder =-1; 929eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran int droppedLayerCt = 0; 93036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while (i < mCurrentFrame.layerCount) { 93136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchCount = 0; 93236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchStart = i; 93336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchEnd = i; 934eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran /* Adjust batch Z order with the dropped layers so far */ 935eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran int fbZ = batchStart - droppedLayerCt; 93636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int firstZReverseIndex = -1; 93785cc9b8dfc7a50f6e8083b67056f3a25702fbba1Prabhanjan Kandula int updatingLayersAbove = 0;//Updating layer count in middle of batch 93836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while(i < mCurrentFrame.layerCount) { 93936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 94036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!batchCount) { 94136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 94236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 94336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 94436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove++; 94536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 94636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 94736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 94836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.drop[i]) { 94936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 950eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran droppedLayerCt++; 95136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 95236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(updatingLayersAbove <= 0) { 95336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 95436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 95536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 95636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 95736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { //Layer is FBComposed, not a drop & updatingLayer > 0 95836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 95936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // We have a valid updating layer already. If layer-i not 96036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // have overlapping with all updating layers in between 96136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // batch-start and i, then we can add layer i to batch. 96236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!intersectingUpdatingLayers(list, batchStart, i-1, i)) { 96336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 96436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 96536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 96636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 96736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(canPushBatchToTop(list, batchStart, i)) { 96836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //If All the non-updating layers with in this batch 96936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //does not have intersection with the updating layers 97036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //above in z-order, then we can safely move the batch to 97136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //higher z-order. Increment fbZ as it is moving up. 97236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if( firstZReverseIndex < 0) { 97336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula firstZReverseIndex = i; 97436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 97536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 97636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 97736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ += updatingLayersAbove; 97836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 97936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove = 0; 98036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 98136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 98236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //both failed.start the loop again from here. 98336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(firstZReverseIndex >= 0) { 98436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i = firstZReverseIndex; 98536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 98636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 98736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 98836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 98936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 99036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 99136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(batchCount > maxBatchCount) { 99236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchCount = batchCount; 99336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchStart = batchStart; 99436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchEnd = batchEnd; 99536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZOrder = fbZ; 99636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 99736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 99836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return fbZOrder; 99936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 100036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 100136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::markLayersForCaching(hwc_context_t* ctx, 100236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula hwc_display_contents_1_t* list) { 100336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* Idea is to keep as many non-updating(cached) layers in FB and 100436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * send rest of them through MDP. This is done in 2 steps. 100536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 1. Find the maximum contiguous batch of non-updating layers. 100636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 2. See if we can improve this batch size for caching by adding 100736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * opaque layers around the batch, if they don't have 100836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * any overlapping with the updating layers in between. 100936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * NEVER mark an updating layer for caching. 101036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * But cached ones can be marked for MDP */ 1011f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1012f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 1013bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int maxBatchEnd = -1; 1014f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 101536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZ = -1; 1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 10172b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah /* Nothing is cached. No batching needed */ 10182b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah if(mCurrentFrame.fbCount == 0) { 1019efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1020af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 10212b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah 10222b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah /* No MDP comp layers, try to use other comp modes */ 10232b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah if(mCurrentFrame.mdpCount == 0) { 10242b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah return false; 1025af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 102736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount); 1028bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 102936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* reset rest of the layers lying inside ROI for MDP comp */ 1030f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 1031efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 1032bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((i < maxBatchStart || i > maxBatchEnd) && 103336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.isFBComposed[i]){ 1034bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]){ 1035bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //If an unsupported layer is being attempted to 1036bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //be pulled out we should fail 1037bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(not isSupportedForMDPComp(ctx, layer)) { 1038bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 1039bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 1040bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 1041efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 104536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // update the frame data 104636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbZ = fbZ; 104736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount = maxBatchCount; 1048af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1049bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 105236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount); 1053efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1054efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1055f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 105611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 1057f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 1058efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_display_contents_1_t* list) { 1059f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 1060efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah int fbCount = 0; 1061f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1062f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 1063f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 1064bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]) 1065bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran fbCount++; 1066f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 1068af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 1069f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1070c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1071af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1072efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah mCurrentFrame.fbCount = fbCount; 1073bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount 1074bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran - mCurrentFrame.dropCount; 1075efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1076bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d" 1077bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount, 1078bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount); 1079f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1080c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 108111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list, 108211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah bool secureOnly) { 1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 1085f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1088f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 1089f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 1090f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1093c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 1094f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 109511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 109611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!secureOnly || isSecureBuffer(hnd)) { 109711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 109811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.fbCount--; 109911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 1100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1101c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1103af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1104af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1105bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1106bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__, 1107f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 1108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1110d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaranhwc_rect_t MDPComp::getUpdatingFBRect(hwc_context_t *ctx, 1111d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_display_contents_1_t* list){ 1112d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t fbRect = (struct hwc_rect){0, 0, 0, 0}; 1113d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_layer_1_t *fbLayer = &list->hwLayers[mCurrentFrame.layerCount]; 1114d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran 1115d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran /* Update only the region of FB needed for composition */ 1116d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++ ) { 1117d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) { 1118d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1119d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 1120d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran fbRect = getUnion(fbRect, dst); 1121d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran } 1122d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran } 1123d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran return fbRect; 1124d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran} 1125d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran 1126c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::postHeuristicsHandling(hwc_context_t *ctx, 1127c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 1128c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1129c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Capability checks 1130c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!resourceCheck(ctx, list)) { 1131c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 1132c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return false; 1133c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1134c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1135c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Limitations checks 1136c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!hwLimitationsCheck(ctx, list)) { 1137c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "%s: HW limitations",__FUNCTION__); 1138c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return false; 1139c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1140c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1141f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //Configure framebuffer first if applicable 1142f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 1143d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t fbRect = getUpdatingFBRect(ctx, list); 1144d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, fbRect, mCurrentFrame.fbZ)) 1145d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran { 1146f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah ALOGD_IF(isDebug(), "%s configure framebuffer failed", 1147f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah __FUNCTION__); 1148f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah return false; 1149f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1150f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1151f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah 1152c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.map(); 1153c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 1155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 1156af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1159f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 1160af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 1161f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 1162f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1163f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1164f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 116536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //Leave fbZ for framebuffer. CACHE/GLES layers go here. 116636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mdpNextZOrder == mCurrentFrame.fbZ) { 116736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mdpNextZOrder++; 116836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 1169f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1170f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 1171f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 117215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna private_handle_t *hnd = (private_handle_t *)layer->handle; 117315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 117415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(configure4k2kYuv(ctx, layer, 117515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpToLayer[mdpIndex]) 117615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna != 0 ){ 117715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(), "%s: Failed to configure split pipes \ 117815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for layer %d",__FUNCTION__, index); 117915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 118015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 118115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 118215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mdpNextZOrder++; 118315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 118415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 118515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 1187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 118815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna layer %d",__FUNCTION__, index); 1189af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1191af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 11941029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah if(!ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd)) { 11951029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to validate and set overlay for dpy %d" 11961029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ,__FUNCTION__, mDpy); 11971029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah return false; 11981029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 11991029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 1200c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah setRedraw(ctx, list); 1201af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 1202af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 1203f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 120402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shahbool MDPComp::resourceCheck(hwc_context_t *ctx, 120502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah hwc_display_contents_1_t *list) { 120602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah const bool fbUsed = mCurrentFrame.fbCount; 120702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(mCurrentFrame.mdpCount > sMaxPipesPerMixer - fbUsed) { 120802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 120902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 121002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 121102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return true; 121202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah} 121302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 121486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool MDPComp::hwLimitationsCheck(hwc_context_t* ctx, 121586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_display_contents_1_t* list) { 121686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 121786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //A-family hw limitation: 121886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If a layer need alpha scaling, MDP can not support. 121986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(ctx->mMDP.version < qdutils::MDSS_V5) { 122086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 122186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 122286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isAlphaScaled( &list->hwLayers[i])) { 122386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula ALOGD_IF(isDebug(), "%s:frame needs alphaScaling",__FUNCTION__); 122486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 122586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 122686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 122786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 122886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 122986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula // On 8x26 & 8974 hw, we have a limitation of downscaling+blending. 123086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If multiple layers requires downscaling and also they are overlapping 123186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //fall back to GPU since MDSS can not handle it. 123286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x74v2() || 123386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qdutils::MDPVersion::getInstance().is8x26()) { 123486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount-1; ++i) { 123586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* botLayer = &list->hwLayers[i]; 123686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 123786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(botLayer)) { 123886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //if layer-i is marked for MDP and needs downscaling 123986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //check if any MDP layer on top of i & overlaps with layer-i 124086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int j = i+1; j < mCurrentFrame.layerCount; ++j) { 124186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* topLayer = &list->hwLayers[j]; 124286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[j] && 124386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(topLayer)) { 124486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_rect_t r = getIntersection(botLayer->displayFrame, 124586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula topLayer->displayFrame); 124686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(isValidRect(r)) 124786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 124886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 124986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 125086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 125186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 125286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 125386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return true; 125486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula} 125586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 1256f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 12578eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 1258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 1259d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah MDPVersion& mdpVersion = qdutils::MDPVersion::getInstance(); 1260b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 126103514577d0c705056352898f66ed2a8e9b131df8Raj Kamal //Do not cache the information for next draw cycle. 126203514577d0c705056352898f66ed2a8e9b131df8Raj Kamal if(numLayers > MAX_NUM_APP_LAYERS or (!numLayers)) { 126303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ALOGI("%s: Unsupported layer count for mdp composition", 126403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal __FUNCTION__); 1265c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.reset(); 1266c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return -1; 12671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 126889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 1269c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //reset old data 1270c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.reset(numLayers); 1271c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1272c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.dropCount = 0; 1273c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1274c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // Detect the start of animation and fall back to GPU only once to cache 1275c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // all the layers in FB and display FB content untill animation completes. 1276c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(ctx->listStats[mDpy].isDisplayAnimating) { 1277c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCurrentFrame.needsRedraw = false; 1278c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(ctx->mAnimationState[mDpy] == ANIMATION_STOPPED) { 1279c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCurrentFrame.needsRedraw = true; 1280c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ctx->mAnimationState[mDpy] = ANIMATION_STARTED; 1281c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } 1282c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan setMDPCompLayerFlags(ctx, list); 1283c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCachedFrame.updateCounts(mCurrentFrame); 1284c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ret = -1; 1285c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan return ret; 1286c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } else { 1287c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ctx->mAnimationState[mDpy] = ANIMATION_STOPPED; 1288c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } 1289c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan 12901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 1291c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(isFrameDoable(ctx)) { 1292c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah generateROI(ctx, list); 1293c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1294c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(tryFullFrame(ctx, list) || tryVideoOnly(ctx, list)) { 1295c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah setMDPCompLayerFlags(ctx, list); 1296c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } else { 1297c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 1298c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1299c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.dropCount = 0; 13008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 1301f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 13021a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 1303c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 1304c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah __FUNCTION__); 13058eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 13061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 1307f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1308f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 1309c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD("GEOMETRY change: %d", 1310c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED)); 1311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 1312f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 1313c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD("%s",sDump.string()); 1314c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1315c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1316c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.cacheAll(list); 1317c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 13188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 1319c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1320c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1321404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index) { 132215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 132315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bool bRet = true; 132415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int mdpIndex = mCurrentFrame.layerToMDP[index]; 132515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 132615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.pipeInfo = new MdpYUVPipeInfo; 132715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.rot = NULL; 132815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo; 132915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ePipeType type = MDPCOMP_OV_VG; 133015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 133115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = ovutils::OV_INVALID; 133215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = ovutils::OV_INVALID; 133315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 133415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 133515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.lIndex == ovutils::OV_INVALID){ 133615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 133715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed", 133815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 133915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 134015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 134115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.rIndex == ovutils::OV_INVALID){ 134215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 134315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed", 134415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 134515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 134615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return bRet; 134715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 1348404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R//=============MDPCompNonSplit================================================== 1349c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1350f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompNonSplit::adjustForSourceSplit(hwc_context_t *ctx, 1351404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R hwc_display_contents_1_t*) { 135215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //As we split 4kx2k yuv layer and program to 2 VG pipes 135315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //(if available) increase mdpcount accordingly 135415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpCount += ctx->listStats[mDpy].yuv4k2kCount; 1355f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah 1356f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //If 4k2k Yuv layer split is possible, and if 1357f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //fbz is above 4k2k layer, increment fb zorder by 1 1358f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //as we split 4k2k layer and increment zorder for right half 1359f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //of the layer 1360f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 1361f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount; 1362f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah for(int index = 0; index < n4k2kYuvCount; index++){ 1363f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah int n4k2kYuvIndex = 1364f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah ctx->listStats[mDpy].yuv4k2kIndices[index]; 1365f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ > n4k2kYuvIndex){ 1366f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah mCurrentFrame.fbZ += 1; 1367f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1368f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1369f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 137015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 137115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1372c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 1373c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 1374c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 1375f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1377f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& mdp_info = 1378f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo)); 1379327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 1380327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1381327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1382327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 1383327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 1385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 1386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1387f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 1388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 1389c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1390c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1391f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx, 139220242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 139320242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 1394c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 139620242a75d65c410071434d639266311376a5b7f6Saurabh Shah 1397c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1398c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 139915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 1400404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(allocSplitVGPipesfor4k2k(ctx, index)){ 140115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 140215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 140315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 140415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1405f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1406f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1407f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoNonSplit; 1408327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 1409f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo; 1410f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1411f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 141220242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 141320242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 1414319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula } else if(qdutils::MDPVersion::getInstance().is8x26() && 1415319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula (ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres > 1024)) { 1416319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula if(qhwc::needsScaling(layer)) 1417319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula type = MDPCOMP_OV_RGB; 141886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } else if(!qhwc::needsScaling(layer) 141911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 142011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1421f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 1422f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 1423f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 14241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 1425c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 142620242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 142720242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 1428c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1433c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 143415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompNonSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 143515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 143615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 143715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 143815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 143915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 144015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 144115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 144215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 144315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 144415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 144515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 144615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 144715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1448f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1449c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1451c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1452c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 145333650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 145433650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1455c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1456c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1457c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1458c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1459c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1460ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1461ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1462ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1463ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1464ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1465e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan // Set the Handle timeout to true for MDP or MIXED composition. 1466e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) { 1467e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan sHandleTimeout = true; 1468e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan } 14690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1470c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1472c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1474f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1475c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1478c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1479327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1480327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 148108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (!(layer->flags & HWC_COLOR_FILL)) { 148208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ALOGE("%s handle null", __FUNCTION__); 148308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return false; 148408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 148508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // No PLAY for Color layer 148608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan layerProp[i].mFlags &= ~HWC_MDPCOMP; 148708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan continue; 1488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 14890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1490f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1491f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 149215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 149315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 149415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 149515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 149615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 149715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 149815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 149915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 150015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 150115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 150215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 150315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 150415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 150515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 150615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 150715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 150815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 150915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 151015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 151115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 151215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 151315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 151415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 151515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1516c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 151715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 151815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 151915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 152015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 152115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 152215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 152315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 152415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 152515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 152615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1527327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 152815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 152915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoNonSplit& pipe_info = 153015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 153115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest dest = pipe_info.index; 153215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(dest == ovutils::OV_INVALID) { 153315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 153415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 153515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1536c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 153715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 153815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 153915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1540c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 154115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 154215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, 154315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hnd, dest ); 1544f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 154515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 154615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 1547327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 154815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 154915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 155015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!rot->queueBuffer(fd, offset)) 155115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 155215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 155315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 155415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 155515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 155615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, dest)) { 155715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d ", 155815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 155915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 156015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1561c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1562c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1563c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1564c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1565c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1566c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1567c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1568f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit=================================================== 1569c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1570f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompSplit::adjustForSourceSplit(hwc_context_t *ctx, 157115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_display_contents_1_t* list){ 157215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //if 4kx2k yuv layer is totally present in either in left half 157315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //or right half then try splitting the yuv layer to avoid decimation 157415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount; 157515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 157615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for(int index = 0; index < n4k2kYuvCount; index++){ 157715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvIndex = ctx->listStats[mDpy].yuv4k2kIndices[index]; 157815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_layer_1_t* layer = &list->hwLayers[n4k2kYuvIndex]; 157915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 1580f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if((dst.left > lSplit) || (dst.right < lSplit)) { 158115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpCount += 1; 158215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1583f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ > n4k2kYuvIndex){ 1584f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah mCurrentFrame.fbZ += 1; 1585f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 158615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 158715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 158815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1589f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 1590f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info, 15912e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 15929640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 15951a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 15961a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 15971a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 15981a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if (dst.left < lSplit) { 15991a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT); 1600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 16021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 16031a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 16041a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(dst.right > lSplit) { 16051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT); 16061a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 16091a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1611c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1612c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1613f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx, 161420242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 161520242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 161620242a75d65c410071434d639266311376a5b7f6Saurabh Shah 161720242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1618c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 16195a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 16205a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 162115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 162215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 162315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 162415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 1625404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(allocSplitVGPipesfor4k2k(ctx, index)){ 162615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 162715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 162815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 162915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 16301bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 16311bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1632f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoSplit; 16333393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1634f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo; 1635c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1636c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 163720242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 163820242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 163944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy) 164011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 164120242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1642c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 164320242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1644c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1645c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 164620242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 164720242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 164816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 164916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1650c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1651c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1652c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 16531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 165415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 165515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 165615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 165715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 165815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 165915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 166015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 166115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 166215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 166315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 166415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 166515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 166615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 166715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 166815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 166915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 167015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 167115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configure(ctx, layer, PipeLayerPair); 167215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 167315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 167415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1675c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1676c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1677c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1678f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 16792e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1680f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& mdp_info = 1681f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 1682327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1683327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1684327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1685327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1686327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1691f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1693c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1694c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1695f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1696c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 169816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 169916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1700c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1701c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1702c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1703c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 170416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1705c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1706c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1707ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1708ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1709ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1710ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1711ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1712e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan // Set the Handle timeout to true for MDP or MIXED composition. 1713e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) { 1714e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan sHandleTimeout = true; 1715e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan } 171616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 171716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1719c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1720f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1721f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1722c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1725660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1726327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1727327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1728327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1729327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1730327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1731c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 173216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1733c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1734c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1735c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1737f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 173815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 173915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 174015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 174115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 174215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 174315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 174415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 174515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 174615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 174715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 174815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 174915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 175015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 175115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 175215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 175315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 175415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 175515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 175615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 175715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 175815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 175915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 176015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 176115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 176215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 176315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 176415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 176515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 176615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 176715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 176815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 176915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 177015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 177115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 177215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 177315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 177415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 177515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoSplit& pipe_info = 177615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 177715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1778327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 177915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 178015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 1781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 178215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 178315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int offset = hnd->offset; 1784327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 178515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->isModeOn()) { 178615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->draw(ctx, fd, offset)) { 1787404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R fd = ctx->mAD->getDstFd(); 1788404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R offset = ctx->mAD->getDstOffset(); 178915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1790f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1791f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 179215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 179315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 179415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 179515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 179615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1797c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 179815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play left mixer ********** 179915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 180015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 180115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 180215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 180315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 180415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for left mixer", 180515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 180615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 180715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1808c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1809c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 181015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play right mixer ********** 181115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 181215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 181315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 181415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 181515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 181615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for right mixer", 181715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 181815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 181915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1820c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1821c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1822327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 182316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1824c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1825327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 182616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1827c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1828c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1829c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1830