hwc_mdpcomp.cpp revision 1b28b60e15c27fee703a16fbd1e42e3b41b031fd
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; 468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahfloat MDPComp::sMaxBw = 2.3f; 478eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::sCompBytesClaimed = 0; 48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) { 50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(isDisplaySplit(ctx, dpy)) { 51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompSplit(dpy); 52c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 53f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompNonSplit(dpy); 54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 56f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 66efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d " 67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah "fbCount:%2d \n", mCurrentFrame.layerCount, 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 79bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 81bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.drop[index] ? "DROP" : 82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"), 83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 99f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 104e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 116bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(property_get("persist.hwc.partialupdate.enable", property, NULL) > 0) { 117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL && 118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran qdutils::MDPVersion::getInstance().is8x74v2()) 119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate = true; 120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__, 122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate); 123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 12511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 129f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(property_get("debug.mdpcomp.bw", property, "0") > 0) { 1328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah float val = atof(property); 1338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(val > 0.0f) { 1348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah sMaxBw = val; 1358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 1368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 1378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1396bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 145c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 149c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1506bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1516bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1526bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1536bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1546bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 1556bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 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)); 245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 246efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah fbCount = 0; 247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = -1; 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpCount = curFrame.mdpCount; 260efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah fbCount = curFrame.fbCount; 261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = curFrame.fbZ; 263c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 265efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) { 266efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 267efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((not isYuvBuffer(hnd) and has90Transform(layer)) or 268efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (not isValidDimension(ctx,layer)) 269efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //More conditions here, SKIP, sRGB+Blend etc 270efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ) { 271efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 272efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 273efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 274efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 275efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 2761b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 27741269096daf2363b16dcd89627dd674529a26601Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 2780ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2800ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 2810ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2830ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2840ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 285f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 286f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 28841269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t crop = layer->sourceCrop; 28941269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 29041269096daf2363b16dcd89627dd674529a26601Saurabh Shah 29141269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 29241269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 29341269096daf2363b16dcd89627dd674529a26601Saurabh Shah qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 29441269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 2950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2960ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 2970ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 2980ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 2990ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 30041269096daf2363b16dcd89627dd674529a26601Saurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 30141269096daf2363b16dcd89627dd674529a26601Saurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 3020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 303f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 304f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 305f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3061b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3071b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3081b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 309f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3110ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah const uint32_t downscale = 31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(ctx->mMDP.version >= qdutils::MDSS_V5) { 31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah /* Workaround for downscales larger than 4x. 31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah * Will be removed once decimator block is enabled for MDSS 31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah */ 31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah h_dscale > downscale) 32141269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 32241269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { 32341269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > 64 || h_dscale > 64) 32441269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 32541269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 32641269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { //A-family 32741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > downscale || h_dscale > downscale) 32841269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 32941269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 33041269096daf2363b16dcd89627dd674529a26601Saurabh Shah 3310ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3320ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3330ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type, 3351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 336c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 337c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 338c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 339c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 3411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer); 342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 3471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer); 348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 352f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 3571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer); 358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 360f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 363c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 364c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 366af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 367e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 368f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 371af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 37256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 373361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) { 37456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 37556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 37656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 37756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 378361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 379361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) { 380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 382af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 383af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 384586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 385586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 386af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 387586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 388af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 390f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 391bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx, 392bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_display_contents_1_t* list, hwc_rect_t roi) { 393bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 394bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 395bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(roi)) 396bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 397bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 398bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++){ 399bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran const hwc_layer_1_t* layer = &list->hwLayers[i]; 400bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 401bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = layer->displayFrame; 402bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t srcRect = layer->sourceCrop; 403bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int transform = layer->transform; 404bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran trimLayer(ctx, mDpy, transform, srcRect, dstRect); 405bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 406bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t res = getIntersection(roi, dstRect); 407bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 408bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_w = res.right - res.left; 409bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_h = res.bottom - res.top; 410bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_w = dstRect.right - dstRect.left; 411bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_h = dstRect.bottom - dstRect.top; 412bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 413bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(res)) { 414bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.drop[i] = true; 415bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount++; 416bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran }else { 417bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Reset frame ROI when any layer which needs scaling also needs ROI 418bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * cropping */ 419bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((res_w != dst_w || res_h != dst_h) && 420bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran needsScaling (ctx, layer, mDpy)) { 421bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE("%s: Resetting ROI due to scaling", __FUNCTION__); 422bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 423bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 424bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 425bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 426bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 427bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 428bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return true; 429bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 430bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 431bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 432bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 433bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 434bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!sEnablePartialFrameUpdate) { 435bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 436bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 437bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 438bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(mDpy || isDisplaySplit(ctx, mDpy)){ 439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: ROI not supported for" 440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran "the (1) external / virtual display's (2) dual DSI displays", 441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran __FUNCTION__); 442bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 443bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 444bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 445bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(list->flags & HWC_GEOMETRY_CHANGED) 446bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 447bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 448bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0}; 449bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran for(int index = 0; index < numAppLayers; index++ ) { 450bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) || 451bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) { 452bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = list->hwLayers[index].displayFrame; 453bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t srcRect = list->hwLayers[index].sourceCrop; 454bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int transform = list->hwLayers[index].transform; 455bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Intersect against display boundaries */ 457bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran trimLayer(ctx, mDpy, transform, srcRect, dstRect); 458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = getUnion(roi, dstRect); 459bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 460bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 461bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!validateAndApplyROI(ctx, list, roi)){ 463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = (struct hwc_rect) {0, 0, 464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres}; 465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.x = roi.left; 468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.y = roi.top; 469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.w = roi.right - roi.left; 470bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.h = roi.bottom - roi.top; 471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__, 473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi.left, roi.top, roi.right, roi.bottom); 474bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 478f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 482f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 4831b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) { 48433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 48533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 48633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 48733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 488f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 492c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 493c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 494c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 495ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 496ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 497ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 498ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah return false; 499ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah } 500ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah 501c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 502c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 503c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 504f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 505efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(isYuvBuffer(hnd) && has90Transform(layer)) { 506efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!canUseRotator(ctx, mDpy)) { 507efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d", 508efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__, mDpy); 50986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 51086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 511c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 5122902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 5132902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 5142902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 5152902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 5162902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 5172902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 5182902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 5192902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 520c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 521af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 522f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 523f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 524f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 525f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 526af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 530e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 531af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 532af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 533af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 534af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 535af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 536af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 537efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit presentation / secondary-only layer. 538efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) && 539efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (list->numHwLayers - 1) > MAX_SEC_LAYERS) { 540efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 541efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 542efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 543efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 544efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 545efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 546efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 547efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 548efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__); 549efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 550efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 551efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 554bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop, 555bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 556bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount - 557bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount; 558af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 559bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(mCurrentFrame.mdpCount > sMaxPipesPerMixer) { 560af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 561af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 562af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 563af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 565af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 566af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 567af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 5698eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 5708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 5718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 5728eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 5738eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 574af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 575af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 576af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 577af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 578af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 579af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 580e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 581e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 582e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 583e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 584e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 585e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 586af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 587af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 588af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 589efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 590efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //If an MDP marked layer is unsupported cannot do partial MDP Comp 591efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 592efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 593efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 594efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 595efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list", 596efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__); 597efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 598efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 599efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 600efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 601efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 60211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, false /*secure only*/); 603efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah bool ret = batchLayers(ctx, list); //sets up fbZ also 604efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!ret) { 605efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy); 606efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 607efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 608af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 609af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 610efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 611efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit cases where a video has non-updating background. 612efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) and 613efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (mdpCount > MAX_SEC_LAYERS)) { 614efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 615efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 616efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 617efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 618af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 619af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 620af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 621af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 622af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 6231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 624af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 625af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 626af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 6278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 6288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 6298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 6308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 6318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 6328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 633af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 634af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 635af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 63711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list, bool secureOnly) { 638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 639bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 640af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 64111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, secureOnly); 64241269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 643bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int fbNeeded = (mCurrentFrame.fbCount != 0); 644af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 645af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 646af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 647af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 648af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 64941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 65041269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 65141269096daf2363b16dcd89627dd674529a26601Saurabh Shah 652af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 653af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 654af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 655af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 6571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 658af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 659af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 660af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 6618eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 6628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 6638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 6648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 6658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 6668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 667c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 668c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 669c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 672e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating; 673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 674e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah if(isSkipLayer(layer) && !extAnimBlockFeature) { 675e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 677c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 678c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 67986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 68086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 68186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 68286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 68386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 685f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 68941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 69041269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 69141269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 69241269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 693c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 69441269096daf2363b16dcd89627dd674529a26601Saurabh Shah 695a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 696a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 697a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 698a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 699a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 700a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 701a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 702c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 703c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 704c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 705efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::batchLayers(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 707f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 709f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 711bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int maxBatchEnd = -1; 712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 715af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 717efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 718af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 719af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 721efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 724bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Search for max number of contiguous (cached) layers excluding dropped 725bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * layers */ 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 727f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 728f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 729bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int start = i; 730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 731bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]) 732bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran count++; 733bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran i++; 734f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 735f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 737bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran maxBatchStart = start; 738bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran maxBatchEnd = i - 1; 739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 744bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 745bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 746bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* reset rest of the layers lying inside ROI for MDP comp */ 747f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 748efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 749bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((i < maxBatchStart || i > maxBatchEnd) && 750bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.isFBComposed[i]){ 751bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]){ 752bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //If an unsupported layer is being attempted to 753bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //be pulled out we should fail 754bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(not isSupportedForMDPComp(ctx, layer)) { 755bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 756bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 757bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 758efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 759f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 760f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 761f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 763bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 764f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 766f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 767efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 768efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 769f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 77011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 771f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 772efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_display_contents_1_t* list) { 773f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 774efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah int fbCount = 0; 775f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 776f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 777efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 778f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 779bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]) 780bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran fbCount++; 781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 783af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 786c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 787af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 788efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah mCurrentFrame.fbCount = fbCount; 789bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount 790bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran - mCurrentFrame.dropCount; 791efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 792bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d" 793bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount, 794bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount); 795f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 796c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 79711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list, 79811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah bool secureOnly) { 799f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 800a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 801a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 802a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 803a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 804a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 805a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 806a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 807a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 808a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 818c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 82011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 82111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!secureOnly || isSecureBuffer(hnd)) { 82211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 82311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.fbCount--; 82411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 826c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 828af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 829af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 830bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 831bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__, 832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 835af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 836f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 837f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 838af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 841af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 842f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 843af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 845f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 846f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 852f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 853f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 854af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 855f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 856bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } else if(fbBatch == false && !mCurrentFrame.drop[index]) { 857af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 858af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 859af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 860f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 861f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 862af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 863af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 865af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 866af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 867af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 868af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 869af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 870af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 871af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 872af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 873af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 874af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 875af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 876af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 877af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 878af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 879af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 880af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 881af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 882af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 883af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 884af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 885af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 886af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 887af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 888af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 889f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 890f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 8918eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx, 8928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_display_contents_1_t* list) { 8938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = 0; 8948eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 8954b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if(!qdutils::MDPVersion::getInstance().is8x74v2()) 8964b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson return 0; 8974b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson 8988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah for (uint32_t i = 0; i < list->numHwLayers - 1; i++) { 8998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 9008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 9018eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 9024b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if (hnd) { 9034b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson hwc_rect_t crop = layer->sourceCrop; 9043d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah hwc_rect_t dst = layer->displayFrame; 9053d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah trimLayer(ctx, mDpy, layer->transform, crop, dst); 9064b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson float bpp = ((float)hnd->size) / (hnd->width * hnd->height); 9073d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah size += bpp * (crop.right - crop.left) * 9083d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah (crop.bottom - crop.top) * 9093d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top); 9104b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson } 9118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 9128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 9138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 9148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(mCurrentFrame.fbCount) { 9158eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1]; 9168eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 9174b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if (hnd) 9184b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson size += hnd->size; 9198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 9208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 9218eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return size; 9228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 9238eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 9248eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) { 9258eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah //Will be added for other targets if we run into bandwidth issues and when 9268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah //we have profiling data to set an upper limit. 9278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(qdutils::MDPVersion::getInstance().is8x74v2()) { 9288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah const uint32_t ONE_GIG = 1024 * 1024 * 1024; 9298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah double panelRefRate = 9308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 9318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if((size + sCompBytesClaimed) > ((sMaxBw / panelRefRate) * ONE_GIG)) { 9328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 9338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 9348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 9358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return true; 9368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 9378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 9398eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 940af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 941b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 9421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //reset old data 9431a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.reset(numLayers); 944bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 945bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 9471a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 9481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //do not cache the information for next draw cycle. 9491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(numLayers > MAX_NUM_APP_LAYERS) { 9501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 95165cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa ALOGE("%s: Number of App layers exceeded the limit ", 95265cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa __FUNCTION__); 9538eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 95465cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa return ret; 9551a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 95689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 9571a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 9581a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!isFrameDoable(ctx)) { 9591a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 9601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah __FUNCTION__); 9611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 9628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 9638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 9641a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 965af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 966bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran generateROI(ctx, list); 967bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 9681a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Check whether layers marked for MDP Composition is actually doable. 9691a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(isFullFrameDoable(ctx, list)) { 9701a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 9711a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 9721a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 9731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, 974699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.fbZ)) { 9751a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 976699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 977d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 9788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 9798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 98089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 9811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 9821a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Acquire and Program MDP pipes 9831a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programMDP(ctx, list)) { 9841a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 985d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 9868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 9878eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 9881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { //Success 9891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Any change in composition types needs an FB refresh 9901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = false; 9911a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount && 9921a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 993efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (mCurrentFrame.fbCount != mCachedFrame.fbCount) || 9941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 9951a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (!mCurrentFrame.mdpCount) || 9961a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 997efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah isSkipPresent(ctx, mDpy))) { 9981a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = true; 999699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 10001a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 100111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } else if(isOnlyVideoDoable(ctx, list, false /*secure only*/) || 100211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah isOnlyVideoDoable(ctx, list, true /*secure only*/)) { 10031a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //All layers marked for MDP comp cannot be bypassed. 10041a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Try to compose atleast YUV layers through MDP comp and let 10051a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //all the RGB layers compose in FB 10061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Destination over 10071a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = -1; 10081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount) 10091a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 10101a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 10111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 10121a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 10131a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 10141a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 10151a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) { 10161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 1017699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 1018d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 10198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 10208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 102189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 10221a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 10231a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programYUV(ctx, list)) { 1024699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 1025d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 10268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 10278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 1028f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 10291a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 10301a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 10318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 10328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 10331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 10351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //UpdateLayerFlags 10361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah setMDPCompLayerFlags(ctx, list); 1037bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCachedFrame.cacheAll(list); 10381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 1039f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 104089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula // unlock it before calling dump function to avoid deadlock 1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 1042af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 1045f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 1046c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1047c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 10488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit: 10498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah sCompBytesClaimed += calcMDPBytesRead(ctx, list); 10508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 1051c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1052c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1053f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompNonSplit=================================================== 1054c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1055c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 1056c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 1057c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 1058f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1059f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1060f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& mdp_info = 1061f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo)); 1062327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 1063327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1065327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 1066327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 1068f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 1069f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1070f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 1072c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1073c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1074f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx, 10751a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 10761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 10771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = mCurrentFrame.mdpCount; 10781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT); 10791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 10801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe for FB 10811a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 10821a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah availPipes -= 1; 10831a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 10841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 10851a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d", 10861a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, numPipesNeeded, availPipes); 10871a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 10881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 10891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 109011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 109111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 109211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 109311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 109411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 109511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 109611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 109711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx, 109811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 109911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 110011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 110111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 110211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 110311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 110411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 110511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 110611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(isYuvBuffer(hnd)) { 110711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 110811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 110911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 111011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 111111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 111211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 111311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 111411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 111511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 111611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 111711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 111811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 111911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 11201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 1121c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 112216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 1123f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx, 112420242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 112520242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 1126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1127f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 112820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 1129c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1130c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 1131f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1132f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1133f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoNonSplit; 1134327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 1135f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo; 1136f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1137f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 113820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 113920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 11401ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 114111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 114211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1143f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 1144f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 1145f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 11461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 1147c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 114820242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 114920242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 1150c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1151c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1152c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1153c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1154c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1155c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1156f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1157c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1159c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1160c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 116133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 116233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1163c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1164c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1168ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1169ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1170ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1171ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1172ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1173c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 117433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 1175c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 11760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1177c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1179c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1180f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1182c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1185c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1186327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1187327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1188327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1189327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1190c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 11910ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1194f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = 1195f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1196c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 1197c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 1198c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 11990ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 1200c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1201c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1202327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1203327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 1204327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1205c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1206327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 1208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 1209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1210327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1211327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 1212f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1214327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1215327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 1216c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1217327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1218327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1219327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1220327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1221327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 1222ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy); 1223327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1224c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1225c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1226c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1228c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1229c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1231f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit=================================================== 1232c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1233f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx, 12341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list, 12351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 1236c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 12372e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 12389640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 12399640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 1242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 1243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 12451a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) { 1246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 12471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) { 1248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1250f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1251c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1252c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 1253c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1255f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx, 12561a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 12571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 125801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesNeeded = 0; 12591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 12601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah for(int i = 0; i < Overlay::MIXER_MAX; i++) { 12611a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list, i); 12621a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, i); 12631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 12641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe(s)for FB 12651a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 126601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah numPipesNeeded += 1; 12671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 126801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah totalPipesNeeded += numPipesNeeded; 126901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 127001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per mixer check. 12711a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 12721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 12731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah "dpy %d mixer %d needed %d, avail %d", 12741a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, i, numPipesNeeded, availPipes); 12751a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 12761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 12771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 127801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 127901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per display check, since unused pipes can get counted twice. 128001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesAvailable = ov.availablePipes(mDpy); 128101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah if(totalPipesNeeded > totalPipesAvailable) { 128201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 128301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah "dpy %d needed %d, avail %d", 128401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable); 128501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah return false; 128601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah } 128701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 128811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 128911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 129011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 129111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 129211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 129311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 129411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 129511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx, 129611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 129711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 129811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 129911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 130011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 130111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 130211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 130311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 130411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 130511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(isYuvBuffer(hnd)) { 130611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.left < lSplit) { 130711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 130811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 130911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.right > lSplit) { 131011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 131111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 131211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 131311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 131411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 131511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 131611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 131711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 131811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 131911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 132011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 132111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 132211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 132311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 13241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 13251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah} 13261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1327f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 1328f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info, 13292e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 13302e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 13319640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 13341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 13351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 13361a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 13371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if (dst.left < lSplit) { 13381a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT); 1339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 13411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 13421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 13431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(dst.right > lSplit) { 13441a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT); 13451a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 13481a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1352f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx, 135320242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 135420242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 135520242a75d65c410071434d639266311376a5b7f6Saurabh Shah 135620242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1357c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 13585a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 13595a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 13601bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 13611bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1362f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoSplit; 13633393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1364f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo; 1365c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1366c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 136720242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 136820242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 136944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy) 137011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 137120242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1372c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 137320242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1374c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1375c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 137620242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 137720242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 137816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 137916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1380c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1381c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1382c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 13831a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1384c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1385c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1387f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 13882e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1389f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& mdp_info = 1390f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 1391327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1392327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1393327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1394327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1395327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1400f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1401f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1402c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1403c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1404f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1405c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1406f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 140716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 140816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1409c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1410c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1411c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1412c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 141316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1416ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1417ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1418ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1419ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1420ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 142116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 142233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 142316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 142416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 142516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1426f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1427c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1429f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1431f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1432f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1433660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1434327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1435327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1436327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1437327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1438327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1439c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 144016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1441c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1442c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1443c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1445f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1446f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = 1447f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1448f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1449327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1450c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1451c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1452f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1453327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1454327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1455327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1456f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isModeOn()) { 1457f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->draw(ctx, fd, offset)) { 1458f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah fd = ctx->mAD->getDstFd(ctx); 1459f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah offset = ctx->mAD->getDstOffset(ctx); 1460f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1461f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1462f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1463327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1464327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1465327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1466327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1467327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1468c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1469c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1470c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1471c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1472327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1474327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1475327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1476327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1477c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1478c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1479c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1480c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1481c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1482c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1483327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1484f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1485327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1486327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1487327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1489c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1490327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 149116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1492c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1493327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 149416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1495c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1496c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1497c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1498