hwc_mdpcomp.cpp revision 11bf9c368a2ff832b1a20d9c90ec796e3d29bf9f
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; 44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 458eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahfloat MDPComp::sMaxBw = 2.3f; 468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::sCompBytesClaimed = 0; 47c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 48f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) { 49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(isDisplaySplit(ctx, dpy)) { 50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompSplit(dpy); 51c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 52f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompNonSplit(dpy); 53c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 55f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 57c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 59bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 63361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount:%2d \n", mCachedFrame.layerCount, 67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount, mCachedFrame.cacheCount); 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount:%2d \n", mCurrentFrame.layerCount, 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 82f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 86f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 111e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = false; 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 118f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 11911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 12011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 12111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1258eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(property_get("debug.mdpcomp.bw", property, "0") > 0) { 1268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah float val = atof(property); 1278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(val > 0.0f) { 1288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah sMaxBw = val; 1298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 1308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 1318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1326bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1336bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1346bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1356bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1366bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 143c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 151c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 154699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) { 155699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 156699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.cacheAll(list); 157699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 158699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah} 159699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 161c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 164c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 168359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 174359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 179f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 188f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.needsRedraw) 189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 19316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 194f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 195af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 198af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 199af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 200f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 201f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 203f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 204f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 205c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 210af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 212af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 213af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 215ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 220af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 221af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 224af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 225af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 226af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 227af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 228af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 230f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 232f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount = 0; 238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = -1; 240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 241af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 242af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpCount = curFrame.mdpCount; 251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cacheCount = curFrame.fbCount; 252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = curFrame.fbZ; 254c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 255c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 2561b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 25741269096daf2363b16dcd89627dd674529a26601Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 2580ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 2590ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2600ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 2610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 2620ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2630ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2640ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 265f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 266f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 2670ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 26841269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t crop = layer->sourceCrop; 26941269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 27041269096daf2363b16dcd89627dd674529a26601Saurabh Shah 27141269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 27241269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 27341269096daf2363b16dcd89627dd674529a26601Saurabh Shah qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 27441269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 2750ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 2780ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 28041269096daf2363b16dcd89627dd674529a26601Saurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 28141269096daf2363b16dcd89627dd674529a26601Saurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 283f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 284f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 285f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 2861b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 2871b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 2881b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 289f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 2900ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2910ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 29241269096daf2363b16dcd89627dd674529a26601Saurabh Shah const uint32_t downscale = 29341269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 29441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(ctx->mMDP.version >= qdutils::MDSS_V5) { 29541269096daf2363b16dcd89627dd674529a26601Saurabh Shah /* Workaround for downscales larger than 4x. 29641269096daf2363b16dcd89627dd674529a26601Saurabh Shah * Will be removed once decimator block is enabled for MDSS 29741269096daf2363b16dcd89627dd674529a26601Saurabh Shah */ 29841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 29941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 30041269096daf2363b16dcd89627dd674529a26601Saurabh Shah h_dscale > downscale) 30141269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { 30341269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > 64 || h_dscale > 64) 30441269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 30541269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 30641269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { //A-family 30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > downscale || h_dscale > downscale) 30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 30941269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 31041269096daf2363b16dcd89627dd674529a26601Saurabh Shah 3110ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3120ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3130ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type, 3151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 316c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 317c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 318c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 319c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 3211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer); 322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 323f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 324f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 3271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer); 328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 331c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 3371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer); 338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 341c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 342c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 343c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 344c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 346af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 347e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 348f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 351af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 35256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 353361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) { 35456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 35556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 35656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 35756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) { 360c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 361f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 362af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 363af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 364586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 365586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 366af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 367586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 368af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 376af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 37833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(sIdleFallBack) { 37933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 38033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 38133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 38233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 390af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 391af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 393c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 396ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 397ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 398ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 399ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah return false; 400ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah } 401ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah 402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 403c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 408f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 40986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90) { 41086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(!isYuvBuffer(hnd) ) { 41186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 41286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 41386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar }else if(!canUseRotator(ctx, mDpy)) { 41486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 41586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 41686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 417c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 41841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx,layer)) { 41941269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 42041269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 421c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 422c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 4232902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 4242902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 4252902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 4262902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 4272902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 4282902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 4292902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 4302902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 433f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 434f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 435f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 436f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 441e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 4601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 4648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 4658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 4668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 4678eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 4688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 4698eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 476e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 477e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 478e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 479e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 480e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 481e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 48511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, false /*secure only*/); 486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah batchLayers(); //sets up fbZ also 487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 4941a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 496af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 497af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 4988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 4998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 5008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 5018eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 5028eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 5038eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 50811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list, bool secureOnly) { 509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 51111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, secureOnly); 51241269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 513af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 514af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 515af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 516af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 517af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 518af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 51941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 52041269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 52141269096daf2363b16dcd89627dd674529a26601Saurabh Shah 522af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 523af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 524af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 525af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 526af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 530af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 5328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 5338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 5348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 5358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 5368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 537c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 538c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 539c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 542e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating; 543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 544e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah if(isSkipLayer(layer) && !extAnimBlockFeature) { 545e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 547c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 548c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 54986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 55086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 55186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 55286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 55386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 55941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 56041269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 56141269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 56241269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 563c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 56441269096daf2363b16dcd89627dd674529a26601Saurabh Shah 565a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 566a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 567a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 568a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 569a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 570a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 571a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 572c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 573c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 584af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 585af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 587af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 588af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 589af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 590af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return; 591af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 603af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 618af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 619af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 62411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 639c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 640af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 642af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 643af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 646c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 64711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list, 64811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah bool secureOnly) { 649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 650a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 651a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 652a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 653a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 654a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 655a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 656a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 657a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 658a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 668c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 67011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 67111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!secureOnly || isSecureBuffer(hnd)) { 67211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 67311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.fbCount--; 67411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 676c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 678af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 679af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 680af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 695f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 696f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 699f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 700f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 701f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 702f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 703f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 706af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(fbBatch == false) { 707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 708af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 711f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 712af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 713af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 715af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 717af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 718af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 719af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 724af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 726af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 727af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 728af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 739f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 7418eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx, 7428eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_display_contents_1_t* list) { 7438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = 0; 7448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 7454b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if(!qdutils::MDPVersion::getInstance().is8x74v2()) 7464b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson return 0; 7474b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson 7488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah for (uint32_t i = 0; i < list->numHwLayers - 1; i++) { 7498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 7508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 7518eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 7524b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if (hnd) { 7534b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson hwc_rect_t crop = layer->sourceCrop; 7544b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson float bpp = ((float)hnd->size) / (hnd->width * hnd->height); 7554b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson size += bpp * ((crop.right - crop.left) * 7568eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah (crop.bottom - crop.top)); 7574b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson } 7588eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7598eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7608eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 7618eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(mCurrentFrame.fbCount) { 7628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1]; 7638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 7644b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if (hnd) 7654b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson size += hnd->size; 7668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7678eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 7688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return size; 7698eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 7708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 7718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) { 7728eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah //Will be added for other targets if we run into bandwidth issues and when 7738eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah //we have profiling data to set an upper limit. 7748eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(qdutils::MDPVersion::getInstance().is8x74v2()) { 7758eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah const uint32_t ONE_GIG = 1024 * 1024 * 1024; 7768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah double panelRefRate = 7778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 7788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if((size + sCompBytesClaimed) > ((sMaxBw / panelRefRate) * ONE_GIG)) { 7798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 7808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7818eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7828eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return true; 7838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 7848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 7868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 787af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 788b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 7891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //reset old data 7901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.reset(numLayers); 791f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 7921a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 7931a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //do not cache the information for next draw cycle. 7941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(numLayers > MAX_NUM_APP_LAYERS) { 7951a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 7961a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ", 7971a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah __FUNCTION__); 7988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 7998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8001a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 80189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 8021a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 8031a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!isFrameDoable(ctx)) { 8041a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 8051a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah __FUNCTION__); 8061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 8078eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8088eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8091a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 810af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 8111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Check whether layers marked for MDP Composition is actually doable. 8121a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(isFullFrameDoable(ctx, list)) { 8131a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 8141a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 8151a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 8161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, 817699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.fbZ)) { 8181a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 819699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 820d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8218eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 82389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 8241a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 8251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Acquire and Program MDP pipes 8261a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programMDP(ctx, list)) { 8271a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 828d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8311a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { //Success 8321a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Any change in composition types needs an FB refresh 8331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = false; 8341a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount && 8351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 8361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 8371a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 8381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (!mCurrentFrame.mdpCount) || 8391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 8401a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah isSkipPresent(ctx, mDpy) || 8411a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mDpy > HWC_DISPLAY_PRIMARY))) { 8421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = true; 843699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 8441a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 84511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } else if(isOnlyVideoDoable(ctx, list, false /*secure only*/) || 84611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah isOnlyVideoDoable(ctx, list, true /*secure only*/)) { 8471a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //All layers marked for MDP comp cannot be bypassed. 8481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Try to compose atleast YUV layers through MDP comp and let 8491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //all the RGB layers compose in FB 8501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Destination over 8511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = -1; 8521a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount) 8531a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 8541a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 8551a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 8561a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 8571a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 8581a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 8591a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) { 8601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 861699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 862d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 86589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 8661a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 8671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programYUV(ctx, list)) { 868699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 869d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 872f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 8731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 8741a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 8758eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8771a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 878f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 8791a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //UpdateLayerFlags 8801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah setMDPCompLayerFlags(ctx, list); 8811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 882f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 88389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula // unlock it before calling dump function to avoid deadlock 884f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 885af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 886f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 887f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 888f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 8918eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit: 8928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah sCompBytesClaimed += calcMDPBytesRead(ctx, list); 8938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 896f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompNonSplit=================================================== 897c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 898c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 899c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 900c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 901f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 902f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 903f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& mdp_info = 904f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo)); 905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 907327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 908327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 909327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 910f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 911f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 912f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 913f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 914f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 915c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 916c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 917f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx, 9181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 9191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 9201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = mCurrentFrame.mdpCount; 9211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT); 9221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 9231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe for FB 9241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 9251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah availPipes -= 1; 9261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 9271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 9281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d", 9291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, numPipesNeeded, availPipes); 9301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 9311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 9321a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 93311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 93411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 93511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 93611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 93711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 93811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 93911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 94011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx, 94111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 94211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 94311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 94411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 94511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 94611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 94711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 94811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 94911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(isYuvBuffer(hnd)) { 95011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 95111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 95211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 95311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 95411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 95511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 95611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 95711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 95811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 95911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 96011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 96111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 96211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 9631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 964c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 96516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 966f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx, 96720242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 96820242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 969c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 97120242a75d65c410071434d639266311376a5b7f6Saurabh Shah 972c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 974f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 975f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 976f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoNonSplit; 977327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 978f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo; 979f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 980f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 98120242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 98220242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 9831ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 98411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 98511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 986f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 987f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 988f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 9891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 99120242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 99220242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 995c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 997c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 998c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 999f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1000c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1001f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1002c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1003c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 100433650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 100533650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1006c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1007c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1008c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1009c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1010c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1011ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1012ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1013ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1014ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1015ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1016c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 101733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 1018c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 10190ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1020c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1021f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1022c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1023f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1024f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1025c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1027f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1028c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1029327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1030327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1031327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1032327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1033c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 10340ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1035f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1037f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = 1038f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1039c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 1040c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 1041c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 10420ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 1043c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1044c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1045327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1046327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 1047327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1048c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1049327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 1052c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1053327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1054327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 1055f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1056f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1057327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1058327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 1059c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1060327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1061327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1062327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1063327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 1065ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy); 1066327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1067c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1069c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1070c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1071c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1072c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1073c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1074f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit=================================================== 1075c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1076f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx, 10771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list, 10781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 10802e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 10819640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 10829640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 1085f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 10881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) { 1089f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 10901a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) { 1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1093f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1094c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1095c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 1096c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1097c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1098f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx, 10991a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 11001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 110101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesNeeded = 0; 11021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11031a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah for(int i = 0; i < Overlay::MIXER_MAX; i++) { 11041a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list, i); 11051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, i); 11061a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11071a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe(s)for FB 11081a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 110901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah numPipesNeeded += 1; 11101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 111101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah totalPipesNeeded += numPipesNeeded; 111201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 111301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per mixer check. 11141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 11151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 11161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah "dpy %d mixer %d needed %d, avail %d", 11171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, i, numPipesNeeded, availPipes); 11181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 11191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 11201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 112101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 112201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per display check, since unused pipes can get counted twice. 112301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesAvailable = ov.availablePipes(mDpy); 112401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah if(totalPipesNeeded > totalPipesAvailable) { 112501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 112601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah "dpy %d needed %d, avail %d", 112701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable); 112801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah return false; 112901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah } 113001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 113111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 113211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 113311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 113411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 113511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 113611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 113711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 113811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx, 113911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 114011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 114111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 114211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 114311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 114411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 114511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 114611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 114711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 114811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(isYuvBuffer(hnd)) { 114911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.left < lSplit) { 115011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 115111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 115211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.right > lSplit) { 115311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 115411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 115511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 115611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 115711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 115811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 115911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 116011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 116111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 116211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 116311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 116411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 116511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 116611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 11671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 11681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah} 11691a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1170f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 1171f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info, 11722e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 11732e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 11749640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1175f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1176f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 11771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 11781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 11791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if (dst.left < lSplit) { 11811a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT); 1182f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 11841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 11851a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11861a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(dst.right > lSplit) { 11871a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT); 11881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 11911a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1193c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1194c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1195f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx, 119620242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 119720242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 119820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 119920242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1200c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 12015a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 12025a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 12031bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 12041bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1205f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoSplit; 12063393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1207f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo; 1208c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 121020242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 121120242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 121244625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy) 121311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 121420242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1215c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 121620242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1217c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1218c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 121920242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 122020242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 122116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 122216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1223c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1224c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1225c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 12261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1227c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1228c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1229c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1230f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 12312e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1232f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& mdp_info = 1233f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 1234327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1235327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1236327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1237327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1238327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1239f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1243f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1247f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 125016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 125116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1252c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1253c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1255c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 125616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1257c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1258c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1259ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1260ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1261ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1262ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1263ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 126416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 126533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 126616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 126716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 126816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1269f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1270c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1271f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1272f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1273c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1274f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1276660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1277327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1278327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1279327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1280327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1281327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 128316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1284c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1285c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1286c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1287f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1288f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1289f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = 1290f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1292327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1293c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1294c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1296327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1297327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1298327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1299f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isModeOn()) { 1300f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->draw(ctx, fd, offset)) { 1301f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah fd = ctx->mAD->getDstFd(ctx); 1302f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah offset = ctx->mAD->getDstOffset(ctx); 1303f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1304f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1305f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1306327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1307327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1308327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1309327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1310327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1311c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1312c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1313c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1314c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1315327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1317327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1318327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1319327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1320c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1321c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1322c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1323c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1325c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1326327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1327f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1328327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1329327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1330327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1331c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1332c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1333327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 133416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1335c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1336327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 133716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1338c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1339c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1340c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1341