hwc_mdpcomp.cpp revision 03514577d0c705056352898f66ed2a8e9b131df8
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 2404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained 4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only. 5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License. 8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at 9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and 16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License. 17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h> 20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h" 2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h> 22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 23361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h" 24591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h" 258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h" 26699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h" 27f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h" 28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 3011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils; 3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 35327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 36327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 43e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true; 44bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::sEnablePartialFrameUpdate = false; 45f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 46d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahdouble MDPComp::sMaxBw = 0.0; 470feed9dccc812e37f7e2e58f3fb8246511f831f9Saurabh Shahdouble MDPComp::sBwClaimed = 0.0; 4815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::sEnable4k2kYUVSplit = false; 49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) { 51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(isDisplaySplit(ctx, dpy)) { 52f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompSplit(dpy); 53c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 54f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompNonSplit(dpy); 55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 57f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 60c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 63bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 66361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d " 68efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah "fbCount:%2d \n", mCurrentFrame.layerCount, 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 80bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.drop[index] ? "DROP" : 83bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"), 84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 86f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 111e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(property_get("persist.hwc.partialupdate.enable", property, NULL) > 0) { 118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL && 119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran qdutils::MDPVersion::getInstance().is8x74v2()) 120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate = true; 121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__, 123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sEnablePartialFrameUpdate); 124bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 125f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 131f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1326bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1336bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1346bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1356bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1366bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 143c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 15115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 15215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((property_get("debug.mdpcomp.4k2kSplit", property, "0") > 0) && 15315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 15415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 15515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna sEnable4k2kYUVSplit = true; 15615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 158c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 160c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::reset(hwc_context_t *ctx) { 161c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 163c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mOverlay->clear(mDpy); 164c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mLayerRotMap[mDpy]->clear(); 165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah} 166699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 175359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 181359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 188f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 194f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 195bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Drop the layer when its already present in FB OR when it lies 196bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * outside frame's ROI */ 197bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) { 198f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 199bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 202c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 20316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 204c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::setRedraw(hwc_context_t *ctx, 205c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 206c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.needsRedraw = false; 207c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!mCachedFrame.isSameFrame(mCurrentFrame, list) || 208c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 209c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah isSkipPresent(ctx, mDpy)) { 210c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.needsRedraw = true; 211c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 212c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah} 213c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 214f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 215af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 217c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 218af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 222f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 225c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 226c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 229f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 235ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 241af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 242af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 250f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 251f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 254f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 25687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&isFBComposed, true, sizeof(isFBComposed)); 25787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&drop, false, sizeof(drop)); 258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 260af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 264af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 265af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 27087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed)); 27187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&drop, &curFrame.drop, sizeof(drop)); 27287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula} 27387957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula 274e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaranbool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame, 275e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran hwc_display_contents_1_t* list) { 27687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if(layerCount != curFrame.layerCount) 27787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 27887957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula for(int i = 0; i < curFrame.layerCount; i++) { 27987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if((curFrame.isFBComposed[i] != isFBComposed[i]) || 28087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula (curFrame.drop[i] != drop[i])) { 28187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 28287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 283e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran if(curFrame.isFBComposed[i] && 284e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran (hnd[i] != list->hwLayers[i].handle)){ 285e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran return false; 286e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran } 28787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 28887957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return true; 289c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 290c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 291efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) { 292efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 293efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((not isYuvBuffer(hnd) and has90Transform(layer)) or 294efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (not isValidDimension(ctx,layer)) 295efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //More conditions here, SKIP, sRGB+Blend etc 296efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ) { 297efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 298efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 299efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 300efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 301efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 3021b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 30608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (layer->flags & HWC_COLOR_FILL) { 30708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // Color layer 30808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return true; 30908cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 3100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 3110ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3120ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 3130ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 31480864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed //XXX: Investigate doing this with pixel phase on MDSS 3158d07dd7a9493c19215acf1e992502d1f51329fe0Naseer Ahmed if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf)) 31680864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return false; 31780864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed 3188f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 3200ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 3230ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 324df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran float w_scale = ((float)crop_w / (float)dst_w); 325df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran float h_scale = ((float)crop_h / (float)dst_h); 3260ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 327f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3301b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3311b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3321b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3340ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3350ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 336df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if((w_scale > 1.0f) || (h_scale > 1.0f)) { 337bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran const uint32_t downscale = 33841269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 339df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float w_dscale = w_scale; 340df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float h_dscale = h_scale; 341df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 342bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(ctx->mMDP.version >= qdutils::MDSS_V5) { 343bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran /* Workaround for downscales larger than 4x. 344bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran * Will be removed once decimator block is enabled for MDSS 345bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran */ 346bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 347bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 348bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran h_dscale > downscale) 349bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 350bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { 351bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(w_dscale > 64 || h_dscale > 64) 352bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 353bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } 354bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { //A-family 355bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(w_dscale > downscale || h_dscale > downscale) 35641269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 35741269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 35841269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 35941269096daf2363b16dcd89627dd674529a26601Saurabh Shah 360df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if((w_scale < 1.0f) || (h_scale < 1.0f)) { 361df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const uint32_t upscale = 362df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran qdutils::MDPVersion::getInstance().getMaxMDPUpscale(); 363df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float w_uscale = 1.0f / w_scale; 364df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float h_uscale = 1.0f / h_scale; 365df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 366df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if(w_uscale > upscale || h_uscale > upscale) 367df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran return false; 368df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran } 369df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 3700ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type, 3741a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 375c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 377c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 378c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 3801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer); 381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 382f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 3861a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer); 387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 392f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 393f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 394f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 3961a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer); 397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 400c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 401c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 403c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 404f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 405af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 406f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 407f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 409af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 41056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 411140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mVideoTransFlag && 412140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan isSecondaryConnected(ctx)) { 41356d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 41456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 41556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 41656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 417140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } else if(isSecondaryConfiguring(ctx)) { 418c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 419f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 420af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 42203514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ALOGD_IF(isDebug(), "%s: padding round invoked for dpy %d", 42303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal __FUNCTION__,mDpy); 424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 425586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 427f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 429a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran/* 430a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 1) Identify layers that are not visible in the updating ROI and drop them 431a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * from composition. 432a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 2) If we have a scaling layers which needs cropping against generated ROI. 433a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * Reset ROI to full resolution. 434a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran */ 435bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx, 436bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_display_contents_1_t* list, hwc_rect_t roi) { 437bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 438bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(roi)) 440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 442a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t visibleRect = roi; 443a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 444a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran for(int i = numAppLayers - 1; i >= 0; i--){ 445a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 446a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(!isValidRect(visibleRect)) { 447a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.drop[i] = true; 448a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.dropCount++; 449f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran continue; 450a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran } 451a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 452bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran const hwc_layer_1_t* layer = &list->hwLayers[i]; 453bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 454bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = layer->displayFrame; 455f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t srcRect = integerizeSourceCrop(layer->sourceCropf); 456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 457a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t res = getIntersection(visibleRect, dstRect); 458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 459bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_w = res.right - res.left; 460bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int res_h = res.bottom - res.top; 461bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_w = dstRect.right - dstRect.left; 462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int dst_h = dstRect.bottom - dstRect.top; 463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(res)) { 465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.drop[i] = true; 466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount++; 467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran }else { 468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Reset frame ROI when any layer which needs scaling also needs ROI 469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * cropping */ 470f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran if((res_w != dst_w || res_h != dst_h) && needsScaling (layer)) { 4710938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee ALOGI("%s: Resetting ROI due to scaling", __FUNCTION__); 472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 474bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 476a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 477f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran /* deduct any opaque region from visibleRect */ 478f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran if (layer->blending == HWC_BLENDING_NONE) 479f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran visibleRect = deductRect(visibleRect, res); 480f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran } 481bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 482bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return true; 483bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 484bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 485bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 486bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 487bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 488bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!sEnablePartialFrameUpdate) { 489bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 490bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 491bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 492bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(mDpy || isDisplaySplit(ctx, mDpy)){ 493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGE_IF(isDebug(), "%s: ROI not supported for" 494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran "the (1) external / virtual display's (2) dual DSI displays", 495bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran __FUNCTION__); 496bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 497bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 498bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 499a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) 500a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran return; 501a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 502bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(list->flags & HWC_GEOMETRY_CHANGED) 503bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 504bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 505bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0}; 506bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran for(int index = 0; index < numAppLayers; index++ ) { 507bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) || 508bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) { 509bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = list->hwLayers[index].displayFrame; 510f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R hwc_rect_t srcRect = integerizeSourceCrop( 511f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R list->hwLayers[index].sourceCropf); 512bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 513bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Intersect against display boundaries */ 514bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = getUnion(roi, dstRect); 515bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 516bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 517bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 518bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!validateAndApplyROI(ctx, list, roi)){ 519bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi = (struct hwc_rect) {0, 0, 520bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres}; 521bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 522bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 523bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.x = roi.left; 524bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.y = roi.top; 525bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.w = roi.right - roi.left; 526bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[mDpy].roi.h = roi.bottom - roi.top; 527bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 528bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__, 529bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran roi.left, roi.top, roi.right, roi.bottom); 530bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 531bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 534c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryFullFrame(hwc_context_t *ctx, 535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 537af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 53869f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R int priDispW = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 5401b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) { 54133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 54233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 54333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 54433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 546af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 547af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 548af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 549c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 550c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 551c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 55269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R if(mDpy > HWC_DISPLAY_PRIMARY && (priDispW > MAX_DISPLAY_DIM) && 55369f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R (ctx->dpyAttr[mDpy].xres < MAX_DISPLAY_DIM)) { 55469f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // Disable MDP comp on Secondary when the primary is highres panel and 55569f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // the secondary is a normal 1080p, because, MDP comp on secondary under 55669f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // in such usecase, decimation gets used for downscale and there will be 55769f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // a quality mismatch when there will be a fallback to GPU comp 55869f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R ALOGD_IF(isDebug(), "%s: Disable MDP Compositon for Secondary Disp", 55969f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R __FUNCTION__); 56069f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R return false; 56169f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R } 56269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R 563ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan // check for action safe flag and downscale mode which requires scaling. 564ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan if(ctx->dpyAttr[mDpy].mActionSafePresent 565ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan || ctx->dpyAttr[mDpy].mDownScaleMode) { 566ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan ALOGD_IF(isDebug(), "%s: Scaling needed for this frame",__FUNCTION__); 567ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan return false; 568ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan } 569ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan 570c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 571c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 572c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 573f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 574efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(isYuvBuffer(hnd) && has90Transform(layer)) { 575efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!canUseRotator(ctx, mDpy)) { 576efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d", 577efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__, mDpy); 57886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 57986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 580c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 5812902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 5822902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 5832902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 5842902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 5852902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 5862902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 5872902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 5882902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 589c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 590af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 591f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 592f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 593f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 594f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 595af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 596af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 597af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 598af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 599e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 601af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 60286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 603af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 606af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 607efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit presentation / secondary-only layer. 608efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) && 609efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (list->numHwLayers - 1) > MAX_SEC_LAYERS) { 610efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 611efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 612efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 613efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 614efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 615efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 616efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 617efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 618efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__); 619efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 620efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 62184a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu 62284a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //For 8x26, if there is only one layer which needs scale for secondary 62384a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //while no scale for primary display, DMA pipe is occupied by primary. 62484a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //If need to fall back to GLES composition, virtual display lacks DMA 62584a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //pipe and error is reported. 62684a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu if(qdutils::MDPVersion::getInstance().is8x26() && 62784a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu mDpy >= HWC_DISPLAY_EXTERNAL && 62886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qhwc::needsScaling(layer)) 62984a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu return false; 630efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 631c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 632af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 633af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 634bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop, 635bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 636bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount - 637bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount; 638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 63915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 640f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 64115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 64215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 643c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 644c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 645c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 6468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 6478eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 6488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 649af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 650af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 651af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 652af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 653af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 654e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 655e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 656e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 657e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 658e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 65994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah bool ret = false; 660116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah if(list->flags & HWC_GEOMETRY_CHANGED) { //Try load based first 661116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah ret = loadBasedCompPreferGPU(ctx, list) or 662116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah loadBasedCompPreferMDP(ctx, list) or 663116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah cacheBasedComp(ctx, list); 664116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } else { 665116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah ret = cacheBasedComp(ctx, list) or 666116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah loadBasedCompPreferGPU(ctx, list) or 66795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah loadBasedCompPreferMDP(ctx, list); 66894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 66994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 67094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return ret; 67194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 67294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 67394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::cacheBasedComp(hwc_context_t *ctx, 67494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 67594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 676af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 677af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 678efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 679efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //If an MDP marked layer is unsupported cannot do partial MDP Comp 680efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 681efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 682efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 683efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 684efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list", 685efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__); 686c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 687efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 688efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 689efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 690efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 691efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 69211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, false /*secure only*/); 69336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula bool ret = markLayersForCaching(ctx, list); //sets up fbZ also 694efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!ret) { 695efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy); 696c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 697efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 698efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 699af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 701efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 70215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 703f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 70415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 70515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 706efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit cases where a video has non-updating background. 707efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) and 708efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (mdpCount > MAX_SEC_LAYERS)) { 709efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 710c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 711efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 712efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 713efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 714c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 715c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 716c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 7178eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 7188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 7198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 72395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shahbool MDPComp::loadBasedCompPreferGPU(hwc_context_t *ctx, 72494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 725404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(not isLoadBasedCompDoable(ctx)) { 726116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah return false; 727116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } 728116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 72994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 73094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.reset(numAppLayers); 73194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 73295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah int stagesForMDP = min(sMaxPipesPerMixer, ctx->mOverlay->availablePipes( 73395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mDpy, Overlay::MIXER_DEFAULT)); 73495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //If MDP has X possible stages, it can take X layers. 735e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran const int batchSize = (numAppLayers - mCurrentFrame.dropCount) - 736e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran (stagesForMDP - 1); //1 for FB 73795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 73894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(batchSize <= 0) { 73994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: Not attempting", __FUNCTION__); 74094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 74194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 74294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 74394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int minBatchStart = -1; 744e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran int minBatchEnd = -1; 74594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah size_t minBatchPixelCount = SIZE_MAX; 74694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 747e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran /* Iterate through the layer list to find out a contigous batch of batchSize 748e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran * non-dropped layers with loweest pixel count */ 749e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran for(int i = 0; i <= (numAppLayers - batchSize); i++) { 750e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(mCurrentFrame.drop[i]) 751e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran continue; 752e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 753e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran int batchCount = batchSize; 75494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah uint32_t batchPixelCount = 0; 755e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran int j = i; 756e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran for(; j < numAppLayers && batchCount; j++){ 757e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(!mCurrentFrame.drop[j]) { 758e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[j]; 759e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 760e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 761e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 762e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran /* If we have a valid ROI, count pixels only for the MDP fetched 763e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran * region of the buffer */ 764e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if((ctx->listStats[mDpy].roi.w != ctx->dpyAttr[mDpy].xres) || 765e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran (ctx->listStats[mDpy].roi.h != ctx->dpyAttr[mDpy].yres)) { 766e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran hwc_rect_t roi; 767e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran roi.left = ctx->listStats[mDpy].roi.x; 768e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran roi.top = ctx->listStats[mDpy].roi.y; 769e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran roi.right = roi.left + ctx->listStats[mDpy].roi.w; 770e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran roi.bottom = roi.top + ctx->listStats[mDpy].roi.h; 771e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 772e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran /* valid ROI means no scaling layer is composed. So check 773e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran * only intersection to find actual fetched pixels */ 774e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran crop = getIntersection(roi, dst); 775e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 776e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 777e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran batchPixelCount += (crop.right - crop.left) * 77894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah (crop.bottom - crop.top); 779e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran batchCount--; 780e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 78194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 78294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 783e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran /* we dont want to program any batch of size lesser than batchSize */ 784e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(!batchCount && (batchPixelCount < minBatchPixelCount)) { 78594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah minBatchPixelCount = batchPixelCount; 78694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah minBatchStart = i; 787e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran minBatchEnd = j-1; 78894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 78994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 79094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 79194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(minBatchStart < 0) { 79294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: No batch found batchSize %d numAppLayers %d", 79394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah __FUNCTION__, batchSize, numAppLayers); 79494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 79594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 79694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 797e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran /* non-dropped layers falling ouside the selected batch will be marked for 798e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran * MDP */ 79994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah for(int i = 0; i < numAppLayers; i++) { 800e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if((i < minBatchStart || i > minBatchEnd) && !mCurrentFrame.drop[i] ) { 80194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 80294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 80394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah ALOGD_IF(isDebug(), "%s: MDP unsupported layer found at %d", 80494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah __FUNCTION__, i); 805c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 80694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 80794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 80894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.isFBComposed[i] = false; 80994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 81094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 81194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 81294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.fbZ = minBatchStart; 81394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah mCurrentFrame.fbCount = batchSize; 814e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount - 815e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.dropCount; 81694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 817e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: fbZ %d batchSize %d fbStart: %d fbEnd: %d", 818e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran __FUNCTION__, mCurrentFrame.fbZ, batchSize, minBatchStart, 819e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran minBatchEnd); 820c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 82115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 822f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 82315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 82415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 825c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 826c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 827c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 82894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 82994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 83094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 83194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return true; 83294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 83394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 83495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shahbool MDPComp::loadBasedCompPreferMDP(hwc_context_t *ctx, 83595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah hwc_display_contents_1_t* list) { 836404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(not isLoadBasedCompDoable(ctx)) { 837116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah return false; 838116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } 839116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 84095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 841116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah mCurrentFrame.reset(numAppLayers); 842116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 84395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //Full screen is from ib perspective, not actual full screen 84495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int bpp = 4; 84595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah double panelRefRate = 84695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 84795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 84895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah double bwLeft = sMaxBw - sBwClaimed; 84995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 85095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah const int fullScreenLayers = bwLeft * 1000000000 / (ctx->dpyAttr[mDpy].xres 85195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah * ctx->dpyAttr[mDpy].yres * bpp * panelRefRate); 85295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 853e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran const int fbBatchSize = (numAppLayers - mCurrentFrame.dropCount) 854e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran - (fullScreenLayers - 1); 855e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 85695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //If batch size is not at least 2, we aren't really preferring MDP, since 85795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //only 1 layer going to GPU could actually translate into an entire FB 85895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah //needed to be fetched by MDP, thus needing more b/w rather than less. 85995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah if(fbBatchSize < 2 || fbBatchSize > numAppLayers) { 86095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah ALOGD_IF(isDebug(), "%s: Not attempting", __FUNCTION__); 86195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return false; 86295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 86395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 864e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran //Find top fbBatchSize non-dropped layers to get your batch 865e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran int fbStart = -1, fbEnd = -1, batchCount = fbBatchSize; 866e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran for(int i = numAppLayers - 1; i >= 0; i--) { 867e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(mCurrentFrame.drop[i]) 868e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran continue; 86995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 870e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(fbEnd < 0) 871e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran fbEnd = i; 872e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 873e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(!(--batchCount)) { 874e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran fbStart = i; 875e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran break; 876e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 877e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 878e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran 879e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran //Bottom layers constitute MDP batch 880e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran for(int i = 0; i < fbStart; i++) { 881e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if((i < fbStart || i > fbEnd) && !mCurrentFrame.drop[i] ) { 882e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 883e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran if(not isSupportedForMDPComp(ctx, layer)) { 884e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP unsupported layer found at %d", 885e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran __FUNCTION__, i); 886e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran reset(ctx); 887e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran return false; 888e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 889e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 89095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 89195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 89295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 893e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.fbZ = fbStart; 89495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah mCurrentFrame.fbCount = fbBatchSize; 895e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount 896e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran - mCurrentFrame.dropCount; 89795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 898e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: FB Z %d, app layers %d, non-dropped layers: %d, " 899e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran "MDP Batch Size %d",__FUNCTION__, mCurrentFrame.fbZ, numAppLayers, 900e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran numAppLayers - mCurrentFrame.dropCount, mCurrentFrame.mdpCount); 901c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 90215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 903f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 90415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 90515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 906c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 907c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 908c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 90995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return false; 91095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 91195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 91295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah return true; 91395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah} 91495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 915404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::isLoadBasedCompDoable(hwc_context_t *ctx) { 9167cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula if(mDpy or isSecurePresent(ctx, mDpy) or 9177cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula isYuvPresent(ctx, mDpy)) { 91894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 91994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 92094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return true; 92194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 92294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 923c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryVideoOnly(hwc_context_t *ctx, 924c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 925c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah const bool secureOnly = true; 926c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return videoOnlyComp(ctx, list, not secureOnly) or 927c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah videoOnlyComp(ctx, list, secureOnly); 928c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah} 929c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 930c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::videoOnlyComp(hwc_context_t *ctx, 93111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list, bool secureOnly) { 932af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 933bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 934af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 93511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, secureOnly); 93641269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 937af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 938c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!isYuvPresent(ctx, mDpy) or (mdpCount == 0)) { 939c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 940af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 941af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 942af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 94311c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran /* Bail out if we are processing only secured video layers 94411c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran * and we dont have any */ 94511c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran if(!isSecurePresent(ctx, mDpy) && secureOnly){ 946c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 94711c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran return false; 94811c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran } 94911c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran 950c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(mCurrentFrame.fbCount) 951c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 95241269096daf2363b16dcd89627dd674529a26601Saurabh Shah 953c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(sEnable4k2kYUVSplit){ 954c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah adjustForSourceSplit(ctx, list); 955c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 956c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 957c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 958c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 959c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 9608eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 9618eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 9628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 963c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 964c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 965c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 966f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 968c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(isSkipLayer(layer)) { 969e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 972c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 97386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 97486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 97586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 97686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 97786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 978f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 979f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 980f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 981f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 982f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 98341269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 98441269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 98541269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 98641269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 98841269096daf2363b16dcd89627dd674529a26601Saurabh Shah 989a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 990a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 991a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 992a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 993a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 994a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 995a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 997c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 998c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 99936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* starts at fromIndex and check for each layer to find 100036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * if it it has overlapping with any Updating layer above it in zorder 100136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * till the end of the batch. returns true if it finds any intersection */ 100236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::canPushBatchToTop(const hwc_display_contents_1_t* list, 100336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex) { 100436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i < toIndex; i++) { 100536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) { 100636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(intersectingUpdatingLayers(list, i+1, toIndex, i)) { 100736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 100836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 100936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 101036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 101136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 101236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 101336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 101436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* Checks if given layer at targetLayerIndex has any 101536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * intersection with all the updating layers in beween 101636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * fromIndex and toIndex. Returns true if it finds intersectiion */ 101736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::intersectingUpdatingLayers(const hwc_display_contents_1_t* list, 101836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex, int targetLayerIndex) { 101936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i <= toIndex; i++) { 102036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 102136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(areLayersIntersecting(&list->hwLayers[i], 102236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula &list->hwLayers[targetLayerIndex])) { 102336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 102436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 102536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 102636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 102736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 102836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 102936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 103036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulaint MDPComp::getBatch(hwc_display_contents_1_t* list, 103136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchStart, int& maxBatchEnd, 103236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchCount) { 103336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int i = 0; 103436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZOrder =-1; 1035eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran int droppedLayerCt = 0; 103636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while (i < mCurrentFrame.layerCount) { 103736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchCount = 0; 103836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchStart = i; 103936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchEnd = i; 1040eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran /* Adjust batch Z order with the dropped layers so far */ 1041eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran int fbZ = batchStart - droppedLayerCt; 104236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int firstZReverseIndex = -1; 104385cc9b8dfc7a50f6e8083b67056f3a25702fbba1Prabhanjan Kandula int updatingLayersAbove = 0;//Updating layer count in middle of batch 104436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while(i < mCurrentFrame.layerCount) { 104536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 104636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!batchCount) { 104736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 104836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 104936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 105036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove++; 105136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 105236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 105336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 105436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.drop[i]) { 105536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 1056eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran droppedLayerCt++; 105736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 105836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(updatingLayersAbove <= 0) { 105936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 106036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 106136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 106236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 106336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { //Layer is FBComposed, not a drop & updatingLayer > 0 106436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 106536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // We have a valid updating layer already. If layer-i not 106636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // have overlapping with all updating layers in between 106736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // batch-start and i, then we can add layer i to batch. 106836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!intersectingUpdatingLayers(list, batchStart, i-1, i)) { 106936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 107036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 107136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 107236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 107336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(canPushBatchToTop(list, batchStart, i)) { 107436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //If All the non-updating layers with in this batch 107536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //does not have intersection with the updating layers 107636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //above in z-order, then we can safely move the batch to 107736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //higher z-order. Increment fbZ as it is moving up. 107836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if( firstZReverseIndex < 0) { 107936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula firstZReverseIndex = i; 108036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 108136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 108236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 108336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ += updatingLayersAbove; 108436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 108536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove = 0; 108636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 108736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 108836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //both failed.start the loop again from here. 108936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(firstZReverseIndex >= 0) { 109036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i = firstZReverseIndex; 109136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 109236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 109336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 109436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 109536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 109636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 109736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(batchCount > maxBatchCount) { 109836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchCount = batchCount; 109936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchStart = batchStart; 110036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchEnd = batchEnd; 110136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZOrder = fbZ; 110236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 110336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 110436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return fbZOrder; 110536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 110636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 110736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::markLayersForCaching(hwc_context_t* ctx, 110836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula hwc_display_contents_1_t* list) { 110936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* Idea is to keep as many non-updating(cached) layers in FB and 111036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * send rest of them through MDP. This is done in 2 steps. 111136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 1. Find the maximum contiguous batch of non-updating layers. 111236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 2. See if we can improve this batch size for caching by adding 111336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * opaque layers around the batch, if they don't have 111436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * any overlapping with the updating layers in between. 111536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * NEVER mark an updating layer for caching. 111636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * But cached ones can be marked for MDP */ 1117f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1118f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 1119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int maxBatchEnd = -1; 1120f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 112136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZ = -1; 1122f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 1124af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 1125af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 1126efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1127af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1128af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 1129af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 1130efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1131af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1132f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 113336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount); 1134bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 113536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* reset rest of the layers lying inside ROI for MDP comp */ 1136f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 1137efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 1138bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((i < maxBatchStart || i > maxBatchEnd) && 113936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.isFBComposed[i]){ 1140bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]){ 1141bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //If an unsupported layer is being attempted to 1142bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //be pulled out we should fail 1143bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(not isSupportedForMDPComp(ctx, layer)) { 1144bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 1145bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 1146bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 1147efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 1148f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1150f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 115136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // update the frame data 115236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbZ = fbZ; 115336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount = maxBatchCount; 1154af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1155bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 115836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount); 1159efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1160efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1161f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 116211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 1163f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 1164efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_display_contents_1_t* list) { 1165f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 1166efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah int fbCount = 0; 1167f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1168f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 1169f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 1170bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]) 1171bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran fbCount++; 1172f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 1173f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 1174af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 1175f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1176c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1177af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1178efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah mCurrentFrame.fbCount = fbCount; 1179bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount 1180bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran - mCurrentFrame.dropCount; 1181efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1182bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d" 1183bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount, 1184bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount); 1185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1186c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 118711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list, 118811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah bool secureOnly) { 1189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 1190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 1191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 1193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1194f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 1195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 1196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 1197f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 1198f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1199c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 1200f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 120111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 120211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!secureOnly || isSecureBuffer(hnd)) { 120311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 120411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.fbCount--; 120511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 1206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1207c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1209af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1210af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1211bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1212bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__, 1213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 1214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1215f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1216c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::postHeuristicsHandling(hwc_context_t *ctx, 1217c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 1218c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1219c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Capability checks 1220c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!resourceCheck(ctx, list)) { 1221c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 1222c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return false; 1223c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1224c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1225c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Limitations checks 1226c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!hwLimitationsCheck(ctx, list)) { 1227c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "%s: HW limitations",__FUNCTION__); 1228c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return false; 1229c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1230c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1231f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //Configure framebuffer first if applicable 1232f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 1233f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) { 1234f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah ALOGD_IF(isDebug(), "%s configure framebuffer failed", 1235f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah __FUNCTION__); 1236f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah return false; 1237f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1238f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1239f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah 1240c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.map(); 1241c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 1243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 1244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 1248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 1250f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1251f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 125336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //Leave fbZ for framebuffer. CACHE/GLES layers go here. 125436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mdpNextZOrder == mCurrentFrame.fbZ) { 125536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mdpNextZOrder++; 125636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 1257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 1259f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 126015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna private_handle_t *hnd = (private_handle_t *)layer->handle; 126115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 126215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(configure4k2kYuv(ctx, layer, 126315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpToLayer[mdpIndex]) 126415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna != 0 ){ 126515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(), "%s: Failed to configure split pipes \ 126615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for layer %d",__FUNCTION__, index); 126715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 126815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 126915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 127015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mdpNextZOrder++; 127115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 127215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 127315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1274f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 1275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 127615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna layer %d",__FUNCTION__, index); 1277af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1279af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1280f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1281f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 12821029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah if(!ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd)) { 12831029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to validate and set overlay for dpy %d" 12841029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ,__FUNCTION__, mDpy); 12851029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah return false; 12861029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 12871029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 1288c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah setRedraw(ctx, list); 1289af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 1290af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 1291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 129202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shahbool MDPComp::resourceCheck(hwc_context_t *ctx, 129302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah hwc_display_contents_1_t *list) { 129402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah const bool fbUsed = mCurrentFrame.fbCount; 129502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(mCurrentFrame.mdpCount > sMaxPipesPerMixer - fbUsed) { 129602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 129702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 129802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 129902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 130002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!arePipesAvailable(ctx, list)) { 130102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 130202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 130302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 1304d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double size = calcMDPBytesRead(ctx, list); 130502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(!bandwidthCheck(ctx, size)) { 130602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__); 130702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 130802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 130902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 131002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return true; 131102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah} 131202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 1313d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahdouble MDPComp::calcMDPBytesRead(hwc_context_t *ctx, 13148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_display_contents_1_t* list) { 1315d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double size = 0; 1316d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah const double GIG = 1000000000.0; 13178eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1318d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah //Skip for targets where no device tree value for bw is supplied 1319d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if(sMaxBw <= 0.0) { 1320d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah return 0.0; 1321d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah } 13224b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson 13238eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah for (uint32_t i = 0; i < list->numHwLayers - 1; i++) { 13248eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 13258eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 13268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 13274b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson if (hnd) { 13288f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 13293d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah hwc_rect_t dst = layer->displayFrame; 13304b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson float bpp = ((float)hnd->size) / (hnd->width * hnd->height); 1331d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah size += (bpp * (crop.right - crop.left) * 1332d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah (crop.bottom - crop.top) * 1333d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top)) / 1334d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah GIG; 13354b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson } 13368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 13378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 13388eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 13398eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah if(mCurrentFrame.fbCount) { 13408eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1]; 1341d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah int tempw, temph; 1342d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah size += (getBufferSizeAndDimensions( 1343d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah layer->displayFrame.right - layer->displayFrame.left, 1344d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah layer->displayFrame.bottom - layer->displayFrame.top, 1345d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah HAL_PIXEL_FORMAT_RGBA_8888, 1346d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah tempw, temph)) / GIG; 13478eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 13488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 13498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return size; 13508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 13518eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1352d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const double& size) { 1353d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah //Skip for targets where no device tree value for bw is supplied 1354d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if(sMaxBw <= 0.0) { 1355d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah return true; 1356d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah } 1357d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 1358d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double panelRefRate = 1359d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 1360d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah if((size * panelRefRate) > (sMaxBw - sBwClaimed)) { 1361d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah return false; 13628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 13638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return true; 13648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah} 13658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 136686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool MDPComp::hwLimitationsCheck(hwc_context_t* ctx, 136786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_display_contents_1_t* list) { 136886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 136986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //A-family hw limitation: 137086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If a layer need alpha scaling, MDP can not support. 137186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(ctx->mMDP.version < qdutils::MDSS_V5) { 137286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 137386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 137486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isAlphaScaled( &list->hwLayers[i])) { 137586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula ALOGD_IF(isDebug(), "%s:frame needs alphaScaling",__FUNCTION__); 137686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 137786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 137886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 137986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 138086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 138186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula // On 8x26 & 8974 hw, we have a limitation of downscaling+blending. 138286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If multiple layers requires downscaling and also they are overlapping 138386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //fall back to GPU since MDSS can not handle it. 138486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x74v2() || 138586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qdutils::MDPVersion::getInstance().is8x26()) { 138686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount-1; ++i) { 138786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* botLayer = &list->hwLayers[i]; 138886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 138986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(botLayer)) { 139086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //if layer-i is marked for MDP and needs downscaling 139186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //check if any MDP layer on top of i & overlaps with layer-i 139286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int j = i+1; j < mCurrentFrame.layerCount; ++j) { 139386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* topLayer = &list->hwLayers[j]; 139486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[j] && 139586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(topLayer)) { 139686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_rect_t r = getIntersection(botLayer->displayFrame, 139786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula topLayer->displayFrame); 139886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(isValidRect(r)) 139986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 140086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 140186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 140286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 140386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 140486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 140586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return true; 140686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula} 140786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 1408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 14098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 1410af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 1411d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah MDPVersion& mdpVersion = qdutils::MDPVersion::getInstance(); 1412b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 141303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal //Do not cache the information for next draw cycle. 141403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal if(numLayers > MAX_NUM_APP_LAYERS or (!numLayers)) { 141503514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ALOGI("%s: Unsupported layer count for mdp composition", 141603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal __FUNCTION__); 1417c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.reset(); 1418c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return -1; 14191a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 142089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 1421c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //reset old data 1422c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.reset(numLayers); 1423c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1424c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.dropCount = 0; 1425c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1426c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // Detect the start of animation and fall back to GPU only once to cache 1427c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // all the layers in FB and display FB content untill animation completes. 1428c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(ctx->listStats[mDpy].isDisplayAnimating) { 1429c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCurrentFrame.needsRedraw = false; 1430c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(ctx->mAnimationState[mDpy] == ANIMATION_STOPPED) { 1431c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCurrentFrame.needsRedraw = true; 1432c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ctx->mAnimationState[mDpy] = ANIMATION_STARTED; 1433c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } 1434c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan setMDPCompLayerFlags(ctx, list); 1435c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCachedFrame.updateCounts(mCurrentFrame); 1436c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ret = -1; 1437c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan return ret; 1438c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } else { 1439c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ctx->mAnimationState[mDpy] = ANIMATION_STOPPED; 1440c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } 1441c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan 14421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 1443c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(isFrameDoable(ctx)) { 1444c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah generateROI(ctx, list); 1445c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1446c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Convert from kbps to gbps 1447c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah sMaxBw = mdpVersion.getHighBw() / 1000000.0; 1448c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if (ctx->mExtDisplay->isConnected() || 1449c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mMDP.panel != MIPI_CMD_PANEL) { 1450c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah sMaxBw = mdpVersion.getLowBw() / 1000000.0; 14511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 145215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1453c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(tryFullFrame(ctx, list) || tryVideoOnly(ctx, list)) { 1454c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah setMDPCompLayerFlags(ctx, list); 1455c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } else { 1456c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 1457c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1458c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.dropCount = 0; 14598eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 1460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 14611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 1462c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 1463c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah __FUNCTION__); 14648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 14651a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 1466f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1467f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 1468c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD("GEOMETRY change: %d", 1469c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED)); 1470f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 1471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 1472c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD("%s",sDump.string()); 1473c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1474c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1475c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.cacheAll(list); 1476c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 1477d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah double panelRefRate = 1478d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah 1000000000.0 / ctx->dpyAttr[mDpy].vsync_period; 1479d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah sBwClaimed += calcMDPBytesRead(ctx, list) * panelRefRate; 14808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 1481c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1482c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1483404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index) { 148415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 148515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bool bRet = true; 148615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int mdpIndex = mCurrentFrame.layerToMDP[index]; 148715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 148815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.pipeInfo = new MdpYUVPipeInfo; 148915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.rot = NULL; 149015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo; 149115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ePipeType type = MDPCOMP_OV_VG; 149215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 149315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = ovutils::OV_INVALID; 149415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = ovutils::OV_INVALID; 149515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 149615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 149715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.lIndex == ovutils::OV_INVALID){ 149815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 149915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed", 150015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 150115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 150215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 150315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.rIndex == ovutils::OV_INVALID){ 150415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 150515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed", 150615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 150715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 150815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return bRet; 150915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 1510404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R//=============MDPCompNonSplit================================================== 1511c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1512f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompNonSplit::adjustForSourceSplit(hwc_context_t *ctx, 1513404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R hwc_display_contents_1_t*) { 151415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //As we split 4kx2k yuv layer and program to 2 VG pipes 151515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //(if available) increase mdpcount accordingly 151615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpCount += ctx->listStats[mDpy].yuv4k2kCount; 1517f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah 1518f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //If 4k2k Yuv layer split is possible, and if 1519f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //fbz is above 4k2k layer, increment fb zorder by 1 1520f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //as we split 4k2k layer and increment zorder for right half 1521f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //of the layer 1522f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 1523f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount; 1524f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah for(int index = 0; index < n4k2kYuvCount; index++){ 1525f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah int n4k2kYuvIndex = 1526f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah ctx->listStats[mDpy].yuv4k2kIndices[index]; 1527f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ > n4k2kYuvIndex){ 1528f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah mCurrentFrame.fbZ += 1; 1529f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1530f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1531f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 153215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 153315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1534c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 1535c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 1536c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 1537f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1538f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1539f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& mdp_info = 1540f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo)); 1541327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 1542327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1543327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1544327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 1545327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 1547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 1548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1549f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 1550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 1551c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1552c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1553f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx, 15541a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 15551a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 15561a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = mCurrentFrame.mdpCount; 15571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT); 15581a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 15591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe for FB 15601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 15611a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah availPipes -= 1; 15621a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 15631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 15641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d", 15651a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, numPipesNeeded, availPipes); 15661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 15671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 15681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 156911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 157011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 157111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 157211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 157311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 157411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 157511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 157611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx, 157711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 157811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 157911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 158011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 158111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 158211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 158311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 158411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 158515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 158615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipesNeeded = pipesNeeded + 2; 158715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 158815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else if(isYuvBuffer(hnd)) { 158911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 159011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 159111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 159211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 159311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 159411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 159511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 159611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 159711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 159811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 159911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 160011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 160111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 16021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 1603c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 160416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 1605f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx, 160620242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 160720242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 1608c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 161020242a75d65c410071434d639266311376a5b7f6Saurabh Shah 1611c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1612c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 161315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 1614404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(allocSplitVGPipesfor4k2k(ctx, index)){ 161515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 161615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 161715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 161815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1621f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoNonSplit; 1622327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 1623f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo; 1624f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1625f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 162620242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 162720242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 1628319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula } else if(qdutils::MDPVersion::getInstance().is8x26() && 1629319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula (ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres > 1024)) { 1630319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula if(qhwc::needsScaling(layer)) 1631319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula type = MDPCOMP_OV_RGB; 163286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } else if(!qhwc::needsScaling(layer) 163311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 163411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1635f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 1636f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 1637f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 16381a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT); 1639c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 164020242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 164120242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 1642c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1643c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1644c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1645c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1646c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1647c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 164815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompNonSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 164915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 165015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 165115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 165215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 165315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 165415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 165515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 165615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 165715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 165815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 165915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 166015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 166115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1662f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1663c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1665c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1666c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 166733650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 166833650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1669c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1670c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1671c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1672c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1673c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1674ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1675ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1676ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1677ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1678ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1679c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 168033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 16813e051aac179e00ba4991ef31747af8fd3f9d8876Saurabh Shah idleInvalidator->handleUpdateEvent(); 16820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1683c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1685c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1688c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1691c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1692327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1693327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 169408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (!(layer->flags & HWC_COLOR_FILL)) { 169508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ALOGE("%s handle null", __FUNCTION__); 169608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return false; 169708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 169808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // No PLAY for Color layer 169908cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan layerProp[i].mFlags &= ~HWC_MDPCOMP; 170008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan continue; 1701c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 17020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1703f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 170515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 170615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 170715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 170815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 170915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 171015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 171115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 171215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 171315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 171415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 171515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 171615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 171715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 171815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 171915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 172015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 172115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 172215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 172315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 172415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 172515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 172615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 172715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 172815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1729c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 173015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 173115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 173215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 173315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 173415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 173515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 173615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 173715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 173815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 173915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1740327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 174115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 174215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoNonSplit& pipe_info = 174315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 174415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest dest = pipe_info.index; 174515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(dest == ovutils::OV_INVALID) { 174615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 174715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 174815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1749c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 175015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 175115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 175215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1753c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 175415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 175515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, 175615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hnd, dest ); 1757f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 175815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 175915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 1760327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 176115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 176215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 176315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!rot->queueBuffer(fd, offset)) 176415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 176515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 176615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 176715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 176815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 176915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, dest)) { 177015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d ", 177115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 177215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 177315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1774c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1775c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1776c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1777c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1778c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1779c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1780c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1781f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit=================================================== 1782c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1783f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompSplit::adjustForSourceSplit(hwc_context_t *ctx, 178415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_display_contents_1_t* list){ 178515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //if 4kx2k yuv layer is totally present in either in left half 178615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //or right half then try splitting the yuv layer to avoid decimation 178715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount; 178815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 178915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for(int index = 0; index < n4k2kYuvCount; index++){ 179015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int n4k2kYuvIndex = ctx->listStats[mDpy].yuv4k2kIndices[index]; 179115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_layer_1_t* layer = &list->hwLayers[n4k2kYuvIndex]; 179215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 1793f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if((dst.left > lSplit) || (dst.right < lSplit)) { 179415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpCount += 1; 179515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1796f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ > n4k2kYuvIndex){ 1797f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah mCurrentFrame.fbZ += 1; 1798f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 179915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 180015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 180115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1802f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx, 18031a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list, 18041a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mixer) { 1805c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 18069640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 18079640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1808f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 1810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 1811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 18131a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) { 1814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 18151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) { 1816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 1817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1818f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1819c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1820c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 1821c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1822c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1823f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx, 18241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah hwc_display_contents_1_t* list) { 18251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 182601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesNeeded = 0; 18271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 18281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah for(int i = 0; i < Overlay::MIXER_MAX; i++) { 18291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list, i); 18301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availPipes = ov.availablePipes(mDpy, i); 18311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 18321a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah //Reserve pipe(s)for FB 18331a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(mCurrentFrame.fbCount) 183401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah numPipesNeeded += 1; 18351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 183601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah totalPipesNeeded += numPipesNeeded; 183701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 183801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per mixer check. 18391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(numPipesNeeded > availPipes) { 18401a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 18411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah "dpy %d mixer %d needed %d, avail %d", 18421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah __FUNCTION__, mDpy, i, numPipesNeeded, availPipes); 18431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return false; 18441a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 18451a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 184601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 184701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah //Per display check, since unused pipes can get counted twice. 184801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int totalPipesAvailable = ov.availablePipes(mDpy); 184901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah if(totalPipesNeeded > totalPipesAvailable) { 185001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient pipes for " 185101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah "dpy %d needed %d, avail %d", 185201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable); 185301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah return false; 185401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah } 185501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 185611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(not areVGPipesAvailable(ctx, list)) { 185711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 185811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 185911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 186011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return true; 186111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 186211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 186311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx, 186411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list) { 186511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 186611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int pipesNeeded = 0; 186711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 186811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 186911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 187011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 187111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_rect_t dst = layer->displayFrame; 187211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 187315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 187415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 187515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipesNeeded = pipesNeeded + 2; 187615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 187715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 187815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 187911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(isYuvBuffer(hnd)) { 188011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.left < lSplit) { 188111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 188211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 188311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(dst.right > lSplit) { 188411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah pipesNeeded++; 188511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 188611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 188711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 188811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 188911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 189011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG); 189111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(pipesNeeded > availableVGPipes) { 189211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers" 189311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah "dpy %d needed %d, avail %d", 189411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah __FUNCTION__, mDpy, pipesNeeded, availableVGPipes); 189511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return false; 189611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 189711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 18981a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah return true; 18991a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah} 19001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1901f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 1902f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info, 19032e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 19049640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1905f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1906f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 19071a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 19081a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 19091a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 19101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if (dst.left < lSplit) { 19111a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT); 1912f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1913f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 19141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 19151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 19161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(dst.right > lSplit) { 19171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT); 19181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1919f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1920f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 19211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1923c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1924c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1925f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx, 192620242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 192720242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 192820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 192920242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1930c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 19315a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 19325a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 193315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 193415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 193515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 193615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 1937404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(allocSplitVGPipesfor4k2k(ctx, index)){ 193815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 193915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 194015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 194115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 19421bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 19431bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1944f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoSplit; 19453393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1946f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo; 1947c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1948c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 194920242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 195020242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 195144625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy) 195211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 195320242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1954c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 195520242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1956c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1957c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 195820242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 195920242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 196016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 196116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1962c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1963c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1964c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 19651a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 196615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 196715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 196815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 196915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 197015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 197115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 197215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 197315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 197415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 197515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 197615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 197715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 197815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 197915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 198015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 198115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 198215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 198315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configure(ctx, layer, PipeLayerPair); 198415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 198515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 198615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1988c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1989c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1990f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 19912e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1992f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& mdp_info = 1993f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 1994327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1995327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1996327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1997327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1998327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1999f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 2000f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 2001f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 2002f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 2003f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 2004f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 2005c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 2006c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2007f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 2008c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2009f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 201016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 201116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 2012c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 2013c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2014c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 2015c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 201616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 2017c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2018c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2019ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 2020ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 2021ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 2022ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 2023ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 202416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 202533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 20263e051aac179e00ba4991ef31747af8fd3f9d8876Saurabh Shah idleInvalidator->handleUpdateEvent(); 202716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 202816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 2029f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 2030c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 2032f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 2033c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 2034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 2035f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 2036660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 2037327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 2038327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 2039327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 2040327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 2041327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 2042c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 204316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 2044c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 2045c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2047f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 2048f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 204915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 205015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 205115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 205215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 205315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 205415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 205515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 205615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 205715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna uint32_t offset = hnd->offset; 205815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 205915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 206015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 206115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 206215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 206315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 206415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 206515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 206615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 206715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 206815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 206915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 207015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 207115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 207215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 207315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 207415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 207515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 207615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 207715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 207815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 207915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 208015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 208115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 208215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 208315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 208415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 208515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 208615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoSplit& pipe_info = 208715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 208815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 2089327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 209015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 209115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 2092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 209315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 209415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int offset = hnd->offset; 2095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 209615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->isModeOn()) { 209715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->draw(ctx, fd, offset)) { 2098404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R fd = ctx->mAD->getDstFd(); 2099404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R offset = ctx->mAD->getDstOffset(); 210015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2101f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 2102f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 210315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 210415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 210515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 210615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 210715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2108c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 210915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play left mixer ********** 211015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 211115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 211215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 211315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 211415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 211515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for left mixer", 211615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 211715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 211815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2119c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 212115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play right mixer ********** 212215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 212315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 212415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 212515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 212615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 212715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for right mixer", 212815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 212915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 213015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2133327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 213416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 2135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2136327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 213716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 2138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 2139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 2140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2141