hwc_mdpcomp.cpp revision 86c677669148a60b5d472fba407c2bfcdc0c05be
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, 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; 41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 43e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true; 44bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::sEnablePartialFrameUpdate = false; 45f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 46d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahdouble MDPComp::sMaxBw = 0.0; 470feed9dccc812e37f7e2e58f3fb8246511f831f9Saurabh Shahdouble MDPComp::sBwClaimed = 0.0; 4815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::sEnable4k2kYUVSplit = false; 49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) { 51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(isDisplaySplit(ctx, dpy)) { 52f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompSplit(dpy); 53c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 54f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompNonSplit(dpy); 55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 57f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 60c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 63bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 66361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d " 68efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah "fbCount:%2d \n", mCurrentFrame.layerCount, 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 80bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.drop[index] ? "DROP" : 83bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"), 84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 86f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 111e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(property_get("persist.hwc.partialupdate.enable", property, NULL) > 0) { 118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL && 119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran qdutils::MDPVersion::getInstance().is8x74v2()) 120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate = true; 121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__, 123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate); 124bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 125f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 131f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1326bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1336bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1346bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1356bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1366bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 143c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 15115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 15215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((property_get("debug.mdpcomp.4k2kSplit", property, "0") > 0) && 15315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 15415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 15515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna sEnable4k2kYUVSplit = true; 15615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 158c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 160699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) { 161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.cacheAll(list); 163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 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 } 173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 174359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 180359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 194bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Drop the layer when its already present in FB OR when it lies 195bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * outside frame's ROI */ 196bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) { 197f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 198bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 201c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 20216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 203f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 204af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 205f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 207af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 208af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 214c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 221af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 224ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 228af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 238af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 239f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 24587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&isFBComposed, true, sizeof(isFBComposed)); 24687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&drop, false, sizeof(drop)); 247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 25987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed)); 26087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&drop, &curFrame.drop, sizeof(drop)); 26187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula} 26287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula 263e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaranbool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame, 264e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran hwc_display_contents_1_t* list) { 26587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if(layerCount != curFrame.layerCount) 26687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 26787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula for(int i = 0; i < curFrame.layerCount; i++) { 26887957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if((curFrame.isFBComposed[i] != isFBComposed[i]) || 26987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula (curFrame.drop[i] != drop[i])) { 27087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 27187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 272e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran if(curFrame.isFBComposed[i] && 273e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran (hnd[i] != list->hwLayers[i].handle)){ 274e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran return false; 275e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran } 27687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 27787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return true; 278c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 279c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 280efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) { 281efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 282efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((not isYuvBuffer(hnd) and has90Transform(layer)) or 283efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (not isValidDimension(ctx,layer)) 284efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //More conditions here, SKIP, sRGB+Blend etc 285efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ) { 286efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 287efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 288efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 289efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 290efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 2911b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 29241269096daf2363b16dcd89627dd674529a26601Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 2930ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 2940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 29608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (layer->flags & HWC_COLOR_FILL) { 29708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // Color layer 29808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return true; 29908cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 3000ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 3010ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 30480864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed //XXX: Investigate doing this with pixel phase on MDSS 3058d07dd7a9493c19215acf1e992502d1f51329fe0Naseer Ahmed if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf)) 30680864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return false; 30780864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed 308f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 309f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 3100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3118f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 3130ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 3140ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 3150ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 3160ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 3190ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 321f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3231b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3241b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3251b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3270ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3280ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 329bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if((w_dscale > 1.0f) || (h_dscale > 1.0f)) { 330bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran const uint32_t downscale = 33141269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 332bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(ctx->mMDP.version >= qdutils::MDSS_V5) { 333bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran /* Workaround for downscales larger than 4x. 334bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran * Will be removed once decimator block is enabled for MDSS 335bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran */ 336bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 337bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 338bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran h_dscale > downscale) 339bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 340bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { 341bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(w_dscale > 64 || h_dscale > 64) 342bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 343bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } 344bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { //A-family 345bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(w_dscale > downscale || h_dscale > downscale) 34641269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 34741269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 34841269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 34941269096daf2363b16dcd89627dd674529a26601Saurabh Shah 3500ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3510ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3520ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type, 3541a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 355c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 356c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 357c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 358c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 3601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer); 361f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 362f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 3661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer); 367f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 368f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 370c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 3761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer); 377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 378f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 381c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 382c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 383c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 385af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 386e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 387f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 390af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 39156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 392361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) { 39356d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 39456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 39556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 39656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 397361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) { 399c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 401af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 402af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 403586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 404586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 405af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 406586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 407af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 410a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran/* 411a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 1) Identify layers that are not visible in the updating ROI and drop them 412a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * from composition. 413a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 2) If we have a scaling layers which needs cropping against generated ROI. 414a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * Reset ROI to full resolution. 415a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran */ 416bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx, 417bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_display_contents_1_t* list, hwc_rect_t roi) { 418bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 419bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 420bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(roi)) 421bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 422bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 423a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t visibleRect = roi; 424a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 425a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran for(int i = numAppLayers - 1; i >= 0; i--){ 426a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 427a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(!isValidRect(visibleRect)) { 428a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.drop[i] = true; 429a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.dropCount++; 430a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran } 431a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 432bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran const hwc_layer_1_t* layer = &list->hwLayers[i]; 433bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 434bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = layer->displayFrame; 435f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t srcRect = integerizeSourceCrop(layer->sourceCropf); 436bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int transform = layer->transform; 437bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 438a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t res = getIntersection(visibleRect, dstRect); 439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_w = res.right - res.left; 441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_h = res.bottom - res.top; 442bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_w = dstRect.right - dstRect.left; 443bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_h = dstRect.bottom - dstRect.top; 444bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 445bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(res)) { 446bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.drop[i] = true; 447bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount++; 448bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran }else { 449bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Reset frame ROI when any layer which needs scaling also needs ROI 450bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * cropping */ 451bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((res_w != dst_w || res_h != dst_h) && 45286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula needsScaling (layer)) { 4530938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee ALOGI("%s: Resetting ROI due to scaling", __FUNCTION__); 454bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 455bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 457bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 459a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 460a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if (layer->blending == HWC_BLENDING_NONE) 461a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran visibleRect = deductRect(visibleRect, res); 462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return true; 464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!sEnablePartialFrameUpdate) { 470bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(mDpy || isDisplaySplit(ctx, mDpy)){ 474bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: ROI not supported for" 475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran "the (1) external / virtual display's (2) dual DSI displays", 476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran __FUNCTION__); 477bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 478bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 479bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 480a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) 481a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran return; 482a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 483bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(list->flags & HWC_GEOMETRY_CHANGED) 484bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 485bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 486bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0}; 487bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran for(int index = 0; index < numAppLayers; index++ ) { 488bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) || 489bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) { 490bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = list->hwLayers[index].displayFrame; 491f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t srcRect = integerizeSourceCrop( 492f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R list->hwLayers[index].sourceCropf); 493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int transform = list->hwLayers[index].transform; 494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 495bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Intersect against display boundaries */ 496bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = getUnion(roi, dstRect); 497bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 498bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 499bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 500bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!validateAndApplyROI(ctx, list, roi)){ 501bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = (struct hwc_rect) {0, 0, 502bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres}; 503bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 504bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 505bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.x = roi.left; 506bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.y = roi.top; 507bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.w = roi.right - roi.left; 508bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.h = roi.bottom - roi.top; 509bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 510bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__, 511bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi.left, roi.top, roi.right, roi.bottom); 512bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 513bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 518f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 519af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 5211b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) { 52233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 52333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 52433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 52533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 530c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 531c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 532c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 533c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 535c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 536f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 537efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(isYuvBuffer(hnd) && has90Transform(layer)) { 538efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!canUseRotator(ctx, mDpy)) { 539efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d", 540efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__, mDpy); 54186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 54286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 543c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 5442902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 5452902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 5462902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 5472902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 5482902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 5492902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 5502902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 5512902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 552c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 554f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 555f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 556f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 557f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 558af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 559af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 560af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 561af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 562e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 563af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 564af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 56586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 56686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!hwLimitationsCheck(ctx, list)) { 56786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula ALOGD_IF(isDebug(), "%s: HW limitations",__FUNCTION__); 56886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 56986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 57086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 571af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 572af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 573af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 574af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 575efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit presentation / secondary-only layer. 576efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) && 577efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (list->numHwLayers - 1) > MAX_SEC_LAYERS) { 578efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 579efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 580efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 581efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 582efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 583efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 584efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 585efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 586efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__); 587efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 588efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 58984a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu 59084a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //For 8x26, if there is only one layer which needs scale for secondary 59184a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //while no scale for primary display, DMA pipe is occupied by primary. 59284a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //If need to fall back to GLES composition, virtual display lacks DMA 59384a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //pipe and error is reported. 59484a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu if(qdutils::MDPVersion::getInstance().is8x26() && 59584a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu mDpy >= HWC_DISPLAY_EXTERNAL && 59686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qhwc::needsScaling(layer)) 59784a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu return false; 598efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 599af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 601bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop, 602bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 603bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount - 604bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount; 605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 60615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 60715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna modifymdpCountfor4k2k(ctx, list); 60815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 60915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 61002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!resourceCheck(ctx, list)) { 61102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 6128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 6138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 6148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 615af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 616af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 617af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 618af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 619af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 620e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 621e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 622e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 623e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 624e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 62594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah bool ret = false; 62694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(isLoadBasedCompDoable(ctx, list)) { 62795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah ret = loadBasedCompPreferGPU(ctx, list) || 62895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah loadBasedCompPreferMDP(ctx, list); 62994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 63094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 63194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(!ret) { 63294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ret = cacheBasedComp(ctx, list); 63394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 63494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 63594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return ret; 63694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 63794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 63894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::cacheBasedComp(hwc_context_t *ctx, 63994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 64094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 641af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 642af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 643efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 644efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //If an MDP marked layer is unsupported cannot do partial MDP Comp 645efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 646efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 647efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 648efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 649efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list", 650efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__); 651efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 652efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 653efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 654efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 655efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 65611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, false /*secure only*/); 65736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula bool ret = markLayersForCaching(ctx, list); //sets up fbZ also 658efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!ret) { 659efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy); 660efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 661efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 662af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 663af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 664efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 66515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 66615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna modifymdpCountfor4k2k(ctx, list); 66715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 66815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 669efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit cases where a video has non-updating background. 670efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) and 671efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (mdpCount > MAX_SEC_LAYERS)) { 672efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 673efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 674efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 675efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 67602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!resourceCheck(ctx, list)) { 67702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 6788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 6798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 6808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 68495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shahbool MDPComp::loadBasedCompPreferGPU(hwc_context_t *ctx, 68594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 68694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 68794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.reset(numAppLayers); 68894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 68995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah int stagesForMDP = min(sMaxPipesPerMixer, ctx->mOverlay->availablePipes( 69095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mDpy, Overlay::MIXER_DEFAULT)); 69195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //If MDP has X possible stages, it can take X layers. 69295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int batchSize = numAppLayers - (stagesForMDP - 1); //1 for FB 69395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 69494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(batchSize <= 0) { 69594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: Not attempting", __FUNCTION__); 69694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 69794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 69894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 69994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int minBatchStart = -1; 70094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah size_t minBatchPixelCount = SIZE_MAX; 70194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 70294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah for(int i = 0; i <= numAppLayers - batchSize; i++) { 70394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah uint32_t batchPixelCount = 0; 70494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah for(int j = i; j < i + batchSize; j++) { 70594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[j]; 706f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 70794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah batchPixelCount += (crop.right - crop.left) * 70894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah (crop.bottom - crop.top); 70994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 71094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 71194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(batchPixelCount < minBatchPixelCount) { 71294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah minBatchPixelCount = batchPixelCount; 71394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah minBatchStart = i; 71494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 71594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 71694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 71794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(minBatchStart < 0) { 71894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: No batch found batchSize %d numAppLayers %d", 71994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah __FUNCTION__, batchSize, numAppLayers); 72094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 72194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 72294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 72394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah for(int i = 0; i < numAppLayers; i++) { 72494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(i < minBatchStart || i >= minBatchStart + batchSize) { 72594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 72694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 72794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: MDP unsupported layer found at %d", 72894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah __FUNCTION__, i); 72994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 73094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 73194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.isFBComposed[i] = false; 73294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 73394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 73494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 73594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.fbZ = minBatchStart; 73694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.fbCount = batchSize; 73794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - batchSize; 73894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 73915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 74015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna modifymdpCountfor4k2k(ctx, list); 74115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 74215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 74302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!resourceCheck(ctx, list)) { 74402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 74594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 74694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 74794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 74894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: fbZ %d batchSize %d", 74994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah __FUNCTION__, mCurrentFrame.fbZ, batchSize); 75094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return true; 75194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 75294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 75395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shahbool MDPComp::loadBasedCompPreferMDP(hwc_context_t *ctx, 75495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah hwc_display_contents_1_t* list) { 75595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 75695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //TODO get the ib from sysfs node. 75795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //Full screen is from ib perspective, not actual full screen 75895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int bpp = 4; 75995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah double panelRefRate = 76095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 76195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 76295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah double bwLeft = sMaxBw - sBwClaimed; 76395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 76495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int fullScreenLayers = bwLeft * 1000000000 / (ctx->dpyAttr[mDpy].xres 76595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah * ctx->dpyAttr[mDpy].yres * bpp * panelRefRate); 76695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 76795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int fbBatchSize = numAppLayers - (fullScreenLayers - 1); 76895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //If batch size is not at least 2, we aren't really preferring MDP, since 76995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //only 1 layer going to GPU could actually translate into an entire FB 77095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //needed to be fetched by MDP, thus needing more b/w rather than less. 77195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah if(fbBatchSize < 2 || fbBatchSize > numAppLayers) { 77295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah ALOGD_IF(isDebug(), "%s: Not attempting", __FUNCTION__); 77395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return false; 77495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 77595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 77695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //Top-most layers constitute FB batch 77795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int fbBatchStart = numAppLayers - fbBatchSize; 77895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 77995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //Bottom-most layers constitute MDP batch 78095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah for(int i = 0; i < fbBatchStart; i++) { 78195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 78295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 78395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah ALOGD_IF(isDebug(), "%s: MDP unsupported layer found at %d", 78495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah __FUNCTION__, i); 78595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return false; 78695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 78795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 78895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 78995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 79095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mCurrentFrame.fbZ = fbBatchStart; 79195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mCurrentFrame.fbCount = fbBatchSize; 79295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - fbBatchSize; 79395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 79415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 79515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna modifymdpCountfor4k2k(ctx, list); 79615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 79715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 79895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah if(!resourceCheck(ctx, list)) { 79995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 80095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return false; 80195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 80295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 80395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah ALOGD_IF(isDebug(), "%s: FB Z %d, num app layers %d, MDP Batch Size %d", 80495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah __FUNCTION__, mCurrentFrame.fbZ, numAppLayers, 80595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah numAppLayers - fbBatchSize); 80695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 80795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return true; 80895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah} 80995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 81094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::isLoadBasedCompDoable(hwc_context_t *ctx, 81194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 81294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(mDpy or isSecurePresent(ctx, mDpy) or 81394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah not (list->flags & HWC_GEOMETRY_CHANGED)) { 81494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 81594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 81694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return true; 81794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 81894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 819af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 82011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list, bool secureOnly) { 821af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 822bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 823af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 82411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, secureOnly); 82541269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 826af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 827af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 828af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 829af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 830af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 83111c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran /* Bail out if we are processing only secured video layers 83211c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran * and we dont have any */ 83311c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran if(!isSecurePresent(ctx, mDpy) && secureOnly){ 83411c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran return false; 83511c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran } 83611c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran 83741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 83841269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 83941269096daf2363b16dcd89627dd674529a26601Saurabh Shah 84002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!resourceCheck(ctx, list)) { 84102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 8428eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 8438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 8448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 845c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 846c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 847c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 850e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating; 851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 852e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah if(isSkipLayer(layer) && !extAnimBlockFeature) { 853e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 854f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 85786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 85886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 85986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 86086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 86186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 862f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 865f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 866f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 86741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 86841269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 86941269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 87041269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 87241269096daf2363b16dcd89627dd674529a26601Saurabh Shah 873a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 874a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 875a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 876a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 877a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 878a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 879a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 880c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 882c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 88336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* starts at fromIndex and check for each layer to find 88436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * if it it has overlapping with any Updating layer above it in zorder 88536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * till the end of the batch. returns true if it finds any intersection */ 88636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::canPushBatchToTop(const hwc_display_contents_1_t* list, 88736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex) { 88836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i < toIndex; i++) { 88936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) { 89036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(intersectingUpdatingLayers(list, i+1, toIndex, i)) { 89136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 89236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 89336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 89436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 89536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 89636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 89736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 89836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* Checks if given layer at targetLayerIndex has any 89936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * intersection with all the updating layers in beween 90036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * fromIndex and toIndex. Returns true if it finds intersectiion */ 90136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::intersectingUpdatingLayers(const hwc_display_contents_1_t* list, 90236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex, int targetLayerIndex) { 90336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i <= toIndex; i++) { 90436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 90536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(areLayersIntersecting(&list->hwLayers[i], 90636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula &list->hwLayers[targetLayerIndex])) { 90736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 90836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 90936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 91036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 91136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 91236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 91336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 91436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulaint MDPComp::getBatch(hwc_display_contents_1_t* list, 91536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchStart, int& maxBatchEnd, 91636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchCount) { 91736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int i = 0; 91836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int updatingLayersAbove = 0;//Updating layer count in middle of batch 91936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZOrder =-1; 92036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while (i < mCurrentFrame.layerCount) { 92136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchCount = 0; 92236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchStart = i; 92336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchEnd = i; 92436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZ = batchStart; 92536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int firstZReverseIndex = -1; 92636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while(i < mCurrentFrame.layerCount) { 92736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 92836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!batchCount) { 92936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 93036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 93136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 93236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove++; 93336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 93436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 93536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 93636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.drop[i]) { 93736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 93836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 93936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(updatingLayersAbove <= 0) { 94036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 94136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 94236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 94336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 94436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { //Layer is FBComposed, not a drop & updatingLayer > 0 94536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 94636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // We have a valid updating layer already. If layer-i not 94736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // have overlapping with all updating layers in between 94836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // batch-start and i, then we can add layer i to batch. 94936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!intersectingUpdatingLayers(list, batchStart, i-1, i)) { 95036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 95136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 95236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 95336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 95436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(canPushBatchToTop(list, batchStart, i)) { 95536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //If All the non-updating layers with in this batch 95636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //does not have intersection with the updating layers 95736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //above in z-order, then we can safely move the batch to 95836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //higher z-order. Increment fbZ as it is moving up. 95936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if( firstZReverseIndex < 0) { 96036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula firstZReverseIndex = i; 96136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 96236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 96336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 96436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ += updatingLayersAbove; 96536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 96636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove = 0; 96736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 96836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 96936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //both failed.start the loop again from here. 97036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(firstZReverseIndex >= 0) { 97136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i = firstZReverseIndex; 97236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 97336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 97436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 97536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 97636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 97736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 97836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(batchCount > maxBatchCount) { 97936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchCount = batchCount; 98036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchStart = batchStart; 98136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchEnd = batchEnd; 98236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZOrder = fbZ; 98336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 98436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 98536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return fbZOrder; 98636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 98736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 98836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::markLayersForCaching(hwc_context_t* ctx, 98936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula hwc_display_contents_1_t* list) { 99036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* Idea is to keep as many non-updating(cached) layers in FB and 99136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * send rest of them through MDP. This is done in 2 steps. 99236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 1. Find the maximum contiguous batch of non-updating layers. 99336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 2. See if we can improve this batch size for caching by adding 99436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * opaque layers around the batch, if they don't have 99536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * any overlapping with the updating layers in between. 99636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * NEVER mark an updating layer for caching. 99736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * But cached ones can be marked for MDP */ 998f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 999f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 1000bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int maxBatchEnd = -1; 1001f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 100236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZ = -1; 1003f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1004f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 1005af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 1006af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 1007efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1008af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1009af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 1010af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 1011efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1012af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1013f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 101436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount); 1015bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 101636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* reset rest of the layers lying inside ROI for MDP comp */ 1017f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 1018efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 1019bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((i < maxBatchStart || i > maxBatchEnd) && 102036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.isFBComposed[i]){ 1021bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]){ 1022bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //If an unsupported layer is being attempted to 1023bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //be pulled out we should fail 1024bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(not isSupportedForMDPComp(ctx, layer)) { 1025bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 1026bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 1027bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 1028efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 1029f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1030f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 103236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // update the frame data 103336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbZ = fbZ; 103436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount = maxBatchCount; 1035af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1036bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1038f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 103936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount); 1040efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1041efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 104311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 1045efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_display_contents_1_t* list) { 1046f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 1047efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah int fbCount = 0; 1048f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1049f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 1050efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 1052bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]) 1053bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran fbCount++; 1054f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 1055f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 1056af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 1057f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1058c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1059af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1060efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah mCurrentFrame.fbCount = fbCount; 1061bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount 1062bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran - mCurrentFrame.dropCount; 1063efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1064bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d" 1065bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount, 1066bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount); 1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 106911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list, 107011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah bool secureOnly) { 1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 1072a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 1073a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 1074a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 1075a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 1076a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 1077a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 1078a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 1079a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 1080a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 1081f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 1082f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1085f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 1088f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 1089f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1090c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 109211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 109311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!secureOnly || isSecureBuffer(hnd)) { 109411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 109511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.fbCount--; 109611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 1097f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1098c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1099f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1100af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1101af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1102bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1103bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__, 1104f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 1105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1107af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 1109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 1110af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1111f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1112f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1113f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 1114af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 1115f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 1116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1117f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1118f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 111936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //Leave fbZ for framebuffer. CACHE/GLES layers go here. 112036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mdpNextZOrder == mCurrentFrame.fbZ) { 112136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mdpNextZOrder++; 112236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 1123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 1125f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 112615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna private_handle_t *hnd = (private_handle_t *)layer->handle; 112715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 112815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(configure4k2kYuv(ctx, layer, 112915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpToLayer[mdpIndex]) 113015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna != 0 ){ 113115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(), "%s: Failed to configure split pipes \ 113215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for layer %d",__FUNCTION__, index); 113315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 113415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 113515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 113615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mdpNextZOrder++; 113715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 113815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 113915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1140f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 1141f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 114215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna layer %d",__FUNCTION__, index); 1143af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1144f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1145af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1146f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1147f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1148af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 1149af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 1150f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 115102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shahbool MDPComp::resourceCheck(hwc_context_t *ctx, 115202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah hwc_display_contents_1_t *list) { 115302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah const bool fbUsed = mCurrentFrame.fbCount; 115402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(mCurrentFrame.mdpCount > sMaxPipesPerMixer - fbUsed) { 115502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 115602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 115702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 115802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 115902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!arePipesAvailable(ctx, list)) { 116002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 116102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 116202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 1163d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double size = calcMDPBytesRead(ctx, list); 116402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!bandwidthCheck(ctx, size)) { 116502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 116602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 116702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 116802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 116902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return true; 117002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah} 117102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 1172d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahdouble MDPComp::calcMDPBytesRead(hwc_context_t *ctx, 11738eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_display_contents_1_t* list) { 1174d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double size = 0; 1175d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah const double GIG = 1000000000.0; 11768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1177d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah //Skip for targets where no device tree value for bw is supplied 1178d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if(sMaxBw <= 0.0) { 1179d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah return 0.0; 1180d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah } 11814b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson 11828eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah for (uint32_t i = 0; i < list->numHwLayers - 1; i++) { 11838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 11848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 11858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 11864b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if (hnd) { 11878f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 11883d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah hwc_rect_t dst = layer->displayFrame; 11894b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson float bpp = ((float)hnd->size) / (hnd->width * hnd->height); 1190d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah size += (bpp * (crop.right - crop.left) * 1191d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah (crop.bottom - crop.top) * 1192d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top)) / 1193d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah GIG; 11944b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson } 11958eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 11968eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 11978eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 11988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(mCurrentFrame.fbCount) { 11998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1]; 1200d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah int tempw, temph; 1201d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah size += (getBufferSizeAndDimensions( 1202d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah layer->displayFrame.right - layer->displayFrame.left, 1203d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah layer->displayFrame.bottom - layer->displayFrame.top, 1204d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah HAL_PIXEL_FORMAT_RGBA_8888, 1205d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah tempw, temph)) / GIG; 12068eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 12078eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 12088eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return size; 12098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 12108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1211d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const double& size) { 1212d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah //Skip for targets where no device tree value for bw is supplied 1213d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if(sMaxBw <= 0.0) { 1214d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah return true; 1215d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah } 1216d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 1217d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double panelRefRate = 1218d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 1219d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if((size * panelRefRate) > (sMaxBw - sBwClaimed)) { 1220d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah return false; 12218eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 12228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return true; 12238eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 12248eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 122586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool MDPComp::hwLimitationsCheck(hwc_context_t* ctx, 122686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_display_contents_1_t* list) { 122786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 122886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //A-family hw limitation: 122986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If a layer need alpha scaling, MDP can not support. 123086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(ctx->mMDP.version < qdutils::MDSS_V5) { 123186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 123286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 123386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isAlphaScaled( &list->hwLayers[i])) { 123486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula ALOGD_IF(isDebug(), "%s:frame needs alphaScaling",__FUNCTION__); 123586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 123686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 123786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 123886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 123986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 124086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula // On 8x26 & 8974 hw, we have a limitation of downscaling+blending. 124186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If multiple layers requires downscaling and also they are overlapping 124286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //fall back to GPU since MDSS can not handle it. 124386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x74v2() || 124486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qdutils::MDPVersion::getInstance().is8x26()) { 124586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount-1; ++i) { 124686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* botLayer = &list->hwLayers[i]; 124786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 124886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(botLayer)) { 124986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //if layer-i is marked for MDP and needs downscaling 125086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //check if any MDP layer on top of i & overlaps with layer-i 125186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int j = i+1; j < mCurrentFrame.layerCount; ++j) { 125286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* topLayer = &list->hwLayers[j]; 125386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[j] && 125486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(topLayer)) { 125586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_rect_t r = getIntersection(botLayer->displayFrame, 125686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula topLayer->displayFrame); 125786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(isValidRect(r)) 125886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 125986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 126086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 126186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 126286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 126386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 126486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return true; 126586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula} 126686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 1267f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 12688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 1269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 1270d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah MDPVersion& mdpVersion = qdutils::MDPVersion::getInstance(); 1271b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 12721a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //reset old data 12731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.reset(numLayers); 1274bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1275bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 1276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 12771a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 12781a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //do not cache the information for next draw cycle. 12791a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(numLayers > MAX_NUM_APP_LAYERS) { 12801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 12810938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee ALOGI("%s: Number of App layers exceeded the limit ", 128265cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa __FUNCTION__); 12838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 128465cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa return ret; 12851a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 128689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 12871a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 12881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!isFrameDoable(ctx)) { 12891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 12901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah __FUNCTION__); 12911a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 12928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 12938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 12941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 1295af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1296bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran generateROI(ctx, list); 1297bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 1298d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah //Convert from kbps to gbps 1299d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah sMaxBw = mdpVersion.getHighBw() / 1000000.0; 1300d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if (ctx->mExtDisplay->isConnected() || ctx->mMDP.panel != MIPI_CMD_PANEL) { 1301d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah sMaxBw = mdpVersion.getLowBw() / 1000000.0; 1302d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah } 1303d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 13041a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Check whether layers marked for MDP Composition is actually doable. 13051a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(isFullFrameDoable(ctx, list)) { 13061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 13071a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 13081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 130915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //If 4k2k Yuv layer split is possible, and if 131015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //fbz is above 4k2k layer, increment fb zorder by 1 131115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //as we split 4k2k layer and increment zorder for right half 131215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //of the layer 131315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 131415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount; 131515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for(int index = 0; index < n4k2kYuvCount; index++){ 131615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvIndex = 131715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ctx->listStats[mDpy].yuv4k2kIndices[index]; 131815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(mCurrentFrame.fbZ > n4k2kYuvIndex){ 131915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.fbZ += 1; 132015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 132115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 132215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 13231a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, 1324699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.fbZ)) { 13251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 1326699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 1327d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 13288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 13298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 133089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 13311a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 13321a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Acquire and Program MDP pipes 13331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programMDP(ctx, list)) { 13341a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 1335d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 13368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 13378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 13381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { //Success 13391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Any change in composition types needs an FB refresh 13401a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = false; 1341e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran if(!mCachedFrame.isSameFrame(mCurrentFrame, list) || 13421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 134387957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula isSkipPresent(ctx, mDpy)) { 13441a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = true; 1345699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 13461a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 134711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } else if(isOnlyVideoDoable(ctx, list, false /*secure only*/) || 134811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah isOnlyVideoDoable(ctx, list, true /*secure only*/)) { 13491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //All layers marked for MDP comp cannot be bypassed. 13501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Try to compose atleast YUV layers through MDP comp and let 13511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //all the RGB layers compose in FB 13521a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Destination over 135315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 135415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 135515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna modifymdpCountfor4k2k(ctx, list); 135615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 135715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 13581a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = -1; 13591a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount) 13601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 13611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 13621a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 13631a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 13641a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 13651a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 13661a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) { 13671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 1368699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 1369d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 13708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 13718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 137289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 13731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 13748beff124c3a101d55afde1aaa7c27bb8afc19df9Saurabh Shah if(!programMDP(ctx, list)) { 1375699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 1376d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 13778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 13788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 1379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 13801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 13811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 1382a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1383a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.dropCount = 0; 13848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 13858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 13861a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 13871a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //UpdateLayerFlags 13881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah setMDPCompLayerFlags(ctx, list); 1389bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCachedFrame.cacheAll(list); 13901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 1391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 139289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula // unlock it before calling dump function to avoid deadlock 1393f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 1394af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 1395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 1396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 1397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 1398c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1399c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 14008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit: 1401d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double panelRefRate = 1402d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 1403d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah sBwClaimed += calcMDPBytesRead(ctx, list) * panelRefRate; 14048eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 1405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 140715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::allocSplitVGPipesfor4k2k(hwc_context_t *ctx, 140815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_display_contents_1_t* list, int index) { 140915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 141015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bool bRet = true; 141115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_layer_1_t* layer = &list->hwLayers[index]; 141215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna private_handle_t *hnd = (private_handle_t *)layer->handle; 141315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int mdpIndex = mCurrentFrame.layerToMDP[index]; 141415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 141515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.pipeInfo = new MdpYUVPipeInfo; 141615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.rot = NULL; 141715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo; 141815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ePipeType type = MDPCOMP_OV_VG; 141915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 142015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = ovutils::OV_INVALID; 142115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = ovutils::OV_INVALID; 142215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 142315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 142415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.lIndex == ovutils::OV_INVALID){ 142515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 142615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed", 142715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 142815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 142915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 143015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.rIndex == ovutils::OV_INVALID){ 143115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 143215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed", 143315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 143415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 143515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return bRet; 143615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 1437f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompNonSplit=================================================== 1438c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 143915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnavoid MDPCompNonSplit::modifymdpCountfor4k2k(hwc_context_t *ctx, 144015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_display_contents_1_t* list){ 144115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //As we split 4kx2k yuv layer and program to 2 VG pipes 144215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //(if available) increase mdpcount accordingly 144315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpCount += ctx->listStats[mDpy].yuv4k2kCount; 144415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 144515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1446c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 1447c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 1448c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 1449f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1451f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& mdp_info = 1452f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo)); 1453327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 1454327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1455327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1456327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 1457327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1458f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 1459f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 1460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1461f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 1462f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 1463c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1464c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1465f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx, 14661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 14671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 14681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = mCurrentFrame.mdpCount; 14691a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT); 14701a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 14711a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe for FB 14721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 14731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah availPipes -= 1; 14741a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 14751a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 14761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d", 14771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, numPipesNeeded, availPipes); 14781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 14791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 14801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 148111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 148211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 148311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 148411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 148511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 148611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 148711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 148811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx, 148911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 149011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 149111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 149211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 149311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 149411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 149511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 149611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 149715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 149815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipesNeeded = pipesNeeded + 2; 149915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 150015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else if(isYuvBuffer(hnd)) { 150111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 150211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 150311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 150411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 150511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 150611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 150711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 150811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 150911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 151011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 151111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 151211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 151311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 15141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 1515c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 151616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 1517f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx, 151820242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 151920242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 1520c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1521f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 152220242a75d65c410071434d639266311376a5b7f6Saurabh Shah 1523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1524c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 152515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 152615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(allocSplitVGPipesfor4k2k(ctx, list, index)){ 152715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 152815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 152915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 153015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1533f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoNonSplit; 1534327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 1535f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo; 1536f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1537f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 153820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 153920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 154086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } else if(!qhwc::needsScaling(layer) 154111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 154211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1543f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 1544f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 1545f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 15461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 1547c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 154820242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 154920242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 1550c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1551c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1552c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1553c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1554c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 155615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompNonSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 155715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 155815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 155915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 156015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 156115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 156215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 156315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 156415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 156515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 156615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 156715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 156815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 156915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1570f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1571c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1573c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 157533650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 157633650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1577c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1578c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1579c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1582ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1583ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1584ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1585ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1586ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1587c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 158833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 1589c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 15900ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1591c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1593c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1596c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1599c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1600327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1601327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 160208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (!(layer->flags & HWC_COLOR_FILL)) { 160308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ALOGE("%s handle null", __FUNCTION__); 160408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return false; 160508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 160608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // No PLAY for Color layer 160708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan layerProp[i].mFlags &= ~HWC_MDPCOMP; 160808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan continue; 1609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 16100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 161315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 161415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 161515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 161615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 161715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 161815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 161915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 162015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 162115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 162215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 162315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 162415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 162515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 162615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 162715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 162815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 162915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 163015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 163115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 163215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 163315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 163415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 163515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 163615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1637c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 163815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 163915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 164015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 164115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 164215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 164315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 164415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 164515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 164615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 164715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1648327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 164915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 165015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoNonSplit& pipe_info = 165115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 165215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest dest = pipe_info.index; 165315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(dest == ovutils::OV_INVALID) { 165415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 165515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 165615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1657c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 165815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 165915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 166015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1661c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 166215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 166315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, 166415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hnd, dest ); 1665f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 166615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 166715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 1668327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 166915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 167015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 167115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!rot->queueBuffer(fd, offset)) 167215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 167315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 167415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 167515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 167615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 167715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, dest)) { 167815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d ", 167915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 168015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 168115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1682c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1683c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1684c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1685c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1686c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1687c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1688c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1689f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit=================================================== 1690c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 169115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnavoid MDPCompSplit::modifymdpCountfor4k2k(hwc_context_t *ctx, 169215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_display_contents_1_t* list){ 169315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //if 4kx2k yuv layer is totally present in either in left half 169415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //or right half then try splitting the yuv layer to avoid decimation 169515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount; 169615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 169715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for(int index = 0; index < n4k2kYuvCount; index++){ 169815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvIndex = ctx->listStats[mDpy].yuv4k2kIndices[index]; 169915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_layer_1_t* layer = &list->hwLayers[n4k2kYuvIndex]; 170015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 170115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 170215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 170315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpCount += 1; 170415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 170515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 170615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 170715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1708f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx, 17091a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list, 17101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 1711c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 17122e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 17139640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 17149640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 1717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 1718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 17201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) { 1721f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 17221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) { 1723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 1724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1726c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1727c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 1728c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1729c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1730f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx, 17311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 17321a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 173301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesNeeded = 0; 17341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 17351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah for(int i = 0; i < Overlay::MIXER_MAX; i++) { 17361a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list, i); 17371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, i); 17381a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 17391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe(s)for FB 17401a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 174101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah numPipesNeeded += 1; 17421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 174301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah totalPipesNeeded += numPipesNeeded; 174401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 174501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per mixer check. 17461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 17471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 17481a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah "dpy %d mixer %d needed %d, avail %d", 17491a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, i, numPipesNeeded, availPipes); 17501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 17511a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 17521a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 175301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 175401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per display check, since unused pipes can get counted twice. 175501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesAvailable = ov.availablePipes(mDpy); 175601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah if(totalPipesNeeded > totalPipesAvailable) { 175701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 175801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah "dpy %d needed %d, avail %d", 175901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable); 176001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah return false; 176101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah } 176201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 176311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 176411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 176511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 176611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 176711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 176811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 176911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 177011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx, 177111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 177211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 177311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 177411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 177511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 177611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 177711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 177811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 177911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 178015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 178115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 178215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipesNeeded = pipesNeeded + 2; 178315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 178415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 178515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 178611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(isYuvBuffer(hnd)) { 178711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.left < lSplit) { 178811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 178911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 179011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.right > lSplit) { 179111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 179211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 179311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 179411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 179511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 179611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 179711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 179811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 179911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 180011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 180111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 180211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 180311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 180411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 18051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 18061a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah} 18071a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1808f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 1809f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info, 18102e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 18112e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 18129640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 18151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 18161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 18171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 18181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if (dst.left < lSplit) { 18191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT); 1820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 18221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 18231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 18241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(dst.right > lSplit) { 18251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT); 18261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1828f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 18291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1830f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1831c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1832c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1833f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx, 183420242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 183520242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 183620242a75d65c410071434d639266311376a5b7f6Saurabh Shah 183720242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1838c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 18395a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 18405a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 184115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 184215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 184315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 184415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 184515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(allocSplitVGPipesfor4k2k(ctx, list, index)){ 184615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 184715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 184815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 184915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 18501bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 18511bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1852f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoSplit; 18533393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1854f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo; 1855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 185720242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 185820242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 185944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy) 186011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 186120242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1862c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 186320242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 186620242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 186720242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 186816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 186916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1870c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1871c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1872c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 18731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 187415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 187515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 187615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 187715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 187815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 187915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 188015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 188115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 188215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 188315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 188415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 188515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 188615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 188715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 188815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 188915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 189015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 189115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configure(ctx, layer, PipeLayerPair); 189215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 189315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 189415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1897c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1898f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 18992e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1900f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& mdp_info = 1901f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 1902327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1903327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1904327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1907f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1908f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1909f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1910f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1911f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1912f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1913c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1914c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1915f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1916c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 191816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 191916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1920c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1921c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1922c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 192416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1925c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1927ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1928ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1929ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1930ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1931ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 193216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 193333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 193416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 193516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 193616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1938c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1941c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1944660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1945327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1946327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1947327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1948327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1949327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1950c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 195116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1952c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1953c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1954c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 195715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 195815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 195915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 196015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 196115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 196215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 196315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 196415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 196515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 196615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 196715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 196815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 196915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 197015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 197115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 197215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 197315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 197415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 197515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 197615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 197715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 197815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 197915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 198015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 198115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 198215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 198315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 198415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 198515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 198615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 198715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 198815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 198915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 199015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 199115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 199215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 199315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 199415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoSplit& pipe_info = 199515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 199615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1997327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 199815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 199915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 2000f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 200115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 200215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int offset = hnd->offset; 2003327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 200415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->isModeOn()) { 200515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->draw(ctx, fd, offset)) { 200615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = ctx->mAD->getDstFd(ctx); 200715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = ctx->mAD->getDstOffset(ctx); 200815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2009f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 2010f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 201115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 201215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 201315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 201415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 201515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2016c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 201715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play left mixer ********** 201815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 201915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 202015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 202115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 202215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 202315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for left mixer", 202415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 202515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 202615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2027c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2028c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 202915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play right mixer ********** 203015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 203115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 203215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 203315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 203415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 203515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for right mixer", 203615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 203715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 203815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2039c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2040c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2041327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 204216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 2043c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2044327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 204516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 2046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 2047c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 2048c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2049