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