hwc_mdpcomp.cpp revision 8eeb53efa1e615545f646a14ae2e8157e0a9bae6
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 482e474227e216ee37ab84a3c9a22ea1f650626231Saurabh ShahMDPComp* MDPComp::getObject(const int& width, const int& rightSplit, 492e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int& dpy) { 502e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(width > MAX_DISPLAY_DIM || rightSplit) { 51f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompHighRes(dpy); 52c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 532e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah return new MDPCompLowRes(dpy); 54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 56f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount:%2d \n", mCachedFrame.layerCount, 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount, mCachedFrame.cacheCount); 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount:%2d \n", mCurrentFrame.layerCount, 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 82f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 86f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 87f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 1046387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou if(!setupBasePipe(ctx)) { 1056387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 1066387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou return false; 1076387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou } 108c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 109c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 111e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 112e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 113e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 114e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 115e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 116e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = false; 118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 121c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 12411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 12511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 128f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 129f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(property_get("debug.mdpcomp.bw", property, "0") > 0) { 1318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah float val = atof(property); 1328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(val > 0.0f) { 1338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah sMaxBw = val; 1348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 1358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 1368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1396bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 144c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1506bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1516bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1526bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1536bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 1546bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 155c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 159699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) { 160699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.cacheAll(list); 162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah} 164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 173359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 179359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 188f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[index] = NULL; 193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 194f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.needsRedraw) 195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 198c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 19916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/* 201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0. 202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl. 203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */ 204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_stride = ctx->dpyAttr[dpy].stride; 207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_width = ctx->dpyAttr[dpy].xres; 208c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_height = ctx->dpyAttr[dpy].yres; 209c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_fd = ctx->dpyAttr[dpy].fd; 210c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 211c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_overlay ovInfo; 212c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah msmfb_overlay_data ovData; 213c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovInfo, 0, sizeof(mdp_overlay)); 214c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovData, 0, sizeof(msmfb_overlay_data)); 215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 216c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.format = MDP_RGB_BORDERFILL; 217c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.width = fb_width; 218c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.height = fb_height; 219c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.w = fb_width; 220c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.h = fb_height; 221c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.w = fb_width; 222c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.h = fb_height; 223c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.id = MSMFB_NEW_REQUEST; 224c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 225c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 226c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 228c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 229c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 230c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 231c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovData.id = ovInfo.id; 232c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 233c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 235c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 236c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 237c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 238c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 239f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 242c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 250c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 251c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 254f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 256f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 259f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 260ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 261f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 262f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 263f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 264af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 265af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 270af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 271af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 272af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 273af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 274af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 275f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 277f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 279f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 280af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 281f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 282f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount = 0; 283f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 284af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = -1; 285af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 286af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 287af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 288af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 289af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 290af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 291af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 292af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 293af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 294af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 295af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpCount = curFrame.mdpCount; 296af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cacheCount = curFrame.fbCount; 297af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 298af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = curFrame.fbZ; 299c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 300c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 3011b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 3060ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 3070ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3080ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 3090ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 3120ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t crop = layer->sourceCrop; 31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah 31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 3200ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 3230ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 3240ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 32541269096daf2363b16dcd89627dd674529a26601Saurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 32641269096daf2363b16dcd89627dd674529a26601Saurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 3270ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3311b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3321b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3331b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3350ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3360ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 33741269096daf2363b16dcd89627dd674529a26601Saurabh Shah const uint32_t downscale = 33841269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 33941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(ctx->mMDP.version >= qdutils::MDSS_V5) { 34041269096daf2363b16dcd89627dd674529a26601Saurabh Shah /* Workaround for downscales larger than 4x. 34141269096daf2363b16dcd89627dd674529a26601Saurabh Shah * Will be removed once decimator block is enabled for MDSS 34241269096daf2363b16dcd89627dd674529a26601Saurabh Shah */ 34341269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 34441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 34541269096daf2363b16dcd89627dd674529a26601Saurabh Shah h_dscale > downscale) 34641269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 34741269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { 34841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > 64 || h_dscale > 64) 34941269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 35041269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 35141269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { //A-family 35241269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > downscale || h_dscale > downscale) 35341269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 35441269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 35541269096daf2363b16dcd89627dd674529a26601Saurabh Shah 3560ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3570ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3580ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type, 3601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 363c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 364c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 3661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer); 367f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 368f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 3721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer); 373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 378f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 380f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 3821a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer); 383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 390f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 391af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 392e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 393f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 394f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 396af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 39756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) { 39956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 40056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 40156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 40256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 403361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 404361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) { 405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 406f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 407af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 408af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 409586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 410586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 411af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 412586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 414f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 415f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 416f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 417f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 418f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 419f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 420f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 422f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 42333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(sIdleFallBack) { 42433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 42533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 42633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 42733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 429f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 430f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 433c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 434f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 438c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 439c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 440c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 441ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 442ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 443ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 444ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah return false; 445ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah } 446ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah 447c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 448c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 449c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 450c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 451c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 452c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 453f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 45486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90) { 45586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(!isYuvBuffer(hnd) ) { 45686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 45786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 45886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar }else if(!canUseRotator(ctx, mDpy)) { 45986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 46086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 46186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 462c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 46341269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx,layer)) { 46441269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 46541269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 466c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 467c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 4682902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 4692902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 4702902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 4712902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 4722902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 4732902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 4742902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 4752902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 476c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 478f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 479f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 480f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 481f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 486e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 494af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 496af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 497af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 498af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 499af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 5108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 5118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 5128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 5138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 5148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 515af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 516af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 517af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 518af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 519af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 520af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 521e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 522e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 523e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 524e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 525e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 526e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 530af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 531af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah batchLayers(); //sets up fbZ also 532af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 533af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 534af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 535af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 536af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 537af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 538af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 540af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 542af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 5448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 5458eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 5468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 5478eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 5488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_display_contents_1_t* list){ 554af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 555af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 556af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 55741269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 558af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 559af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 560af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 561af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 562af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 563af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 56441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 56541269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 56641269096daf2363b16dcd89627dd674529a26601Saurabh Shah 567af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 568af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 569af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 570af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 571af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(!arePipesAvailable(ctx, list)) { 573af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 574af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 575af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 5768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = calcMDPBytesRead(ctx, list); 5778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!bandwidthCheck(ctx, size)) { 5788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 5798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 5808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 5818eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 582c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 583c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 584c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 587e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating; 588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 589e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah if(isSkipLayer(layer) && !extAnimBlockFeature) { 590e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 592c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 593c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 59486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 59586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 59686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 59786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 59886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 60441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 60541269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 60641269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 60741269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 608c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 60941269096daf2363b16dcd89627dd674529a26601Saurabh Shah 610a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 611a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 612a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 613a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 614a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 615a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 616a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 617c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 618c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 619c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 629af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 630af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 632af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 633af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 634af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 635af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return; 636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 648af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 651f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 654f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 656f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 663af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 664af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 66911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 684c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 687af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 691c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 693c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 695a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 696a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 697a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 698a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 699a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 700a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 701a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 702a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 703a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 707f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 709f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 711f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 713c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 718c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 727af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 728f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 729f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 731f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 732f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 734f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 737f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 738f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 739f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 744f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 745f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 746af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 747f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 748af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(fbBatch == false) { 749af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 750af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 751af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 752f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 753f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 754af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 755af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 757af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 759af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 760af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 761af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 763af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 765af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 766af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 767af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 768af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 769af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 770af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 771af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 772af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 773af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 774af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 775af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 776af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 777af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 778af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 779af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 780af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 7838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx, 7848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_display_contents_1_t* list) { 7858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah uint32_t size = 0; 7868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 7878eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah for (uint32_t i = 0; i < list->numHwLayers - 1; i++) { 7888eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 7898eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 7908eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 7918eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_rect_t crop = layer->sourceCrop; 7928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah float bpp = ((float)hnd->size) / (hnd->width * hnd->height); 7938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah size += bpp * ((crop.right - crop.left) * 7948eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah (crop.bottom - crop.top)); 7958eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7968eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7978eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 7988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(mCurrentFrame.fbCount) { 7998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1]; 8008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 8018eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah size += hnd->size; 8028eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 8038eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 8048eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return size; 8058eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 8068eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 8078eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) { 8088eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah //Will be added for other targets if we run into bandwidth issues and when 8098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah //we have profiling data to set an upper limit. 8108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(qdutils::MDPVersion::getInstance().is8x74v2()) { 8118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah const uint32_t ONE_GIG = 1024 * 1024 * 1024; 8128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah double panelRefRate = 8138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 8148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if((size + sCompBytesClaimed) > ((sMaxBw / panelRefRate) * ONE_GIG)) { 8158eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 8168eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 8178eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 8188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return true; 8198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 8208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 8228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 823af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 824b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 8251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //reset old data 8261a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.reset(numLayers); 827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 8281a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 8291a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //do not cache the information for next draw cycle. 8301a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(numLayers > MAX_NUM_APP_LAYERS) { 8311a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 8321a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ", 8331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah __FUNCTION__); 8348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 83789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 8381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 8391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!isFrameDoable(ctx)) { 8401a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 8411a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah __FUNCTION__); 8421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 8438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8451a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 846af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 8471a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Check whether layers marked for MDP Composition is actually doable. 8481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(isFullFrameDoable(ctx, list)) { 8491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 8501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 8511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 8521a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, 853699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.fbZ)) { 8541a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 855699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 856d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8578eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8588eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 85989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 8601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 8611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Acquire and Program MDP pipes 8621a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programMDP(ctx, list)) { 8631a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 864d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 8671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { //Success 8681a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Any change in composition types needs an FB refresh 8691a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = false; 8701a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount && 8711a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 8721a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 8731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 8741a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (!mCurrentFrame.mdpCount) || 8751a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 8761a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah isSkipPresent(ctx, mDpy) || 8771a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah (mDpy > HWC_DISPLAY_PRIMARY))) { 8781a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.needsRedraw = true; 879699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 8801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 8811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else if(isOnlyVideoDoable(ctx, list)) { 8821a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //All layers marked for MDP comp cannot be bypassed. 8831a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Try to compose atleast YUV layers through MDP comp and let 8841a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //all the RGB layers compose in FB 8851a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Destination over 8861a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = -1; 8871a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbCount) 8881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 8891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 8901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCurrentFrame.map(); 8911a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah 8921a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Configure framebuffer first if applicable 8931a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(mCurrentFrame.fbZ >= 0) { 8941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) { 8951a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ALOGE("%s configure framebuffer failed", __func__); 896699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 897d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 8988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 8998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 90089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 9011a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 9021a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah if(!programYUV(ctx, list)) { 903699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 904d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah ctx->mOverlay->clear(mDpy); 9058eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 9068eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 907f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 9081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 9091a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah reset(numLayers, list); 9108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 9118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah goto exit; 9121a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 913f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 9141a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //UpdateLayerFlags 9151a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah setMDPCompLayerFlags(ctx, list); 9161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 91889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula // unlock it before calling dump function to avoid deadlock 919f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 920af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 923f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 924c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 925c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 9268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit: 9278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah sCompBytesClaimed += calcMDPBytesRead(ctx, list); 9288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 929c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 930c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 931c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 932c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 933c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 934c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 935c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 936c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 938327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 940327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 941327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 942327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 943327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 944327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 947f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 950c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 951c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 9521a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahbool MDPCompLowRes::arePipesAvailable(hwc_context_t *ctx, 9531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 9541a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 9551a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = mCurrentFrame.mdpCount; 9561a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT); 9571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 9581a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe for FB 9591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 9601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah availPipes -= 1; 9611a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 9621a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 9631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d", 9641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, numPipesNeeded, availPipes); 9651a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 9661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 9671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 9681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 969c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 97016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 97220242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 97320242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 974c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 975f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 97620242a75d65c410071434d639266311376a5b7f6Saurabh Shah 977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 978c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 979f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 980f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 981c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 982327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 984f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 985f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 98620242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 98720242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 9881ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 98911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 99011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 991f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 992f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 993f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 9941a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 99620242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 99720242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 998c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 999c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1000c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1001c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1002c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1003c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1004c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1005c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1006f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1007c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1008c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 100933650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 101033650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1011c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1012c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1013c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1014c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1015c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1016ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1017ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1018ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1019ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1020ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1021c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 102233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 1023c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 10240ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1025c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1027c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1028f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1029f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1030c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1032f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1033c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1034327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1035327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1036327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1037327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1038c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 10390ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1040f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1042c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1044c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 1045c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 1046c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 10470ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 1048c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1049c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1050327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1051327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 1052327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1053c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1054327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1055f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 1056f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 1057c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1058327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1059327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 1060f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1061f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isModeOn()) { 1062f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->draw(ctx, fd, offset)) { 1063f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah fd = ctx->mAD->getDstFd(ctx); 1064f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah offset = ctx->mAD->getDstOffset(ctx); 1065f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1066f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1067f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1068f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1069327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1070327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 1071c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1072327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1075327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1076327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 1077ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy); 1078327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1080c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1081c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1082c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1083c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1084c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1085c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1086c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 1087c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1088c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 10891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list, 10901a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 1091c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 10922e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 10939640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 10949640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1095f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1096f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 1097f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 1098f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1099f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 11001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) { 1101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 11021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) { 1103f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 1104f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1106c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1107c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 1108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1109c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 11101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahbool MDPCompHighRes::arePipesAvailable(hwc_context_t *ctx, 11111a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 11121a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 11131a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah for(int i = 0; i < Overlay::MIXER_MAX; i++) { 11151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list, i); 11161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, i); 11171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe(s)for FB 11191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 11201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah availPipes -= 1; 11211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 11231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 11241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah "dpy %d mixer %d needed %d, avail %d", 11251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, i, numPipesNeeded, availPipes); 11261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 11271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 11281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 11291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 11301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah} 11311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1132c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 11332e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah MdpPipeInfoHighRes& pipe_info, 11342e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 11352e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 11369640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1137f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1138f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 11391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 11401a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 11411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if (dst.left < lSplit) { 11431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT); 1144f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1145f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 11461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 11471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 11481a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(dst.right > lSplit) { 11491a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT); 11501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1152f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 11531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1155c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1156c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1157c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 115820242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 115920242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 116020242a75d65c410071434d639266311376a5b7f6Saurabh Shah 116120242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 11635a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 11645a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 11651bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 11661bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1167c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 11683393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1169c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 1170c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1171c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 117220242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 117320242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 11741ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 117511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 117620242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1177c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 117820242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1179c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1180c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 118120242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 118220242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 118316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 118416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1187c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 11881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1189c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1190c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1191c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1192c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 11932e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1194327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 1195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 1196327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1197327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1198327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1199327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1200327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1201f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1203f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1204f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1205f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1207c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1208c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1210c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 121216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 121316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1214c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1215c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1216c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1217c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 121816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1219c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1220c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1221ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1222ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1223ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1224ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1225ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 122616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 122733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 122816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 122916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 123016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1232c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1235c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1238660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1239327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1240327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1241327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1242327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1243327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1244c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 124516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1247c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1250f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1251c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 1252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1254327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1255c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1256c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1258327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1259327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1260327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1261f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isModeOn()) { 1262f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->draw(ctx, fd, offset)) { 1263f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah fd = ctx->mAD->getDstFd(ctx); 1264f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah offset = ctx->mAD->getDstOffset(ctx); 1265f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1266f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1267f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 1268327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1269327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1270327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1271327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1272327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1273c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1274c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1275c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1276c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1277327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1279327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1280327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1281327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1283c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1284c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1285c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1286c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1287c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1288327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1289f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1290327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1291327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1292327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1293c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1294c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1295327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 129616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1297c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1298327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 129916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1301c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1302c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1303