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; 41e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnanbool MDPComp::sHandleTimeout = false; 42c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 4316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 44e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true; 45996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaranint MDPComp::sSimulationFlags = 0; 46f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 4715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::sEnable4k2kYUVSplit = false; 48c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVMbool MDPComp::sSrcSplitEnabled = false; 49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) { 50ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah if(qdutils::MDPVersion::getInstance().isSrcSplit()) { 51ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah sSrcSplitEnabled = true; 52ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah return new MDPCompSrcSplit(dpy); 53ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah } else if(isDisplaySplit(ctx, dpy)) { 54f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompSplit(dpy); 55c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 56f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return new MDPCompNonSplit(dpy); 57c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 59f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 61f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaranvoid MDPComp::dump(android::String8& buf, hwc_context_t *ctx) 62c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 63bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS) 64bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran return; 65bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 67361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 0) ? "\"PRIMARY\"" : 68361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\""); 69efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d " 70efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah "fbCount:%2d \n", mCurrentFrame.layerCount, 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 75f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran if(isDisplaySplit(ctx, mDpy)) { 76f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran dumpsys_log(buf, "Programmed ROI's: Left: [%d, %d, %d, %d] " 77f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran "Right: [%d, %d, %d, %d] \n", 78f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].lRoi.left, ctx->listStats[mDpy].lRoi.top, 79f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].lRoi.right, 80f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].lRoi.bottom, 81f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].rRoi.left,ctx->listStats[mDpy].rRoi.top, 82f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].rRoi.right, 83f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].rRoi.bottom); 84f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran } else { 85f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran dumpsys_log(buf, "Programmed ROI: [%d, %d, %d, %d] \n", 86f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].lRoi.left,ctx->listStats[mDpy].lRoi.top, 87f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].lRoi.right, 88f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->listStats[mDpy].lRoi.bottom); 89f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran } 90f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 91f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 92f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 93f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 94f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 96f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 97bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 98f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 99bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.drop[index] ? "DROP" : 100bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"), 101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 103f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 105c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 106c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 107c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 108c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 109c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 110c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 117f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 118f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 121c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 122e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 123e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 124e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 125e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 126e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 127e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 128e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 129c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 130c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 131c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 132c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 133c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 134f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 13511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 13611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 13711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 13811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 139f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 140f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed // Idle invalidation is not necessary on command mode panels 1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(atoi(property) != 0) 1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idle_timeout = atoi(property); 1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed //create Idle Invalidator only when not disabled through property 1506bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idle_timeout != -1) 1516bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1536bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed if(idleInvalidator == NULL) { 1546bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 1556bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed __FUNCTION__); 1566bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } else { 1573d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu idleInvalidator->init(timeout_handler, ctx, 1583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu (unsigned int)idle_timeout); 1596bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed } 160c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 16115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 162c6c8b11a6fb2c959bd005a9d03e50a258fafff1fSaurabh Shah if(!qdutils::MDPVersion::getInstance().isSrcSplit() && 163c6c8b11a6fb2c959bd005a9d03e50a258fafff1fSaurabh Shah property_get("persist.mdpcomp.4k2kSplit", property, "0") > 0 && 164c6c8b11a6fb2c959bd005a9d03e50a258fafff1fSaurabh Shah (!strncmp(property, "1", PROPERTY_VALUE_MAX) || 165c6c8b11a6fb2c959bd005a9d03e50a258fafff1fSaurabh Shah !strncasecmp(property,"true", PROPERTY_VALUE_MAX))) { 16615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna sEnable4k2kYUVSplit = true; 16715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 171c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::reset(hwc_context_t *ctx) { 172c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 173699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 174c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mOverlay->clear(mDpy); 175c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ctx->mLayerRotMap[mDpy]->clear(); 176699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah} 177699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 185e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan Locker::Autolock _l(ctx->mDrawLock); 186e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan // Handle timeout event only if the previous composition is MDP or MIXED. 187e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan if(!sHandleTimeout) { 188e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan ALOGD_IF(isDebug(), "%s:Do not handle this timeout", __FUNCTION__); 189e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan return; 190e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan } 191359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 193c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 194c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 195c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 196c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 197359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 198c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 199c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 201f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 204f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 211bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Drop the layer when its already present in FB OR when it lies 212bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * outside frame's ROI */ 213bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) { 214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 215bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 216c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 217c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 218c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 21916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 220c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::setRedraw(hwc_context_t *ctx, 221c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 222c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.needsRedraw = false; 223c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!mCachedFrame.isSameFrame(mCurrentFrame, list) || 224c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 225c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah isSkipPresent(ctx, mDpy)) { 226c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.needsRedraw = true; 227c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 228c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah} 229c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 230f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 23180c2b7d36c8a088e7672aed237966986bf99fa29Jesse Hall memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 234c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 23680c2b7d36c8a088e7672aed237966986bf99fa29Jesse Hall for(int i = 0 ; i < MAX_PIPES_PER_MIXER; i++ ) { 237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 239f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 242c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 243c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 251f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 252ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 2532b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah fbZ = -1; 254f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 255f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 260af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 264af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 265af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 267f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 268f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 269f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 270f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 271f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 27287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&isFBComposed, true, sizeof(isFBComposed)); 27387957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memset(&drop, false, sizeof(drop)); 274f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 275af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 276af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 277af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 278af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 27987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed)); 28087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula memcpy(&drop, &curFrame.drop, sizeof(drop)); 28187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula} 28287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula 283e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaranbool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame, 284e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran hwc_display_contents_1_t* list) { 28587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if(layerCount != curFrame.layerCount) 28687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 28787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula for(int i = 0; i < curFrame.layerCount; i++) { 28887957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula if((curFrame.isFBComposed[i] != isFBComposed[i]) || 28987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula (curFrame.drop[i] != drop[i])) { 29087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return false; 29187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 292ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_layer_1_t const* layer = &list->hwLayers[i]; 293ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if(curFrame.isFBComposed[i] && layerUpdating(layer)){ 294e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran return false; 295e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran } 29687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula } 29787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula return true; 298c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 299c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 300efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) { 301efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 302efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((not isYuvBuffer(hnd) and has90Transform(layer)) or 303efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (not isValidDimension(ctx,layer)) 304efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //More conditions here, SKIP, sRGB+Blend etc 305efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ) { 306efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 307efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 308efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 309efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 310efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 3111b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 3120ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 3130ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3140ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 31508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (layer->flags & HWC_COLOR_FILL) { 31608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // Color layer 31708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return true; 31808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 3190ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 3200ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 32380864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed //XXX: Investigate doing this with pixel phase on MDSS 3248d07dd7a9493c19215acf1e992502d1f51329fe0Naseer Ahmed if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf)) 32580864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return false; 32680864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed 3278f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 32841269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 3290ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 3300ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 3310ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 3320ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 333df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran float w_scale = ((float)crop_w / (float)dst_w); 334df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran float h_scale = ((float)crop_h / (float)dst_h); 3350ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3391b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3401b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3411b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 34294b51da4bc46f846fa2f7f0e36d2730b63ae88e2Saurabh Shah if(qdutils::MDPVersion::getInstance().hasMinCropWidthLimitation() and 34394b51da4bc46f846fa2f7f0e36d2730b63ae88e2Saurabh Shah (crop_w < 5 or crop_h < 5)) 3440ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3450ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 346df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if((w_scale > 1.0f) || (h_scale > 1.0f)) { 347c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM const uint32_t maxMDPDownscale = 34841269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 349df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float w_dscale = w_scale; 350df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float h_dscale = h_scale; 351df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 352bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(ctx->mMDP.version >= qdutils::MDSS_V5) { 353c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM 354bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 355c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM /* On targets that doesnt support Decimation (eg.,8x26) 356c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM * maximum downscale support is overlay pipe downscale. 357c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM */ 358c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM if(crop_w > MAX_DISPLAY_DIM || w_dscale > maxMDPDownscale || 359c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM h_dscale > maxMDPDownscale) 360bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 361bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { 362c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM // Decimation on macrotile format layers is not supported. 363c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM if(isTileRendered(hnd)) { 364c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM /* MDP can read maximum MAX_DISPLAY_DIM width. 365c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM * Bail out if 366c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM * 1. Src crop > MAX_DISPLAY_DIM on nonsplit MDPComp 367c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM * 2. exceeds maximum downscale limit 368c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM */ 369c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM if(((crop_w > MAX_DISPLAY_DIM) && !sSrcSplitEnabled) || 370c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM w_dscale > maxMDPDownscale || 371c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM h_dscale > maxMDPDownscale) { 372c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM return false; 373c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM } 374c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM } else if(w_dscale > 64 || h_dscale > 64) 375bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran return false; 376bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } 377bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran } else { //A-family 378c5d8c2edd27f73d6d61db2e06c99597388c912b2Manoj Kumar AVM if(w_dscale > maxMDPDownscale || h_dscale > maxMDPDownscale) 37941269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 38041269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 38141269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 38241269096daf2363b16dcd89627dd674529a26601Saurabh Shah 383df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if((w_scale < 1.0f) || (h_scale < 1.0f)) { 384df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const uint32_t upscale = 385df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran qdutils::MDPVersion::getInstance().getMaxMDPUpscale(); 386df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float w_uscale = 1.0f / w_scale; 387df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran const float h_uscale = 1.0f / h_scale; 388df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 389df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran if(w_uscale > upscale || h_uscale > upscale) 390df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran return false; 391df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran } 392df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran 3930ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 397af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 398f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 401af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 40256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 403140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mVideoTransFlag && 404140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan isSecondaryConnected(ctx)) { 40556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 40656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 40756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 40856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 409140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } else if(isSecondaryConfiguring(ctx)) { 410c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 412af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 41403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ALOGD_IF(isDebug(), "%s: padding round invoked for dpy %d", 41503514577d0c705056352898f66ed2a8e9b131df8Raj Kamal __FUNCTION__,mDpy); 416af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 417586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 418af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 419f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 420f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 421ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.Rhwc_rect_t MDPComp::calculateDirtyRect(const hwc_layer_1_t* layer, 422ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_rect_t& scissor) { 423ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_region_t surfDamage = layer->surfaceDamage; 424ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_rect_t src = integerizeSourceCrop(layer->sourceCropf); 425ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_rect_t dst = layer->displayFrame; 426ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R int x_off = dst.left - src.left; 427ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R int y_off = dst.top - src.top; 428ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_rect dirtyRect = (hwc_rect){0, 0, 0, 0}; 429ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_rect_t updatingRect = dst; 430ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R 431ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if (surfDamage.numRects == 0) { 432ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R // full layer updating, dirty rect is full frame 433ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R dirtyRect = getIntersection(layer->displayFrame, scissor); 434ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R } else { 435ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R for(uint32_t i = 0; i < surfDamage.numRects; i++) { 436ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R updatingRect = moveRect(surfDamage.rects[i], x_off, y_off); 437ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_rect_t intersect = getIntersection(updatingRect, scissor); 438ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if(isValidRect(intersect)) { 439ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R dirtyRect = getUnion(intersect, dirtyRect); 440ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R } 441ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R } 442ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R } 443ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R 444ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R return dirtyRect; 445ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R} 446ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R 447c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranvoid MDPCompNonSplit::trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect) { 448c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t roi = ctx->listStats[mDpy].lRoi; 449c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran fbRect = getIntersection(fbRect, roi); 450c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran} 451bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 452c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran/* 1) Identify layers that are not visible or lying outside the updating ROI and 453c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * drop them from composition. 454c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * 2) If we have a scaling layer which needs cropping against generated 455c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * ROI, reset ROI to full resolution. */ 456c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranbool MDPCompNonSplit::validateAndApplyROI(hwc_context_t *ctx, 457c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_display_contents_1_t* list) { 458c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 459c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t visibleRect = ctx->listStats[mDpy].lRoi; 460a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 461a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran for(int i = numAppLayers - 1; i >= 0; i--){ 462a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran if(!isValidRect(visibleRect)) { 463a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.drop[i] = true; 464a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran mCurrentFrame.dropCount++; 465f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran continue; 466a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran } 467a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran const hwc_layer_1_t* layer = &list->hwLayers[i]; 469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran hwc_rect_t dstRect = layer->displayFrame; 470a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran hwc_rect_t res = getIntersection(visibleRect, dstRect); 471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!isValidRect(res)) { 473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.drop[i] = true; 474bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount++; 475c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } else { 476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran /* Reset frame ROI when any layer which needs scaling also needs ROI 477bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran * cropping */ 478c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!isSameRect(res, dstRect) && needsScaling (layer)) { 4790938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee ALOGI("%s: Resetting ROI due to scaling", __FUNCTION__); 480bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 481bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount = 0; 482bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 483bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 484a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 485f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran /* deduct any opaque region from visibleRect */ 486f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran if (layer->blending == HWC_BLENDING_NONE) 487f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran visibleRect = deductRect(visibleRect, res); 488f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran } 489bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 490bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return true; 491bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 492bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 493c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran/* Calculate ROI for the frame by accounting all the layer's dispalyFrame which 494c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * are updating. If DirtyRegion is applicable, calculate it by accounting all 495c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * the changing layer's dirtyRegion. */ 496c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranvoid MDPCompNonSplit::generateROI(hwc_context_t *ctx, 497c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_display_contents_1_t* list) { 498c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 499c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!canPartialUpdate(ctx, list)) 500c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return; 501c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 502c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0}; 503c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect fullFrame = (struct hwc_rect) {0, 0,(int)ctx->dpyAttr[mDpy].xres, 504c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran (int)ctx->dpyAttr[mDpy].yres}; 505c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 506c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran for(int index = 0; index < numAppLayers; index++ ) { 507c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 508271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R 509ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if (layerUpdating(layer) || 510c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran isYuvBuffer((private_handle_t *)layer->handle)) { 511271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R hwc_rect_t dirtyRect = getIntersection(layer->displayFrame, 512271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R fullFrame); 513ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if(!needsScaling(layer) && !layer->transform) { 514ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R dirtyRect = calculateDirtyRect(layer, fullFrame); 515c9aaaa729da1a4d56a52101e0ee6f5f84e6fbf52Jeykumar Sankaran } 516c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 517ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R roi = getUnion(roi, dirtyRect); 518c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 519bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 520c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 521c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran /* No layer is updating. Still SF wants a refresh.*/ 522c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!isValidRect(roi)) 523c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return; 524c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 525c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran // Align ROI coordinates to panel restrictions 526c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran roi = getSanitizeROI(roi, fullFrame); 527c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 528c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].lRoi = roi; 529c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!validateAndApplyROI(ctx, list)) 530c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran resetROI(ctx, mDpy); 531c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 532c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__, 533c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].lRoi.left, ctx->listStats[mDpy].lRoi.top, 534c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].lRoi.right, ctx->listStats[mDpy].lRoi.bottom); 535c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran} 536c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 537c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranvoid MDPCompSplit::trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect) { 538c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect l_roi = ctx->listStats[mDpy].lRoi; 539c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect r_roi = ctx->listStats[mDpy].rRoi; 540c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 541c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t l_fbRect = getIntersection(fbRect, l_roi); 542c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t r_fbRect = getIntersection(fbRect, r_roi); 543c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran fbRect = getUnion(l_fbRect, r_fbRect); 544d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran} 545c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran/* 1) Identify layers that are not visible or lying outside BOTH the updating 546c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * ROI's and drop them from composition. If a layer is spanning across both 547c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * the halves of the screen but needed by only ROI, the non-contributing 548c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * half will not be programmed for MDP. 549c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * 2) If we have a scaling layer which needs cropping against generated 550c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * ROI, reset ROI to full resolution. */ 551c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranbool MDPCompSplit::validateAndApplyROI(hwc_context_t *ctx, 552c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_display_contents_1_t* list) { 553bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 554d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 555a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran 556c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t visibleRectL = ctx->listStats[mDpy].lRoi; 557c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t visibleRectR = ctx->listStats[mDpy].rRoi; 558c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 559c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran for(int i = numAppLayers - 1; i >= 0; i--){ 560c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!isValidRect(visibleRectL) && !isValidRect(visibleRectR)) 561c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran { 562c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran mCurrentFrame.drop[i] = true; 563c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran mCurrentFrame.dropCount++; 564c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran continue; 565c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 566c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 567c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran const hwc_layer_1_t* layer = &list->hwLayers[i]; 568c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t dstRect = layer->displayFrame; 569c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 570c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t l_res = getIntersection(visibleRectL, dstRect); 571c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t r_res = getIntersection(visibleRectR, dstRect); 572c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t res = getUnion(l_res, r_res); 573c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 574c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!isValidRect(l_res) && !isValidRect(r_res)) { 575c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran mCurrentFrame.drop[i] = true; 576c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran mCurrentFrame.dropCount++; 577c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } else { 578c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran /* Reset frame ROI when any layer which needs scaling also needs ROI 579c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * cropping */ 580c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!isSameRect(res, dstRect) && needsScaling (layer)) { 581c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 582c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran mCurrentFrame.dropCount = 0; 583c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return false; 584c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 585c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 586c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if (layer->blending == HWC_BLENDING_NONE) { 587c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran visibleRectL = deductRect(visibleRectL, l_res); 588c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran visibleRectR = deductRect(visibleRectR, r_res); 589c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 590c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 591c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 592c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return true; 593c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran} 594c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran/* Calculate ROI for the frame by accounting all the layer's dispalyFrame which 595c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * are updating. If DirtyRegion is applicable, calculate it by accounting all 596c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * the changing layer's dirtyRegion. */ 597c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranvoid MDPCompSplit::generateROI(hwc_context_t *ctx, 598c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_display_contents_1_t* list) { 599c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!canPartialUpdate(ctx, list)) 600bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return; 601bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 602c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 603c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int lSplit = getLeftSplit(ctx, mDpy); 604c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 605c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int hw_h = (int)ctx->dpyAttr[mDpy].yres; 606c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int hw_w = (int)ctx->dpyAttr[mDpy].xres; 607c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 608c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran struct hwc_rect l_frame = (struct hwc_rect){0, 0, lSplit, hw_h}; 609c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran struct hwc_rect r_frame = (struct hwc_rect){lSplit, 0, hw_w, hw_h}; 610c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 611c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran struct hwc_rect l_roi = (struct hwc_rect){0, 0, 0, 0}; 612c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran struct hwc_rect r_roi = (struct hwc_rect){0, 0, 0, 0}; 613c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 614bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran for(int index = 0; index < numAppLayers; index++ ) { 615d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 616ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R private_handle_t *hnd = (private_handle_t *)layer->handle; 617271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R 618ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if (layerUpdating(layer) || isYuvBuffer(hnd)) { 619271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R hwc_rect_t l_dirtyRect = getIntersection(layer->displayFrame, 620271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R l_frame); 621271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R hwc_rect_t r_dirtyRect = getIntersection(layer->displayFrame, 622271d9d58a164a0516533591aeb0b5e9258568350Arun Kumar K.R r_frame); 623c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 624ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if(!needsScaling(layer) && !layer->transform) { 625ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R l_dirtyRect = calculateDirtyRect(layer, l_frame); 626ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R r_dirtyRect = calculateDirtyRect(layer, r_frame); 627ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R } 628ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if(isValidRect(l_dirtyRect)) 629ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R l_roi = getUnion(l_roi, l_dirtyRect); 630c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 631ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if(isValidRect(r_dirtyRect)) 632ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R r_roi = getUnion(r_roi, r_dirtyRect); 633bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 634bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 635bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 636ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran /* For panels that cannot accept commands in both the interfaces, we cannot 637ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran * send two ROI's (for each half). We merge them into single ROI and split 638ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran * them across lSplit for MDP mixer use. The ROI's will be merged again 639ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran * finally before udpating the panel in the driver. */ 640ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran if(qdutils::MDPVersion::getInstance().needsROIMerge()) { 641ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran hwc_rect_t temp_roi = getUnion(l_roi, r_roi); 642ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran l_roi = getIntersection(temp_roi, l_frame); 643ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran r_roi = getIntersection(temp_roi, r_frame); 644ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran } 645ecd6f5d93a833293d2fd651069cc2e0e86acc27dJeykumar Sankaran 646c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran /* No layer is updating. Still SF wants a refresh. */ 647c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!isValidRect(l_roi) && !isValidRect(r_roi)) 648c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return; 649d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran 650c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran l_roi = getSanitizeROI(l_roi, l_frame); 651c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran r_roi = getSanitizeROI(r_roi, r_frame); 652d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran 653c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].lRoi = l_roi; 654c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].rRoi = r_roi; 655bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 656c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!validateAndApplyROI(ctx, list)) 657c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran resetROI(ctx, mDpy); 658bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 659c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: generated L_ROI: [%d, %d, %d, %d]" 660c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran "R_ROI: [%d, %d, %d, %d]", __FUNCTION__, 661c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].lRoi.left, ctx->listStats[mDpy].lRoi.top, 662c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].lRoi.right, ctx->listStats[mDpy].lRoi.bottom, 663c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].rRoi.left, ctx->listStats[mDpy].rRoi.top, 664c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[mDpy].rRoi.right, ctx->listStats[mDpy].rRoi.bottom); 665bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran} 666bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 669c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryFullFrame(hwc_context_t *ctx, 670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 672af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 67369f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R int priDispW = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 6751b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) { 67633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 67733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 67833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 67933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 684c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 685c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 686c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 68769f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R if(mDpy > HWC_DISPLAY_PRIMARY && (priDispW > MAX_DISPLAY_DIM) && 68869f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R (ctx->dpyAttr[mDpy].xres < MAX_DISPLAY_DIM)) { 68969f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // Disable MDP comp on Secondary when the primary is highres panel and 69069f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // the secondary is a normal 1080p, because, MDP comp on secondary under 69169f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // in such usecase, decimation gets used for downscale and there will be 69269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R // a quality mismatch when there will be a fallback to GPU comp 69369f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R ALOGD_IF(isDebug(), "%s: Disable MDP Compositon for Secondary Disp", 69469f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R __FUNCTION__); 69569f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R return false; 69669f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R } 69769f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R 698ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan // check for action safe flag and downscale mode which requires scaling. 699ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan if(ctx->dpyAttr[mDpy].mActionSafePresent 700ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan || ctx->dpyAttr[mDpy].mDownScaleMode) { 701ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan ALOGD_IF(isDebug(), "%s: Scaling needed for this frame",__FUNCTION__); 702ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan return false; 703ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan } 704ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan 705c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 706c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 707c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 708f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 709efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(isYuvBuffer(hnd) && has90Transform(layer)) { 710efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!canUseRotator(ctx, mDpy)) { 711efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d", 712efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__, mDpy); 71386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 71486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 715c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 7162902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 7172902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 7182902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 7192902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 7202902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 7212902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 7222902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 7232902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 724c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 726f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah if(ctx->mAD->isDoable()) { 727f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah return false; 728f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 729f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 734e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 73786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 740af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 741af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 742996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran 743996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran if(sSimulationFlags & MDPCOMP_AVOID_FULL_MDP) 744996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran return false; 745996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran 746efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit presentation / secondary-only layer. 747efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) && 748efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (list->numHwLayers - 1) > MAX_SEC_LAYERS) { 749efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 750efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 751efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 752efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 753efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 754efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 755efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 7561cb4875164427a62fac7dda3d3c94c96a5f0824bJeykumar Sankaran if(not mCurrentFrame.drop[i] and 7571cb4875164427a62fac7dda3d3c94c96a5f0824bJeykumar Sankaran not isSupportedForMDPComp(ctx, layer)) { 758efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__); 759efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 760efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 76184a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu 76284a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //For 8x26, if there is only one layer which needs scale for secondary 76384a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //while no scale for primary display, DMA pipe is occupied by primary. 76484a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //If need to fall back to GLES composition, virtual display lacks DMA 76584a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu //pipe and error is reported. 76684a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu if(qdutils::MDPVersion::getInstance().is8x26() && 76784a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu mDpy >= HWC_DISPLAY_EXTERNAL && 76886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qhwc::needsScaling(layer)) 76984a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu return false; 770efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 771c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 772af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 773bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop, 774bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 775bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount - 776bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount; 777af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 77815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 779f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 78015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 78115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 782c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 783c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 784c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 7858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 7868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 787996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran ALOGD_IF(sSimulationFlags,"%s: FULL_MDP_COMP SUCCEEDED", 788996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran __FUNCTION__); 789af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 790af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 791af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 792af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 793af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 794e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 795e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 796e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 797e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 798e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 79994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah bool ret = false; 800116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah if(list->flags & HWC_GEOMETRY_CHANGED) { //Try load based first 801dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ret = loadBasedComp(ctx, list) or 802116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah cacheBasedComp(ctx, list); 803116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } else { 804116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah ret = cacheBasedComp(ctx, list) or 805dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah loadBasedComp(ctx, list); 80694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 80794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 80894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return ret; 80994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 81094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 81194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::cacheBasedComp(hwc_context_t *ctx, 81294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 813996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran if(sSimulationFlags & MDPCOMP_AVOID_CACHE_MDP) 814996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran return false; 815996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran 81694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 817af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 818af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 819efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 820efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //If an MDP marked layer is unsupported cannot do partial MDP Comp 821efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 822efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 823efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 824efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 825efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Unsupported layer in list", 826efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah __FUNCTION__); 827c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 828efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 829efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 830efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 831efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 832efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 83311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, false /*secure only*/); 83436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula bool ret = markLayersForCaching(ctx, list); //sets up fbZ also 835efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if(!ret) { 836efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy); 837c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 838efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 839efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 840af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 841af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 842efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 84315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(sEnable4k2kYUVSplit){ 844f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah adjustForSourceSplit(ctx, list); 84515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 84615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 847efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah //Will benefit cases where a video has non-updating background. 848efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah if((mDpy > HWC_DISPLAY_PRIMARY) and 849efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah (mdpCount > MAX_SEC_LAYERS)) { 850efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__); 851c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 852efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return false; 853efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 854efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 855c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 856c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 857c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 8588eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 8598eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 860996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran ALOGD_IF(sSimulationFlags,"%s: CACHE_MDP_COMP SUCCEEDED", 861996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran __FUNCTION__); 8628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 863af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 864af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 865af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 866dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shahbool MDPComp::loadBasedComp(hwc_context_t *ctx, 86794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah hwc_display_contents_1_t* list) { 868996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran if(sSimulationFlags & MDPCOMP_AVOID_LOAD_MDP) 869996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran return false; 870996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran 871404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(not isLoadBasedCompDoable(ctx)) { 872116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah return false; 873116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } 874116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 875dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 876dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah const int numNonDroppedLayers = numAppLayers - mCurrentFrame.dropCount; 877dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah const int stagesForMDP = min(sMaxPipesPerMixer, 878dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ctx->mOverlay->availablePipes(mDpy, Overlay::MIXER_DEFAULT)); 879dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah 880dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int mdpBatchSize = stagesForMDP - 1; //1 stage for FB 881dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int fbBatchSize = numNonDroppedLayers - mdpBatchSize; 882dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int lastMDPSupportedIndex = numAppLayers; 883dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int dropCount = 0; 884dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah 885dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Find the minimum MDP batch size 886dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah for(int i = 0; i < numAppLayers;i++) { 887dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(mCurrentFrame.drop[i]) { 888dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah dropCount++; 889e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran continue; 89094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 891dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 892dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(not isSupportedForMDPComp(ctx, layer)) { 893dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah lastMDPSupportedIndex = i; 894dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mdpBatchSize = min(i - dropCount, stagesForMDP - 1); 895dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah fbBatchSize = numNonDroppedLayers - mdpBatchSize; 896dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah break; 89794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 89894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 89994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 900dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s:Before optimizing fbBatch, mdpbatch %d, fbbatch %d " 901dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah "dropped %d", __FUNCTION__, mdpBatchSize, fbBatchSize, 902dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.dropCount); 90315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 904dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Start at a point where the fb batch should at least have 2 layers, for 905dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //this mode to be justified. 906dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah while(fbBatchSize < 2) { 907dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ++fbBatchSize; 908dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah --mdpBatchSize; 90994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 91094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 911dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //If there are no layers for MDP, this mode doesnt make sense. 912dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(mdpBatchSize < 1) { 913dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s: No MDP layers after optimizing for fbBatch", 914dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah __FUNCTION__); 915116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah return false; 916116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah } 917116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 918116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah mCurrentFrame.reset(numAppLayers); 919116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah 920dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Try with successively smaller mdp batch sizes until we succeed or reach 1 921dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah while(mdpBatchSize > 0) { 922dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah //Mark layers for MDP comp 923dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah int mdpBatchLeft = mdpBatchSize; 924dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah for(int i = 0; i < lastMDPSupportedIndex and mdpBatchLeft; i++) { 925dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(mCurrentFrame.drop[i]) { 926dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah continue; 927e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran } 928e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 929dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah --mdpBatchLeft; 93095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 93195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 932dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.fbZ = mdpBatchSize; 933dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.fbCount = fbBatchSize; 934dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.mdpCount = mdpBatchSize; 93595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 936dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s:Trying with: mdpbatch %d fbbatch %d dropped %d", 937dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah __FUNCTION__, mdpBatchSize, fbBatchSize, 938dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah mCurrentFrame.dropCount); 939c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 940dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah if(postHeuristicsHandling(ctx, list)) { 941dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ALOGD_IF(isDebug(), "%s: Postheuristics handling succeeded", 942996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran __FUNCTION__); 943996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran ALOGD_IF(sSimulationFlags,"%s: LOAD_MDP_COMP SUCCEEDED", 944996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran __FUNCTION__); 945dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah return true; 946dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah } 94715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 948c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 949dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah --mdpBatchSize; 950dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah ++fbBatchSize; 95195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah } 95295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 953dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah return false; 95495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah} 95595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah 956404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::isLoadBasedCompDoable(hwc_context_t *ctx) { 9577cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula if(mDpy or isSecurePresent(ctx, mDpy) or 9587cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula isYuvPresent(ctx, mDpy)) { 95994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return false; 96094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah } 96194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return true; 96294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 96394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 964c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranbool MDPComp::canPartialUpdate(hwc_context_t *ctx, 965c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_display_contents_1_t* list){ 966c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!qdutils::MDPVersion::getInstance().isPartialUpdateEnabled() || 967c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran isSkipPresent(ctx, mDpy) || (list->flags & HWC_GEOMETRY_CHANGED) || 968c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran mDpy ) { 969c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return false; 970c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran } 971c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran return true; 972c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran} 973c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 974c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryVideoOnly(hwc_context_t *ctx, 975c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 976c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah const bool secureOnly = true; 977c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return videoOnlyComp(ctx, list, not secureOnly) or 978c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah videoOnlyComp(ctx, list, secureOnly); 979c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah} 980c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 981c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::videoOnlyComp(hwc_context_t *ctx, 98211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah hwc_display_contents_1_t* list, bool secureOnly) { 983996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran if(sSimulationFlags & MDPCOMP_AVOID_VIDEO_ONLY) 984996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran return false; 985af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 986bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 987af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 98822f45504c700b0011b418791c461939c90c34df6Jeykumar Sankaran mCurrentFrame.fbCount -= mCurrentFrame.dropCount; 98911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah updateYUV(ctx, list, secureOnly); 99041269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 991af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 992c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!isYuvPresent(ctx, mDpy) or (mdpCount == 0)) { 993c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 994af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 995af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 996af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 99711c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran /* Bail out if we are processing only secured video layers 99811c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran * and we dont have any */ 99911c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran if(!isSecurePresent(ctx, mDpy) && secureOnly){ 1000c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 100111c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran return false; 100211c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran } 100311c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran 1004c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(mCurrentFrame.fbCount) 1005c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 100641269096daf2363b16dcd89627dd674529a26601Saurabh Shah 1007c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(sEnable4k2kYUVSplit){ 1008c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah adjustForSourceSplit(ctx, list); 1009c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1010c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1011c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!postHeuristicsHandling(ctx, list)) { 1012c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "post heuristic handling failed"); 1013c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 10148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return false; 10158eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah } 10168eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah 1017996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran ALOGD_IF(sSimulationFlags,"%s: VIDEO_ONLY_COMP SUCCEEDED", 1018996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran __FUNCTION__); 1019c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1020c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1021c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1022f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 1023f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 1024c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(isSkipLayer(layer)) { 1025e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1027c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1028c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 102986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) { 103086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__); 103186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar return false; 103286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar } 103386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar 1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 1035f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1038f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 103941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 104041269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 104141269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 104241269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 1043c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 104441269096daf2363b16dcd89627dd674529a26601Saurabh Shah 1045a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed if(layer->planeAlpha < 0xFF) { 1046a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 1047a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed in video only mode", 1048a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed __FUNCTION__); 1049a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed return false; 1050a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed } 1051a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed 1052c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1053c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1054c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 105536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* starts at fromIndex and check for each layer to find 105636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * if it it has overlapping with any Updating layer above it in zorder 105736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * till the end of the batch. returns true if it finds any intersection */ 105836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::canPushBatchToTop(const hwc_display_contents_1_t* list, 105936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex) { 106036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i < toIndex; i++) { 106136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) { 106236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(intersectingUpdatingLayers(list, i+1, toIndex, i)) { 106336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 106436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 106536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 106636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 106736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 106836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 106936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 107036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* Checks if given layer at targetLayerIndex has any 107136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * intersection with all the updating layers in beween 107236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * fromIndex and toIndex. Returns true if it finds intersectiion */ 107336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::intersectingUpdatingLayers(const hwc_display_contents_1_t* list, 107436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fromIndex, int toIndex, int targetLayerIndex) { 107536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula for(int i = fromIndex; i <= toIndex; i++) { 107636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 107736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(areLayersIntersecting(&list->hwLayers[i], 107836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula &list->hwLayers[targetLayerIndex])) { 107936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return true; 108036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 108136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 108236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 108336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return false; 108436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 108536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 108636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulaint MDPComp::getBatch(hwc_display_contents_1_t* list, 108736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchStart, int& maxBatchEnd, 108836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int& maxBatchCount) { 108936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int i = 0; 109036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZOrder =-1; 1091eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran int droppedLayerCt = 0; 109236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while (i < mCurrentFrame.layerCount) { 109336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchCount = 0; 109436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchStart = i; 109536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int batchEnd = i; 1096eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran /* Adjust batch Z order with the dropped layers so far */ 1097eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran int fbZ = batchStart - droppedLayerCt; 109836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int firstZReverseIndex = -1; 109985cc9b8dfc7a50f6e8083b67056f3a25702fbba1Prabhanjan Kandula int updatingLayersAbove = 0;//Updating layer count in middle of batch 110036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula while(i < mCurrentFrame.layerCount) { 110136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i]) { 110236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!batchCount) { 110336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 110436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 110536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 110636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove++; 110736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 110836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 110936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 111036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mCurrentFrame.drop[i]) { 111136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 1112eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran droppedLayerCt++; 111336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 111436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(updatingLayersAbove <= 0) { 111536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 111636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 111736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 111836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 111936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { //Layer is FBComposed, not a drop & updatingLayer > 0 112036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 112136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // We have a valid updating layer already. If layer-i not 112236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // have overlapping with all updating layers in between 112336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // batch-start and i, then we can add layer i to batch. 112436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(!intersectingUpdatingLayers(list, batchStart, i-1, i)) { 112536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 112636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 112736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 112836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 112936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else if(canPushBatchToTop(list, batchStart, i)) { 113036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //If All the non-updating layers with in this batch 113136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //does not have intersection with the updating layers 113236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //above in z-order, then we can safely move the batch to 113336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //higher z-order. Increment fbZ as it is moving up. 113436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if( firstZReverseIndex < 0) { 113536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula firstZReverseIndex = i; 113636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 113736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchCount++; 113836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula batchEnd = i; 113936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ += updatingLayersAbove; 114036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i++; 114136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula updatingLayersAbove = 0; 114236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula continue; 114336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } else { 114436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //both failed.start the loop again from here. 114536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(firstZReverseIndex >= 0) { 114636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula i = firstZReverseIndex; 114736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 114836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula break; 114936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 115036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 115136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 115236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 115336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(batchCount > maxBatchCount) { 115436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchCount = batchCount; 115536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchStart = batchStart; 115636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula maxBatchEnd = batchEnd; 115736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZOrder = fbZ; 115836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 115936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 116036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula return fbZOrder; 116136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula} 116236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula 116336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::markLayersForCaching(hwc_context_t* ctx, 116436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula hwc_display_contents_1_t* list) { 116536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* Idea is to keep as many non-updating(cached) layers in FB and 116636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * send rest of them through MDP. This is done in 2 steps. 116736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 1. Find the maximum contiguous batch of non-updating layers. 116836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * 2. See if we can improve this batch size for caching by adding 116936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * opaque layers around the batch, if they don't have 117036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * any overlapping with the updating layers in between. 117136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * NEVER mark an updating layer for caching. 117236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * But cached ones can be marked for MDP */ 1173f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1174f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 1175bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran int maxBatchEnd = -1; 1176f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 117736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula int fbZ = -1; 1178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 11792b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah /* Nothing is cached. No batching needed */ 11802b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah if(mCurrentFrame.fbCount == 0) { 1181efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1182af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 11832b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah 11842b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah /* No MDP comp layers, try to use other comp modes */ 11852b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah if(mCurrentFrame.mdpCount == 0) { 11862b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah return false; 1187af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1188f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 118936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount); 1190bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran 119136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula /* reset rest of the layers lying inside ROI for MDP comp */ 1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 1193efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 1194bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if((i < maxBatchStart || i > maxBatchEnd) && 119536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.isFBComposed[i]){ 1196bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]){ 1197bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //If an unsupported layer is being attempted to 1198bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran //be pulled out we should fail 1199bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(not isSupportedForMDPComp(ctx, layer)) { 1200bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran return false; 1201bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran } 1202bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 1203efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah } 1204f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1205f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 120736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula // update the frame data 120836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbZ = fbZ; 120936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount = maxBatchCount; 1210af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1211bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 121436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mCurrentFrame.fbCount); 1215efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1216efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah return true; 1217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 121811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 1219f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 1220efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah hwc_display_contents_1_t* list) { 1221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 1222efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah int fbCount = 0; 1223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 1225ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R hwc_layer_1_t * layer = &list->hwLayers[i]; 1226ecf38487b38d1351fe407665ed5a9ffa90392691Arun Kumar K.R if (!layerUpdating(layer)) { 1227bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!mCurrentFrame.drop[i]) 1228bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran fbCount++; 1229f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 1230f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 1231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 1232f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1233c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1235efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah mCurrentFrame.fbCount = fbCount; 1236bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount 1237bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran - mCurrentFrame.dropCount; 1238efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 1239bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d" 1240bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount, 1241bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.dropCount); 1242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1243c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 124411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list, 124511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah bool secureOnly) { 1246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 1247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 1248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 1250f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1251f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 1252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 1253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 1254f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 1255f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1256c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 1257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 125811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 125911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if(!secureOnly || isSecureBuffer(hnd)) { 126011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 126111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mCurrentFrame.fbCount--; 126211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 1263f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1264c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1265f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 1267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 1268bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran mCurrentFrame.fbCount - mCurrentFrame.dropCount; 1269bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__, 1270f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 1271f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 1272f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1273c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranhwc_rect_t MDPComp::getUpdatingFBRect(hwc_context_t *ctx, 1274c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_display_contents_1_t* list){ 1275d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t fbRect = (struct hwc_rect){0, 0, 0, 0}; 1276d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran 1277d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran /* Update only the region of FB needed for composition */ 1278d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++ ) { 1279d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) { 1280d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1281d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 1282d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran fbRect = getUnion(fbRect, dst); 1283d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran } 1284d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran } 1285c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran trimAgainstROI(ctx, fbRect); 1286d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran return fbRect; 1287d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran} 1288d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran 1289c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::postHeuristicsHandling(hwc_context_t *ctx, 1290c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah hwc_display_contents_1_t* list) { 1291c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1292c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Capability checks 12933d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu if(!resourceCheck()) { 1294c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__); 1295c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return false; 1296c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1297c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1298c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //Limitations checks 1299c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(!hwLimitationsCheck(ctx, list)) { 1300c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF(isDebug(), "%s: HW limitations",__FUNCTION__); 1301c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return false; 1302c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } 1303c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1304f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //Configure framebuffer first if applicable 1305f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 1306c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t fbRect = getUpdatingFBRect(ctx, list); 1307d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, fbRect, mCurrentFrame.fbZ)) 1308d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran { 1309f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah ALOGD_IF(isDebug(), "%s configure framebuffer failed", 1310f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah __FUNCTION__); 1311f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah return false; 1312f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1313f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1314f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah 1315c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.map(); 1316c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1317f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 1318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 1319af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1321f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 1323af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 1324f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 1325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1327f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 132836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula //Leave fbZ for framebuffer. CACHE/GLES layers go here. 132936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula if(mdpNextZOrder == mCurrentFrame.fbZ) { 133036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula mdpNextZOrder++; 133136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula } 1332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 1334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 133515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna private_handle_t *hnd = (private_handle_t *)layer->handle; 133615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 133715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(configure4k2kYuv(ctx, layer, 133815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mCurrentFrame.mdpToLayer[mdpIndex]) 133915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna != 0 ){ 134015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(), "%s: Failed to configure split pipes \ 134115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna for layer %d",__FUNCTION__, index); 134215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 134315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 134415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 134515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna mdpNextZOrder++; 134615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 134715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 134815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 1350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 135115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna layer %d",__FUNCTION__, index); 1352af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 1353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1354af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 1355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 13571029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah if(!ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd)) { 13581029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to validate and set overlay for dpy %d" 13591029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ,__FUNCTION__, mDpy); 13601029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah return false; 13611029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah } 13621029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 1363c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah setRedraw(ctx, list); 1364af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 1365af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 1366f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 13673d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusubool MDPComp::resourceCheck() { 136802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah const bool fbUsed = mCurrentFrame.fbCount; 136902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah if(mCurrentFrame.mdpCount > sMaxPipesPerMixer - fbUsed) { 137002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 137102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return false; 137202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah } 137302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah return true; 137402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah} 137502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah 137686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool MDPComp::hwLimitationsCheck(hwc_context_t* ctx, 137786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_display_contents_1_t* list) { 137886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 137986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //A-family hw limitation: 138086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If a layer need alpha scaling, MDP can not support. 138186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(ctx->mMDP.version < qdutils::MDSS_V5) { 138286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 138386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 138486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isAlphaScaled( &list->hwLayers[i])) { 138586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula ALOGD_IF(isDebug(), "%s:frame needs alphaScaling",__FUNCTION__); 138686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 138786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 138886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 138986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 139086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 139186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula // On 8x26 & 8974 hw, we have a limitation of downscaling+blending. 139286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //If multiple layers requires downscaling and also they are overlapping 139386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //fall back to GPU since MDSS can not handle it. 139486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x74v2() || 139586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula qdutils::MDPVersion::getInstance().is8x26()) { 139686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int i = 0; i < mCurrentFrame.layerCount-1; ++i) { 139786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* botLayer = &list->hwLayers[i]; 139886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[i] && 139986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(botLayer)) { 140086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //if layer-i is marked for MDP and needs downscaling 140186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula //check if any MDP layer on top of i & overlaps with layer-i 140286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula for(int j = i+1; j < mCurrentFrame.layerCount; ++j) { 140386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_layer_1_t* topLayer = &list->hwLayers[j]; 140486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(!mCurrentFrame.isFBComposed[j] && 140586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula isDownscaleRequired(topLayer)) { 140686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula hwc_rect_t r = getIntersection(botLayer->displayFrame, 140786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula topLayer->displayFrame); 140886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula if(isValidRect(r)) 140986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return false; 141086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 141186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 141286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 141386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 141486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula } 141586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula return true; 141686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula} 141786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula 1418f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 14198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah int ret = 0; 1420af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 1421996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran char property[PROPERTY_VALUE_MAX]; 1422996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran 1423996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran if(property_get("debug.hwc.simulate", property, NULL) > 0) { 1424996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran int currentFlags = atoi(property); 1425996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran if(currentFlags != sSimulationFlags) { 1426996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran sSimulationFlags = currentFlags; 1427996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran ALOGE("%s: Simulation Flag read: 0x%x (%d)", __FUNCTION__, 1428996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran sSimulationFlags, sSimulationFlags); 1429996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran } 1430996a7bc37b57c2bca351e8b2e3b27a4e3b7390adJeykumar Sankaran } 1431b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 143203514577d0c705056352898f66ed2a8e9b131df8Raj Kamal //Do not cache the information for next draw cycle. 143303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal if(numLayers > MAX_NUM_APP_LAYERS or (!numLayers)) { 143403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ALOGI("%s: Unsupported layer count for mdp composition", 143503514577d0c705056352898f66ed2a8e9b131df8Raj Kamal __FUNCTION__); 1436c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.reset(); 1437c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah return -1; 14381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 143989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 1440c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah //reset old data 1441c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.reset(numLayers); 1442c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1443c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.dropCount = 0; 1444c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1445c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // Detect the start of animation and fall back to GPU only once to cache 1446c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // all the layers in FB and display FB content untill animation completes. 1447c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(ctx->listStats[mDpy].isDisplayAnimating) { 1448c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCurrentFrame.needsRedraw = false; 1449c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan if(ctx->mAnimationState[mDpy] == ANIMATION_STOPPED) { 1450c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCurrentFrame.needsRedraw = true; 1451c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ctx->mAnimationState[mDpy] = ANIMATION_STARTED; 1452c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } 1453c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan setMDPCompLayerFlags(ctx, list); 1454c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan mCachedFrame.updateCounts(mCurrentFrame); 1455c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ret = -1; 1456c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan return ret; 1457c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } else { 1458c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ctx->mAnimationState[mDpy] = ANIMATION_STOPPED; 1459c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan } 1460c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan 14611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Hard conditions, if not met, cannot do MDP comp 1462c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(isFrameDoable(ctx)) { 1463c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah generateROI(ctx, list); 1464c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah 1465c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah if(tryFullFrame(ctx, list) || tryVideoOnly(ctx, list)) { 1466c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah setMDPCompLayerFlags(ctx, list); 1467c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah } else { 1468c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran resetROI(ctx, mDpy); 1469c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah reset(ctx); 1470c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop)); 1471c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCurrentFrame.dropCount = 0; 14728eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 1473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 14741a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } else { 1475c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 1476c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah __FUNCTION__); 14778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah ret = -1; 14781a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah } 1479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 1481c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD("GEOMETRY change: %d", 1482c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED)); 1483f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 1484f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran dump(sDump, ctx); 1485c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah ALOGD("%s",sDump.string()); 1486c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1487c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1488c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 14898eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah return ret; 1490c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1491c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1492404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index) { 149315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 149415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bool bRet = true; 149515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int mdpIndex = mCurrentFrame.layerToMDP[index]; 149615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 149715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.pipeInfo = new MdpYUVPipeInfo; 149815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna info.rot = NULL; 149915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo; 150015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 150115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.lIndex = ovutils::OV_INVALID; 150215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna pipe_info.rIndex = ovutils::OV_INVALID; 150315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1504314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 1505314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_YUV; 1506314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = true; 1507314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 1508314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = false; 1509314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 1510314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.lIndex = ctx->mOverlay->getPipe(pipeSpecs); 151115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.lIndex == ovutils::OV_INVALID){ 151215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 151315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed", 151415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 151515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1516314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.rIndex = ctx->mOverlay->getPipe(pipeSpecs); 151715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(pipe_info.rIndex == ovutils::OV_INVALID){ 151815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna bRet = false; 151915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed", 152015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 152115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 152215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return bRet; 152315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 1524404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R//=============MDPCompNonSplit================================================== 1525c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1526f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompNonSplit::adjustForSourceSplit(hwc_context_t *ctx, 152753528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi hwc_display_contents_1_t* list) { 1528f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //If 4k2k Yuv layer split is possible, and if 1529f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //fbz is above 4k2k layer, increment fb zorder by 1 1530f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //as we split 4k2k layer and increment zorder for right half 1531f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah //of the layer 1532f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 153353528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 153453528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi index++) { 153553528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(!mCurrentFrame.isFBComposed[index]) { 153653528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(mdpNextZOrder == mCurrentFrame.fbZ) { 153753528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mdpNextZOrder++; 153853528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi } 153953528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mdpNextZOrder++; 154053528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi hwc_layer_1_t* layer = &list->hwLayers[index]; 154153528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi private_handle_t *hnd = (private_handle_t *)layer->handle; 154253528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(is4kx2kYuvBuffer(hnd)) { 154353528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(mdpNextZOrder <= mCurrentFrame.fbZ) 154453528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mCurrentFrame.fbZ += 1; 154553528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mdpNextZOrder++; 154653528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi //As we split 4kx2k yuv layer and program to 2 VG pipes 154753528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi //(if available) increase mdpcount by 1. 154853528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mCurrentFrame.mdpCount++; 154953528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi } 1550f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1551f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 1552f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 155315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 155415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 1556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 1557c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 1558f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1560f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& mdp_info = 1561f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo)); 1562327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 1563327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1564327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1565327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 1566327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 1568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 1569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1570f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 1571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 1572c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1574f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx, 157520242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 157620242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 1577c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 157920242a75d65c410071434d639266311376a5b7f6Saurabh Shah 1580c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 1581c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 158215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 1583404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(allocSplitVGPipesfor4k2k(ctx, index)){ 158415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 158515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 158615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 158715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 1589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1590f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoNonSplit; 1591327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 1592f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo; 1593f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 1594314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 1595314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = isYuvBuffer(hnd) ? 1596314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::FORMAT_YUV : Overlay::FORMAT_RGB; 1597314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer) or 1598314840035b55115a39d526cde009c678ccdacf40Saurabh Shah (qdutils::MDPVersion::getInstance().is8x26() and 1599314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres > 1024); 1600314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 1601314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = false; 1602314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 1603314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.index = ctx->mOverlay->getPipe(pipeSpecs); 1604314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 1605c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 1606314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe", __FUNCTION__); 1607c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 1608c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1610c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 1611c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1612c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 161315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompNonSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 161415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 161515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 161615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 161715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 161815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 161915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 162015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 162115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 162215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 162315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 162415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 162515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 162615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1627f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1628c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 1630c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 1631c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 163233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 163333650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 1634c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 1635c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 1636c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 1637c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1638c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1639ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1640ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1641ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1642ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1643ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1644e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan // Set the Handle timeout to true for MDP or MIXED composition. 1645e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) { 1646e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan sHandleTimeout = true; 1647e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan } 16480ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 1650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1651c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1654c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 1655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1656f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1657c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 1658327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1659327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 166008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan if (!(layer->flags & HWC_COLOR_FILL)) { 166108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ALOGE("%s handle null", __FUNCTION__); 166208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return false; 166308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan } 166408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan // No PLAY for Color layer 166508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan layerProp[i].mFlags &= ~HWC_MDPCOMP; 166608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan continue; 1667c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 16680ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 1669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 167115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 167215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 167315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 167415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 167515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 167615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 167715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 167815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 16793d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t offset = (uint32_t)hnd->offset; 168015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 168115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 168215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 168315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 168415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 168515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 168615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 168715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 168815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 168915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 169015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 169115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 169215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 169315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 169415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1695c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 169615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 169715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 169815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 169915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 170015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 170115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 170215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 170315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 170415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 170515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1706327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 170715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 170815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoNonSplit& pipe_info = 170915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 171015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest dest = pipe_info.index; 171115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(dest == ovutils::OV_INVALID) { 171215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 171315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 171415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1715c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 171615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 171715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 171815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1719c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 172015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 172115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, 172215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hnd, dest ); 1723f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 172415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 17253d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t offset = (uint32_t)hnd->offset; 1726327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 172715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 172815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 172915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(!rot->queueBuffer(fd, offset)) 173015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 173115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 173215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 173315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 173415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 173515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, dest)) { 173615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d ", 173715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 173815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 173915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1740c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1741c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1742c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 1743c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1744c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1745c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1746c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1747f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit=================================================== 1748c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1749f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompSplit::adjustForSourceSplit(hwc_context_t *ctx, 175015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_display_contents_1_t* list){ 175115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //if 4kx2k yuv layer is totally present in either in left half 175215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //or right half then try splitting the yuv layer to avoid decimation 175315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 175453528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(mCurrentFrame.fbZ >= 0) { 175553528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 175653528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi index++) { 175753528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(!mCurrentFrame.isFBComposed[index]) { 175853528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(mdpNextZOrder == mCurrentFrame.fbZ) { 175953528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mdpNextZOrder++; 176053528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi } 176153528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mdpNextZOrder++; 176253528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi hwc_layer_1_t* layer = &list->hwLayers[index]; 176353528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi private_handle_t *hnd = (private_handle_t *)layer->handle; 176453528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(is4kx2kYuvBuffer(hnd)) { 176553528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi hwc_rect_t dst = layer->displayFrame; 176653528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if((dst.left > lSplit) || (dst.right < lSplit)) { 176753528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mCurrentFrame.mdpCount += 1; 176853528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi } 176953528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi if(mdpNextZOrder <= mCurrentFrame.fbZ) 177053528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mCurrentFrame.fbZ += 1; 177153528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi mdpNextZOrder++; 177253528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi } 177353528b618604234ca8d7d99eddc3ce3642db808aDileep Kumar Reddi } 1774f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah } 177515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 177615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 177715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1778f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 1779314840035b55115a39d526cde009c678ccdacf40Saurabh Shah MdpPipeInfoSplit& pipe_info) { 1780f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1781314840035b55115a39d526cde009c678ccdacf40Saurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 1782314840035b55115a39d526cde009c678ccdacf40Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1783f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 17841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 17851a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 17861a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1787314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 1788314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = isYuvBuffer(hnd) ? 1789314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::FORMAT_YUV : Overlay::FORMAT_RGB; 1790314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScalingWithSplit(ctx, layer, mDpy); 1791314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 1792314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_LEFT; 1793314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = false; 1794314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 1795c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran // Acquire pipe only for the updating half 1796c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t l_roi = ctx->listStats[mDpy].lRoi; 1797c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t r_roi = ctx->listStats[mDpy].rRoi; 1798c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 1799c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if (dst.left < lSplit && isValidRect(getIntersection(dst, l_roi))) { 1800314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.lIndex = ctx->mOverlay->getPipe(pipeSpecs); 1801f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1802f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 18031a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah } 18041a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1805c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(dst.right > lSplit && isValidRect(getIntersection(dst, r_roi))) { 1806314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_RIGHT; 1807314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.rIndex = ctx->mOverlay->getPipe(pipeSpecs); 18081a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 1809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 18111a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 1812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1813c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1814c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1815f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx, 181620242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 181720242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 181820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 181920242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1820c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 18215a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 18225a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 182315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 182415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 182515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){ 182615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 1827404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R if(allocSplitVGPipesfor4k2k(ctx, index)){ 182815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna continue; 182915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 183015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 183115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 18321bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 18331bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1834f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah info.pipeInfo = new MdpPipeInfoSplit; 18353393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1836f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo; 1837c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1838314840035b55115a39d526cde009c678ccdacf40Saurabh Shah if(!acquireMDPPipes(ctx, layer, pipe_info)) { 1839314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type", 1840314840035b55115a39d526cde009c678ccdacf40Saurabh Shah __FUNCTION__); 184116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 184216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1843c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1844c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1845c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 18461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah 184715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer, 184815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna PipeLayerPair& PipeLayerPair) { 184915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int lSplit = getLeftSplit(ctx, mDpy); 185015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna hwc_rect_t dst = layer->displayFrame; 185115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if((dst.left > lSplit)||(dst.right < lSplit)){ 185215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& mdp_info = 185315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo)); 185415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 185515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eIsFg isFg = IS_FG_OFF; 185615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 185715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest lDest = mdp_info.lIndex; 185815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna eDest rDest = mdp_info.rIndex; 185915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 186015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, 186115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna lDest, rDest, &PipeLayerPair.rot); 186215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 186315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 186415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return configure(ctx, layer, PipeLayerPair); 186515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 186615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 186715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 1868c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1870c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1871f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 18722e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1873f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah MdpPipeInfoSplit& mdp_info = 1874f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 1875327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1876327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1877327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1878327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1879327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1881f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1882f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1883f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1884f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1885f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1886c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1887c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1888f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1889c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1890f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 189116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 189216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1893c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1894c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1895c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1896c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 189716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1898c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1899c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1900ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1901ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1902ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1903ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1904ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 1905e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan // Set the Handle timeout to true for MDP or MIXED composition. 1906e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) { 1907e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan sHandleTimeout = true; 1908e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan } 190916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 191016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1911f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1912c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1913f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1914f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1915c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1916f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1918660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1919327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1920327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1921327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1922327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1923327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 192516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1927c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1928c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1929f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1930f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 193115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit) 193215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna { 193315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpYUVPipeInfo& pipe_info = 193415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 193515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 193615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 193715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 193815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 19393d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t offset = (uint32_t)hnd->offset; 194015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 194115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 194215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 194315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 194415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 194515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 194615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 194715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 194815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 194915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 195015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 195115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 195215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 195315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 195415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 195515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 195615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 195715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 195815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 195915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 196015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 196115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for display:%d", 196215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__, mDpy); 196315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 196415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 196515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 196615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 196715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna else{ 196815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna MdpPipeInfoSplit& pipe_info = 196915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 197015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1971327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 197215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexL = pipe_info.lIndex; 197315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest indexR = pipe_info.rIndex; 1974f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 197515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int fd = hnd->fd; 19763d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu int offset = (uint32_t)hnd->offset; 1977327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 197815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->isModeOn()) { 197915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(ctx->mAD->draw(ctx, fd, offset)) { 1980404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R fd = ctx->mAD->getDstFd(); 1981404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R offset = ctx->mAD->getDstOffset(); 198215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1983f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 1984f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 198515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(rot) { 198615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna rot->queueBuffer(fd, offset); 198715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna fd = rot->getDstMemId(); 198815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna offset = rot->getDstOffset(); 198915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 1990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 199115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play left mixer ********** 199215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexL != ovutils::OV_INVALID) { 199315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destL = (ovutils::eDest)indexL; 199415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 199515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 199615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destL)) { 199715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for left mixer", 199815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 199915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 200015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2002c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 200315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna //************* play right mixer ********** 200415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if(indexR != ovutils::OV_INVALID) { 200515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eDest destR = (ovutils::eDest)indexR; 200615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 200715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 200815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna if (!ov.queueBuffer(fd, offset, destR)) { 200915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ALOGE("%s: queueBuffer failed for right mixer", 201015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna __FUNCTION__); 201115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return false; 201215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna } 2013c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2014c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2015327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 201616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 2017c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 2018327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 201916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 2020c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 20217dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 20227dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah//================MDPCompSrcSplit============================================== 20237dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shahbool MDPCompSrcSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 2024314840035b55115a39d526cde009c678ccdacf40Saurabh Shah MdpPipeInfoSplit& pipe_info) { 20257dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 20267dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t dst = layer->displayFrame; 20277dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 20287dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 20297dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 20307dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 20317dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //If 2 pipes are staged on a single stage of a mixer, then the left pipe 20327dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //should have a higher priority than the right one. Pipe priorities are 20337dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //starting with VG0, VG1 ... , RGB0 ..., DMA1 20347dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 2035314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 2036314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = isYuvBuffer(hnd) ? 2037314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::FORMAT_YUV : Overlay::FORMAT_RGB; 2038314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 2039314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 2040314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = false; 2041314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 20427dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //1 pipe by default for a layer 2043314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.lIndex = ctx->mOverlay->getPipe(pipeSpecs); 20447dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(pipe_info.lIndex == ovutils::OV_INVALID) { 2045314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return false; 20467dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 20477dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 20480eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah /* Use 2 pipes IF 20490eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah a) Layer's crop width is > 2048 or 20500eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah b) Layer's dest width > 2048 or 20510eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah c) On primary, driver has indicated with caps to split always. This is 20520eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah based on an empirically derived value of panel height. Applied only 20530eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah if the layer's width is > mixer's width 20540eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah */ 20550eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah 20560eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah bool primarySplitAlways = (mDpy == HWC_DISPLAY_PRIMARY) and 20570eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah qdutils::MDPVersion::getInstance().isSrcSplitAlways(); 20580eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah int lSplit = getLeftSplit(ctx, mDpy); 20590eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah int dstWidth = dst.right - dst.left; 206094b51da4bc46f846fa2f7f0e36d2730b63ae88e2Saurabh Shah int cropWidth = has90Transform(layer) ? crop.bottom - crop.top : 206194b51da4bc46f846fa2f7f0e36d2730b63ae88e2Saurabh Shah crop.right - crop.left; 20620eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah 20630eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah if(dstWidth > qdutils::MAX_DISPLAY_DIM or 20640eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah cropWidth > qdutils::MAX_DISPLAY_DIM or 20650eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah (primarySplitAlways and (cropWidth > lSplit))) { 2066314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipe_info.rIndex = ctx->mOverlay->getPipe(pipeSpecs); 20677dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) { 2068314840035b55115a39d526cde009c678ccdacf40Saurabh Shah return false; 20697dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 20707dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 2071348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah // Return values 2072348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah // 1 Left pipe is higher priority, do nothing. 2073348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah // 0 Pipes of same priority. 2074348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah //-1 Right pipe is of higher priority, needs swap. 2075348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(ctx->mOverlay->comparePipePriority(pipe_info.lIndex, 2076348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah pipe_info.rIndex) == -1) { 2077348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah qhwc::swap(pipe_info.lIndex, pipe_info.rIndex); 20787dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 20797dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 2080348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 20817dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah return true; 20827dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah} 20837dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 20847dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shahint MDPCompSrcSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 20857dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah PipeLayerPair& PipeLayerPair) { 20867dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 20877dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(!hnd) { 20887dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ALOGE("%s: layer handle is NULL", __FUNCTION__); 20897dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah return -1; 20907dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 20917dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 20927dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah MdpPipeInfoSplit& mdp_info = 20937dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo)); 20947dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah Rotator **rot = &PipeLayerPair.rot; 20957dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah eZorder z = static_cast<eZorder>(mdp_info.zOrder); 20967dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah eIsFg isFg = IS_FG_OFF; 20977dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah eDest lDest = mdp_info.lIndex; 20987dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah eDest rDest = mdp_info.rIndex; 20997dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 21007dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t dst = layer->displayFrame; 21017dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah int transform = layer->transform; 21027dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah eTransform orient = static_cast<eTransform>(transform); 21037dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah const int downscale = 0; 21047dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah int rotFlags = ROT_FLAGS_NONE; 21057dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd)); 21067dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah Whf whf(getWidth(hnd), getHeight(hnd), format, hnd->size); 21077dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21087dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 21097dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah "dest_pipeR: %d",__FUNCTION__, layer, z, lDest, rDest); 21107dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21117dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah // Handle R/B swap 21127dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if (layer->flags & HWC_FORMAT_RB_SWAP) { 21137dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888) 21147dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888); 21157dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888) 21167dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888); 21177dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21187dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 2119e69d2f823985e2111ad652bf5a1a9c75ac34e5ceSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 2120e69d2f823985e2111ad652bf5a1a9c75ac34e5ceSaurabh Shah setMdpFlags(layer, mdpFlags, 0, transform); 21217dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21227dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(lDest != OV_INVALID && rDest != OV_INVALID) { 21237dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //Enable overfetch 2124e69d2f823985e2111ad652bf5a1a9c75ac34e5ceSaurabh Shah setMdpFlags(mdpFlags, OV_MDSS_MDP_DUAL_PIPE); 21257dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21267dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21277dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(isYuvBuffer(hnd) && (transform & HWC_TRANSFORM_ROT_90)) { 21287dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah (*rot) = ctx->mRotMgr->getNext(); 21297dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if((*rot) == NULL) return -1; 21305080cdee5662ba2eab9a058bda428217720dc694Saurabh Shah ctx->mLayerRotMap[mDpy]->add(layer, *rot); 21315af547f7a17efd1f909e18015f3bfdda7abf0f4eSaurabh Shah //If the video is using a single pipe, enable BWC 21325af547f7a17efd1f909e18015f3bfdda7abf0f4eSaurabh Shah if(rDest == OV_INVALID) { 21335af547f7a17efd1f909e18015f3bfdda7abf0f4eSaurabh Shah BwcPM::setBwc(crop, dst, transform, mdpFlags); 21345af547f7a17efd1f909e18015f3bfdda7abf0f4eSaurabh Shah } 21357dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //Configure rotator for pre-rotation 2136e69d2f823985e2111ad652bf5a1a9c75ac34e5ceSaurabh Shah if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) { 21377dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ALOGE("%s: configRotator failed!", __FUNCTION__); 21387dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah return -1; 21397dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21407dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah whf.format = (*rot)->getDstFormat(); 21417dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah updateSource(orient, whf, crop); 21427dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah rotFlags |= ROT_PREROTATED; 21437dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21447dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21457dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //If 2 pipes being used, divide layer into half, crop and dst 21467dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t cropL = crop; 21477dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t cropR = crop; 21487dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t dstL = dst; 21497dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t dstR = dst; 21507dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(lDest != OV_INVALID && rDest != OV_INVALID) { 21517dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah cropL.right = (crop.right + crop.left) / 2; 21527dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah cropR.left = cropL.right; 21537dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah sanitizeSourceCrop(cropL, cropR, hnd); 21547dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21557dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //Swap crops on H flip since 2 pipes are being used 21567dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if((orient & OVERLAY_TRANSFORM_FLIP_H) && (*rot) == NULL) { 21577dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t tmp = cropL; 21587dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah cropL = cropR; 21597dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah cropR = tmp; 21607dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21617dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21627dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah dstL.right = (dst.right + dst.left) / 2; 21637dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah dstR.left = dstL.right; 21647dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21657dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21667dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //For the mdp, since either we are pre-rotating or MDP does flips 21677dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah orient = OVERLAY_TRANSFORM_0; 21687dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah transform = 0; 21697dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21707dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //configure left pipe 21717dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(lDest != OV_INVALID) { 2172e69d2f823985e2111ad652bf5a1a9c75ac34e5ceSaurabh Shah PipeArgs pargL(mdpFlags, whf, z, isFg, 21737dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 21747dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah (ovutils::eBlending) getBlending(layer->blending)); 21757dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21767dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(configMdp(ctx->mOverlay, pargL, orient, 21777dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah cropL, dstL, metadata, lDest) < 0) { 21787dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ALOGE("%s: commit failed for left mixer config", __FUNCTION__); 21797dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah return -1; 21807dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21817dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21827dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21837dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah //configure right pipe 21847dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(rDest != OV_INVALID) { 2185e69d2f823985e2111ad652bf5a1a9c75ac34e5ceSaurabh Shah PipeArgs pargR(mdpFlags, whf, z, isFg, 21867dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah static_cast<eRotFlags>(rotFlags), 21877dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah layer->planeAlpha, 21887dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah (ovutils::eBlending) getBlending(layer->blending)); 21897dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(configMdp(ctx->mOverlay, pargR, orient, 21907dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah cropR, dstR, metadata, rDest) < 0) { 21917dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ALOGE("%s: commit failed for right mixer config", __FUNCTION__); 21927dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah return -1; 21937dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21947dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 21957dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 21967dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah return 0; 21977dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah} 21987dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 2199c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 2200c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2201