hwc_mdpcomp.cpp revision 86c677669148a60b5d472fba407c2bfcdc0c05be
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h>
20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
23361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h"
24591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
26699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h"
27f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h"
28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
3011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
35327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
36327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
43e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true;
44bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::sEnablePartialFrameUpdate = false;
45f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
46d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahdouble MDPComp::sMaxBw = 0.0;
470feed9dccc812e37f7e2e58f3fb8246511f831f9Saurabh Shahdouble MDPComp::sBwClaimed = 0.0;
4815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::sEnable4k2kYUVSplit = false;
49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) {
51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    if(isDisplaySplit(ctx, dpy)) {
52f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        return new MDPCompSplit(dpy);
53c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
54f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return new MDPCompNonSplit(dpy);
55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
5616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
57f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
60c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran    if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS)
62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran        return;
63bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran
64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 0) ? "\"PRIMARY\"" :
66361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\"");
67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d "
68efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                "fbCount:%2d \n", mCurrentFrame.layerCount,
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
80bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                     mCurrentFrame.layerToMDP[index],
81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (mCurrentFrame.drop[index] ? "DROP" :
83bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"),
84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
86f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    sEnableMixedMode = true;
106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) &&
107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        sEnableMixedMode = false;
110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
111e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(property_get("persist.hwc.partialupdate.enable", property, NULL) > 0) {
118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL &&
119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran           qdutils::MDPVersion::getInstance().is8x74v2())
120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            sEnablePartialFrameUpdate = true;
121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__,
123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                                    sEnablePartialFrameUpdate);
124bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
125f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
12911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
131f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1326bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed    if(ctx->mMDP.panel != MIPI_CMD_PANEL) {
1336bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        // Idle invalidation is not necessary on command mode panels
1346bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        long idle_timeout = DEFAULT_IDLE_TIME;
1356bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
1366bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            if(atoi(property) != 0)
1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                idle_timeout = atoi(property);
1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        //create Idle Invalidator only when not disabled through property
1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idle_timeout != -1)
1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator = IdleInvalidator::getInstance();
143c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idleInvalidator == NULL) {
1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            ALOGE("%s: failed to instantiate idleInvalidator object",
1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                  __FUNCTION__);
1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        } else {
1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator->init(timeout_handler, ctx, idle_timeout);
1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
15115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
15215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if((property_get("debug.mdpcomp.4k2kSplit", property, "0") > 0) &&
15315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
15415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna             (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
15515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        sEnable4k2kYUVSplit = true;
15615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
158c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
160699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCurrentFrame.reset(numLayers);
162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.cacheAll(list);
163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah}
165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah
166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
174359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
180359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
194bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Drop the layer when its already present in FB OR when it lies
195bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             * outside frame's ROI */
196bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) {
197f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
198bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            }
199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
201c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
20216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
203f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
204af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
205f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
207af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
208af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
214c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
221af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
224ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
228af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
238af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
239f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
24587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memset(&isFBComposed, true, sizeof(isFBComposed));
24687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memset(&drop, false, sizeof(drop));
247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
25987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed));
26087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memcpy(&drop, &curFrame.drop, sizeof(drop));
26187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula}
26287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula
263e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaranbool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame,
264e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran                                      hwc_display_contents_1_t* list) {
26587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    if(layerCount != curFrame.layerCount)
26687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula        return false;
26787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    for(int i = 0; i < curFrame.layerCount; i++) {
26887957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula        if((curFrame.isFBComposed[i] != isFBComposed[i]) ||
26987957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula                (curFrame.drop[i] != drop[i])) {
27087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula            return false;
27187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula        }
272e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran        if(curFrame.isFBComposed[i] &&
273e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran           (hnd[i] != list->hwLayers[i].handle)){
274e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran            return false;
275e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran        }
27687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    }
27787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    return true;
278c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
279c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
280efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) {
281efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
282efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((not isYuvBuffer(hnd) and has90Transform(layer)) or
283efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        (not isValidDimension(ctx,layer))
284efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        //More conditions here, SKIP, sRGB+Blend etc
285efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ) {
286efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
287efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
288efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    return true;
289efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah}
290efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
2911b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
29241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
2930ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
29608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan        if (layer->flags & HWC_COLOR_FILL) {
29708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            // Color layer
29808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            return true;
29908cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan        }
3000ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
3010ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
30480864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed    //XXX: Investigate doing this with pixel phase on MDSS
3058d07dd7a9493c19215acf1e992502d1f51329fe0Naseer Ahmed    if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf))
30680864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed        return false;
30780864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed
308f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
309f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
3100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3118f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah    hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
3130ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
3140ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
3150ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
3160ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
3190ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
321f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
3231b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
3241b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
3251b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3270ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3280ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
329bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran    if((w_dscale > 1.0f) || (h_dscale > 1.0f)) {
330bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran        const uint32_t downscale =
33141269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
332bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran        if(ctx->mMDP.version >= qdutils::MDSS_V5) {
333bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            /* Workaround for downscales larger than 4x.
334bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran             * Will be removed once decimator block is enabled for MDSS
335bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran             */
336bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
337bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
338bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                   h_dscale > downscale)
339bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                    return false;
340bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            } else {
341bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                if(w_dscale > 64 || h_dscale > 64)
342bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                    return false;
343bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            }
344bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran        } else { //A-family
345bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            if(w_dscale > downscale || h_dscale > downscale)
34641269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
34741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
34841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
34941269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3500ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3510ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3520ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type,
3541a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
355c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
356c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
357c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
358c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
3601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer);
361f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
362f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
3661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer);
367f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
368f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
370c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
3761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer);
377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
378f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
381c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
382c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
383c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
385af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
386e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
387f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
390af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
39156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    } else if(qdutils::MDPVersion::getInstance().is8x26() &&
392361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) {
39356d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        //1 Padding round to shift pipes across mixers
39456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
39556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah                __FUNCTION__);
39656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ret = false;
397361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring ||
398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran              ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) {
399c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
401af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
402af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
403586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
404586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
405af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
406586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
407af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
410a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran/*
411a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 1) Identify layers that are not visible in the updating ROI and drop them
412a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * from composition.
413a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 2) If we have a scaling layers which needs cropping against generated ROI.
414a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * Reset ROI to full resolution.
415a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran */
416bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx,
417bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                               hwc_display_contents_1_t* list, hwc_rect_t roi) {
418bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
419bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
420bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!isValidRect(roi))
421bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return false;
422bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
423a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran    hwc_rect_t visibleRect = roi;
424a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
425a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran    for(int i = numAppLayers - 1; i >= 0; i--){
426a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
427a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        if(!isValidRect(visibleRect)) {
428a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran            mCurrentFrame.drop[i] = true;
429a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran            mCurrentFrame.dropCount++;
430a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        }
431a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
432bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        const hwc_layer_1_t* layer =  &list->hwLayers[i];
433bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
434bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        hwc_rect_t dstRect = layer->displayFrame;
435f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R        hwc_rect_t srcRect = integerizeSourceCrop(layer->sourceCropf);
436bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int transform = layer->transform;
437bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
438a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        hwc_rect_t res  = getIntersection(visibleRect, dstRect);
439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int res_w = res.right - res.left;
441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int res_h = res.bottom - res.top;
442bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int dst_w = dstRect.right - dstRect.left;
443bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int dst_h = dstRect.bottom - dstRect.top;
444bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
445bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!isValidRect(res)) {
446bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.drop[i] = true;
447bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.dropCount++;
448bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }else {
449bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Reset frame ROI when any layer which needs scaling also needs ROI
450bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             * cropping */
451bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if((res_w != dst_w || res_h != dst_h) &&
45286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    needsScaling (layer)) {
4530938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee                ALOGI("%s: Resetting ROI due to scaling", __FUNCTION__);
454bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
455bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                mCurrentFrame.dropCount = 0;
456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                return false;
457bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            }
458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }
459a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
460a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        if (layer->blending == HWC_BLENDING_NONE)
461a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran            visibleRect = deductRect(visibleRect, res);
462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    return true;
464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!sEnablePartialFrameUpdate) {
470bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(mDpy || isDisplaySplit(ctx, mDpy)){
474bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        ALOGE_IF(isDebug(), "%s: ROI not supported for"
475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                 "the (1) external / virtual display's (2) dual DSI displays",
476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                 __FUNCTION__);
477bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
478bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
479bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
480a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy))
481a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        return;
482a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
483bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(list->flags & HWC_GEOMETRY_CHANGED)
484bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
485bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
486bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0};
487bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    for(int index = 0; index < numAppLayers; index++ ) {
488bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) ||
489bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) {
490bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            hwc_rect_t dstRect = list->hwLayers[index].displayFrame;
491f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R            hwc_rect_t srcRect = integerizeSourceCrop(
492f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R                                        list->hwLayers[index].sourceCropf);
493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            int transform = list->hwLayers[index].transform;
494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
495bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Intersect against display boundaries */
496bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            roi = getUnion(roi, dstRect);
497bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }
498bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
499bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
500bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!validateAndApplyROI(ctx, list, roi)){
501bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        roi = (struct hwc_rect) {0, 0,
502bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres};
503bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
504bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
505bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.x = roi.left;
506bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.y = roi.top;
507bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.w = roi.right - roi.left;
508bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.h = roi.bottom - roi.top;
509bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
510bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__,
511bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                               roi.left, roi.top, roi.right, roi.bottom);
512bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
513bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
518f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
519af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
5211b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan    if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) {
52233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
52333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
52433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
52533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
530c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
531c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
532c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
533c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
535c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
536f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
537efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(isYuvBuffer(hnd) && has90Transform(layer)) {
538efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            if(!canUseRotator(ctx, mDpy)) {
539efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d",
540efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                        __FUNCTION__, mDpy);
54186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
54286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }
543c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
5442902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula
5452902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp
5462902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        // may not need it if Gfx pre-rotation can handle all flips & rotations
5472902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        if(qdutils::MDPVersion::getInstance().is8x26() &&
5482902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (ctx->dpyAttr[mDpy].xres > 1024) &&
5492902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (layer->transform & HWC_TRANSFORM_FLIP_H) &&
5502902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (!isYuvBuffer(hnd)))
5512902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                   return false;
552c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
554f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    if(ctx->mAD->isDoable()) {
555f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        return false;
556f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    }
557f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
558af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
559af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
560af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
561af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
562e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    } else if(partialMDPComp(ctx, list)) {
563af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
564af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
56586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
56686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    if(!hwLimitationsCheck(ctx, list)) {
56786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        ALOGD_IF(isDebug(), "%s: HW limitations",__FUNCTION__);
56886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        return false;
56986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    }
57086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
571af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
572af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
573af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
574af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
575efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //Will benefit presentation / secondary-only layer.
576efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((mDpy > HWC_DISPLAY_PRIMARY) &&
577efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            (list->numHwLayers - 1) > MAX_SEC_LAYERS) {
578efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__);
579efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
580efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
581efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
582efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
583efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
584efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
585efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(not isSupportedForMDPComp(ctx, layer)) {
586efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__);
587efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            return false;
588efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        }
58984a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu
59084a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //For 8x26, if there is only one layer which needs scale for secondary
59184a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //while no scale for primary display, DMA pipe is occupied by primary.
59284a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //If need to fall back to GLES composition, virtual display lacks DMA
59384a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //pipe and error is reported.
59484a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        if(qdutils::MDPVersion::getInstance().is8x26() &&
59584a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu                                mDpy >= HWC_DISPLAY_EXTERNAL &&
59686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                                qhwc::needsScaling(layer))
59784a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu            return false;
598efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
599af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
601bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop,
602bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran           sizeof(mCurrentFrame.isFBComposed));
603bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount -
604bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        mCurrentFrame.dropCount;
605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
60615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(sEnable4k2kYUVSplit){
60715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        modifymdpCountfor4k2k(ctx, list);
60815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
60915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
61002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(!resourceCheck(ctx, list)) {
61102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__);
6128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
6138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
6148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
615af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
616af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
617af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
618af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
619af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
620e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if(!sEnableMixedMode) {
621e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        //Mixed mode is disabled. No need to even try caching.
622e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        return false;
623e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
624e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
62594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    bool ret = false;
62694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    if(isLoadBasedCompDoable(ctx, list)) {
62795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        ret = loadBasedCompPreferGPU(ctx, list) ||
62895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah                loadBasedCompPreferMDP(ctx, list);
62994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
63094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
63194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    if(!ret) {
63294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        ret = cacheBasedComp(ctx, list);
63394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
63494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
63594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    return ret;
63694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah}
63794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
63894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::cacheBasedComp(hwc_context_t *ctx,
63994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        hwc_display_contents_1_t* list) {
64094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
641af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
642af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
643efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
644efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //If an MDP marked layer is unsupported cannot do partial MDP Comp
645efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
646efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
647efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
648efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            if(not isSupportedForMDPComp(ctx, layer)) {
649efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                ALOGD_IF(isDebug(), "%s: Unsupported layer in list",
650efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                        __FUNCTION__);
651efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                return false;
652efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            }
653efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        }
654efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
655efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
65611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, false /*secure only*/);
65736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    bool ret = markLayersForCaching(ctx, list); //sets up fbZ also
658efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if(!ret) {
659efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy);
660efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
661efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
662af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
663af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
664efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
66515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(sEnable4k2kYUVSplit){
66615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        modifymdpCountfor4k2k(ctx, list);
66715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
66815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
669efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //Will benefit cases where a video has non-updating background.
670efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((mDpy > HWC_DISPLAY_PRIMARY) and
671efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            (mdpCount > MAX_SEC_LAYERS)) {
672efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__);
673efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
674efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
675efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
67602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(!resourceCheck(ctx, list)) {
67702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__);
6788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
6798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
6808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
68495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shahbool MDPComp::loadBasedCompPreferGPU(hwc_context_t *ctx,
68594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        hwc_display_contents_1_t* list) {
68694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
68794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    mCurrentFrame.reset(numAppLayers);
68894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
68995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    int stagesForMDP = min(sMaxPipesPerMixer, ctx->mOverlay->availablePipes(
69095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah            mDpy, Overlay::MIXER_DEFAULT));
69195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //If MDP has X possible stages, it can take X layers.
69295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    const int batchSize = numAppLayers - (stagesForMDP - 1); //1 for FB
69395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
69494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    if(batchSize <= 0) {
69594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        ALOGD_IF(isDebug(), "%s: Not attempting", __FUNCTION__);
69694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        return false;
69794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
69894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
69994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    int minBatchStart = -1;
70094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    size_t minBatchPixelCount = SIZE_MAX;
70194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
70294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    for(int i = 0; i <= numAppLayers - batchSize; i++) {
70394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        uint32_t batchPixelCount = 0;
70494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        for(int j = i; j < i + batchSize; j++) {
70594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[j];
706f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R            hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
70794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            batchPixelCount += (crop.right - crop.left) *
70894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah                    (crop.bottom - crop.top);
70994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        }
71094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
71194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        if(batchPixelCount < minBatchPixelCount) {
71294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            minBatchPixelCount = batchPixelCount;
71394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            minBatchStart = i;
71494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        }
71594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
71694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
71794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    if(minBatchStart < 0) {
71894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        ALOGD_IF(isDebug(), "%s: No batch found batchSize %d numAppLayers %d",
71994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah                __FUNCTION__, batchSize, numAppLayers);
72094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        return false;
72194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
72294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
72394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    for(int i = 0; i < numAppLayers; i++) {
72494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        if(i < minBatchStart || i >= minBatchStart + batchSize) {
72594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
72694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            if(not isSupportedForMDPComp(ctx, layer)) {
72794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah                ALOGD_IF(isDebug(), "%s: MDP unsupported layer found at %d",
72894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah                        __FUNCTION__, i);
72994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah                return false;
73094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            }
73194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            mCurrentFrame.isFBComposed[i] = false;
73294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        }
73394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
73494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
73594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    mCurrentFrame.fbZ = minBatchStart;
73694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    mCurrentFrame.fbCount = batchSize;
73794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - batchSize;
73894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
73915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(sEnable4k2kYUVSplit){
74015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        modifymdpCountfor4k2k(ctx, list);
74115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
74215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
74302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(!resourceCheck(ctx, list)) {
74402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__);
74594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        return false;
74694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
74794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
74894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    ALOGD_IF(isDebug(), "%s: fbZ %d batchSize %d",
74994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah                __FUNCTION__, mCurrentFrame.fbZ, batchSize);
75094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    return true;
75194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah}
75294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
75395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shahbool MDPComp::loadBasedCompPreferMDP(hwc_context_t *ctx,
75495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        hwc_display_contents_1_t* list) {
75595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
75695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //TODO get the ib from sysfs node.
75795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //Full screen is from ib perspective, not actual full screen
75895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    const int bpp = 4;
75995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    double panelRefRate =
76095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah                1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
76195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
76295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    double bwLeft = sMaxBw - sBwClaimed;
76395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
76495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    const int fullScreenLayers = bwLeft * 1000000000 / (ctx->dpyAttr[mDpy].xres
76595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah            * ctx->dpyAttr[mDpy].yres * bpp * panelRefRate);
76695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
76795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    const int fbBatchSize = numAppLayers - (fullScreenLayers - 1);
76895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //If batch size is not at least 2, we aren't really preferring MDP, since
76995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //only 1 layer going to GPU could actually translate into an entire FB
77095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //needed to be fetched by MDP, thus needing more b/w rather than less.
77195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    if(fbBatchSize < 2 || fbBatchSize > numAppLayers) {
77295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        ALOGD_IF(isDebug(), "%s: Not attempting", __FUNCTION__);
77395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        return false;
77495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    }
77595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
77695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //Top-most layers constitute FB batch
77795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    const int fbBatchStart = numAppLayers - fbBatchSize;
77895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
77995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    //Bottom-most layers constitute MDP batch
78095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    for(int i = 0; i < fbBatchStart; i++) {
78195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
78295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        if(not isSupportedForMDPComp(ctx, layer)) {
78395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah            ALOGD_IF(isDebug(), "%s: MDP unsupported layer found at %d",
78495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah                    __FUNCTION__, i);
78595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah            return false;
78695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        }
78795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        mCurrentFrame.isFBComposed[i] = false;
78895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    }
78995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
79095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    mCurrentFrame.fbZ = fbBatchStart;
79195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    mCurrentFrame.fbCount = fbBatchSize;
79295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - fbBatchSize;
79395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
79415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(sEnable4k2kYUVSplit){
79515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        modifymdpCountfor4k2k(ctx, list);
79615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
79715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
79895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    if(!resourceCheck(ctx, list)) {
79995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__);
80095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        return false;
80195a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    }
80295a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
80395a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    ALOGD_IF(isDebug(), "%s: FB Z %d, num app layers %d, MDP Batch Size %d",
80495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah                __FUNCTION__, mCurrentFrame.fbZ, numAppLayers,
80595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah                numAppLayers - fbBatchSize);
80695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
80795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    return true;
80895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah}
80995a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
81094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::isLoadBasedCompDoable(hwc_context_t *ctx,
81194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        hwc_display_contents_1_t* list) {
81294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    if(mDpy or isSecurePresent(ctx, mDpy) or
81394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah            not (list->flags & HWC_GEOMETRY_CHANGED)) {
81494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        return false;
81594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
81694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    return true;
81794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah}
81894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
819af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
82011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list, bool secureOnly) {
821af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
822bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
823af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
82411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, secureOnly);
82541269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
826af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
827af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
828af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
829af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
830af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
83111c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran    /* Bail out if we are processing only secured video layers
83211c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran     * and we dont have any */
83311c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran    if(!isSecurePresent(ctx, mDpy) && secureOnly){
83411c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran        return false;
83511c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran    }
83611c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran
83741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
83841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
83941269096daf2363b16dcd89627dd674529a26601Saurabh Shah
84002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(!resourceCheck(ctx, list)) {
84102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__);
8428eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
8438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
8448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
845c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
846c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
847c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
850e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating;
851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
852e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    if(isSkipLayer(layer) && !extAnimBlockFeature) {
853e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
854f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
85786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) {
85886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
85986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        return false;
86086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    }
86186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar
862f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
865f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
866f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
86741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
86841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
86941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
87041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
87241269096daf2363b16dcd89627dd674529a26601Saurabh Shah
873a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    if(layer->planeAlpha < 0xFF) {
874a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\
875a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 in video only mode",
876a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 __FUNCTION__);
877a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        return false;
878a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    }
879a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed
880c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
882c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
88336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* starts at fromIndex and check for each layer to find
88436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * if it it has overlapping with any Updating layer above it in zorder
88536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * till the end of the batch. returns true if it finds any intersection */
88636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::canPushBatchToTop(const hwc_display_contents_1_t* list,
88736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int fromIndex, int toIndex) {
88836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    for(int i = fromIndex; i < toIndex; i++) {
88936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) {
89036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(intersectingUpdatingLayers(list, i+1, toIndex, i)) {
89136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                return false;
89236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
89336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
89436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    }
89536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    return true;
89636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula}
89736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
89836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* Checks if given layer at targetLayerIndex has any
89936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * intersection with all the updating layers in beween
90036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * fromIndex and toIndex. Returns true if it finds intersectiion */
90136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::intersectingUpdatingLayers(const hwc_display_contents_1_t* list,
90236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int fromIndex, int toIndex, int targetLayerIndex) {
90336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    for(int i = fromIndex; i <= toIndex; i++) {
90436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        if(!mCurrentFrame.isFBComposed[i]) {
90536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(areLayersIntersecting(&list->hwLayers[i],
90636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        &list->hwLayers[targetLayerIndex]))  {
90736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                return true;
90836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
90936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
91036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    }
91136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    return false;
91236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula}
91336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
91436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulaint MDPComp::getBatch(hwc_display_contents_1_t* list,
91536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int& maxBatchStart, int& maxBatchEnd,
91636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int& maxBatchCount) {
91736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int i = 0;
91836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int updatingLayersAbove = 0;//Updating layer count in middle of batch
91936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int fbZOrder =-1;
92036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    while (i < mCurrentFrame.layerCount) {
92136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int batchCount = 0;
92236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int batchStart = i;
92336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int batchEnd = i;
92436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int fbZ = batchStart;
92536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int firstZReverseIndex = -1;
92636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        while(i < mCurrentFrame.layerCount) {
92736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(!mCurrentFrame.isFBComposed[i]) {
92836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                if(!batchCount) {
92936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    i++;
93036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    break;
93136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                }
93236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                updatingLayersAbove++;
93336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                i++;
93436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                continue;
93536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            } else {
93636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                if(mCurrentFrame.drop[i]) {
93736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    i++;
93836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    continue;
93936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                } else if(updatingLayersAbove <= 0) {
94036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    batchCount++;
94136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    batchEnd = i;
94236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    i++;
94336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    continue;
94436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                } else { //Layer is FBComposed, not a drop & updatingLayer > 0
94536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
94636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    // We have a valid updating layer already. If layer-i not
94736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    // have overlapping with all updating layers in between
94836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    // batch-start and i, then we can add layer i to batch.
94936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    if(!intersectingUpdatingLayers(list, batchStart, i-1, i)) {
95036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchCount++;
95136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchEnd = i;
95236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        i++;
95336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        continue;
95436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    } else if(canPushBatchToTop(list, batchStart, i)) {
95536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //If All the non-updating layers with in this batch
95636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //does not have intersection with the updating layers
95736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //above in z-order, then we can safely move the batch to
95836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //higher z-order. Increment fbZ as it is moving up.
95936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        if( firstZReverseIndex < 0) {
96036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                            firstZReverseIndex = i;
96136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        }
96236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchCount++;
96336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchEnd = i;
96436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        fbZ += updatingLayersAbove;
96536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        i++;
96636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        updatingLayersAbove = 0;
96736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        continue;
96836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    } else {
96936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //both failed.start the loop again from here.
97036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        if(firstZReverseIndex >= 0) {
97136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                            i = firstZReverseIndex;
97236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        }
97336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        break;
97436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    }
97536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                }
97636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
97736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
97836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        if(batchCount > maxBatchCount) {
97936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            maxBatchCount = batchCount;
98036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            maxBatchStart = batchStart;
98136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            maxBatchEnd = batchEnd;
98236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            fbZOrder = fbZ;
98336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
98436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    }
98536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    return fbZOrder;
98636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula}
98736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
98836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool  MDPComp::markLayersForCaching(hwc_context_t* ctx,
98936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        hwc_display_contents_1_t* list) {
99036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    /* Idea is to keep as many non-updating(cached) layers in FB and
99136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     * send rest of them through MDP. This is done in 2 steps.
99236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *   1. Find the maximum contiguous batch of non-updating layers.
99336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *   2. See if we can improve this batch size for caching by adding
99436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *      opaque layers around the batch, if they don't have
99536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *      any overlapping with the updating layers in between.
99636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     * NEVER mark an updating layer for caching.
99736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     * But cached ones can be marked for MDP */
998f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
999f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
1000bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int maxBatchEnd = -1;
1001f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
100236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int fbZ = -1;
1003f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1004f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
1005af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
1006af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
1007efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return true;
1008af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
1009af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
1010af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
1011efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return true;
1012af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
1013f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
101436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount);
1015bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
101636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    /* reset rest of the layers lying inside ROI for MDP comp */
1017f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
1018efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
1019bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if((i < maxBatchStart || i > maxBatchEnd) &&
102036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                mCurrentFrame.isFBComposed[i]){
1021bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i]){
1022bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                //If an unsupported layer is being attempted to
1023bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                //be pulled out we should fail
1024bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                if(not isSupportedForMDPComp(ctx, layer)) {
1025bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    return false;
1026bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                }
1027bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                mCurrentFrame.isFBComposed[i] = false;
1028efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            }
1029f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1030f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
103236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    // update the frame data
103336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    mCurrentFrame.fbZ = fbZ;
103436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    mCurrentFrame.fbCount = maxBatchCount;
1035af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
1036bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.fbCount - mCurrentFrame.dropCount;
1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1038f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
103936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            mCurrentFrame.fbCount);
1040efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
1041efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    return true;
1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
104311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
1045efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_display_contents_1_t* list) {
1046f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
1047efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    int fbCount = 0;
1048f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1049f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
1050efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
1052bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i])
1053bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                fbCount++;
1054f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
1055f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
1056af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
1057f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1058c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1059af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
1060efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    mCurrentFrame.fbCount = fbCount;
1061bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount
1062bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                                    - mCurrentFrame.dropCount;
1063efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
1064bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d"
1065bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount,
1066bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.dropCount);
1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
106911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
107011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        bool secureOnly) {
1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
1072a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
1073a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
1074a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
1075a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
1076a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
1077a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
1078a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
1079a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
1080a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
1081f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
1082f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1085f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
1088f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
1089f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1090c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
109211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                private_handle_t *hnd = (private_handle_t *)layer->handle;
109311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(!secureOnly || isSecureBuffer(hnd)) {
109411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.isFBComposed[nYuvIndex] = false;
109511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.fbCount--;
109611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
1097f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1098c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1099f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1100af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
1101af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
1102bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.fbCount - mCurrentFrame.dropCount;
1103bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__,
1104f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
1105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
1106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1107af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
1109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
1110af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
1111f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1112f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1113f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
1114af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
1115f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
1116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
1117f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
1118f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
111936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            //Leave fbZ for framebuffer. CACHE/GLES layers go here.
112036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(mdpNextZOrder == mCurrentFrame.fbZ) {
112136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                mdpNextZOrder++;
112236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
1123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
1125f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
112615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            private_handle_t *hnd = (private_handle_t *)layer->handle;
112715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
112815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(configure4k2kYuv(ctx, layer,
112915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            mCurrentFrame.mdpToLayer[mdpIndex])
113015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        != 0 ){
113115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGD_IF(isDebug(), "%s: Failed to configure split pipes \
113215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            for layer %d",__FUNCTION__, index);
113315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
113415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
113515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                else{
113615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    mdpNextZOrder++;
113715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
113815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                continue;
113915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1140f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
1141f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
114215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        layer %d",__FUNCTION__, index);
1143af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
1144f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1145af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
1146f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1147f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1148af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
1149af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
1150f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
115102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shahbool MDPComp::resourceCheck(hwc_context_t *ctx,
115202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        hwc_display_contents_1_t *list) {
115302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    const bool fbUsed = mCurrentFrame.fbCount;
115402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(mCurrentFrame.mdpCount > sMaxPipesPerMixer - fbUsed) {
115502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
115602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        return false;
115702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    }
115802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah
115902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(!arePipesAvailable(ctx, list)) {
116002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        return false;
116102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    }
116202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah
1163d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    double size = calcMDPBytesRead(ctx, list);
116402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(!bandwidthCheck(ctx, size)) {
116502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
116602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        return false;
116702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    }
116802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah
116902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    return true;
117002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah}
117102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah
1172d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahdouble MDPComp::calcMDPBytesRead(hwc_context_t *ctx,
11738eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_display_contents_1_t* list) {
1174d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    double size = 0;
1175d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    const double GIG = 1000000000.0;
11768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
1177d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    //Skip for targets where no device tree value for bw is supplied
1178d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    if(sMaxBw <= 0.0) {
1179d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah        return 0.0;
1180d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    }
11814b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson
11828eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    for (uint32_t i = 0; i < list->numHwLayers - 1; i++) {
11838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
11848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
11858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
11864b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            if (hnd) {
11878f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah                hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
11883d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah                hwc_rect_t dst = layer->displayFrame;
11894b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson                float bpp = ((float)hnd->size) / (hnd->width * hnd->height);
1190d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                size += (bpp * (crop.right - crop.left) *
1191d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                        (crop.bottom - crop.top) *
1192d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                        ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top)) /
1193d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                        GIG;
11944b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            }
11958eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
11968eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
11978eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
11988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(mCurrentFrame.fbCount) {
11998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1];
1200d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah        int tempw, temph;
1201d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah        size += (getBufferSizeAndDimensions(
1202d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                    layer->displayFrame.right - layer->displayFrame.left,
1203d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                    layer->displayFrame.bottom - layer->displayFrame.top,
1204d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                    HAL_PIXEL_FORMAT_RGBA_8888,
1205d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah                    tempw, temph)) / GIG;
12068eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
12078eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
12088eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return size;
12098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
12108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
1211d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const double& size) {
1212d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    //Skip for targets where no device tree value for bw is supplied
1213d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    if(sMaxBw <= 0.0) {
1214d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah        return true;
1215d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    }
1216d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah
1217d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    double panelRefRate =
1218d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah            1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
1219d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    if((size * panelRefRate) > (sMaxBw - sBwClaimed)) {
1220d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah        return false;
12218eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
12228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return true;
12238eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
12248eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
122586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool MDPComp::hwLimitationsCheck(hwc_context_t* ctx,
122686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        hwc_display_contents_1_t* list) {
122786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
122886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //A-family hw limitation:
122986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //If a layer need alpha scaling, MDP can not support.
123086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    if(ctx->mMDP.version < qdutils::MDSS_V5) {
123186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
123286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            if(!mCurrentFrame.isFBComposed[i] &&
123386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    isAlphaScaled( &list->hwLayers[i])) {
123486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                ALOGD_IF(isDebug(), "%s:frame needs alphaScaling",__FUNCTION__);
123586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                return false;
123686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            }
123786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        }
123886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    }
123986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
124086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    // On 8x26 & 8974 hw, we have a limitation of downscaling+blending.
124186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //If multiple layers requires downscaling and also they are overlapping
124286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //fall back to GPU since MDSS can not handle it.
124386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    if(qdutils::MDPVersion::getInstance().is8x74v2() ||
124486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            qdutils::MDPVersion::getInstance().is8x26()) {
124586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        for(int i = 0; i < mCurrentFrame.layerCount-1; ++i) {
124686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            hwc_layer_1_t* botLayer = &list->hwLayers[i];
124786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            if(!mCurrentFrame.isFBComposed[i] &&
124886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    isDownscaleRequired(botLayer)) {
124986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                //if layer-i is marked for MDP and needs downscaling
125086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                //check if any MDP layer on top of i & overlaps with layer-i
125186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                for(int j = i+1; j < mCurrentFrame.layerCount; ++j) {
125286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    hwc_layer_1_t* topLayer = &list->hwLayers[j];
125386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    if(!mCurrentFrame.isFBComposed[j] &&
125486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                            isDownscaleRequired(topLayer)) {
125586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                        hwc_rect_t r = getIntersection(botLayer->displayFrame,
125686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                                topLayer->displayFrame);
125786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                        if(isValidRect(r))
125886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                            return false;
125986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    }
126086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                }
126186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            }
126286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        }
126386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    }
126486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    return true;
126586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula}
126686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
1267f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
12688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    int ret = 0;
1269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
1270d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    MDPVersion& mdpVersion = qdutils::MDPVersion::getInstance();
1271b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
12721a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //reset old data
12731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCurrentFrame.reset(numLayers);
1274bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
1275bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.dropCount = 0;
1276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
12771a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
12781a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //do not cache the information for next draw cycle.
12791a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(numLayers > MAX_NUM_APP_LAYERS) {
12801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
12810938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee        ALOGI("%s: Number of App layers exceeded the limit ",
128265cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa        __FUNCTION__);
12838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
128465cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa        return ret;
12851a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
128689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
12871a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Hard conditions, if not met, cannot do MDP comp
12881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(!isFrameDoable(ctx)) {
12891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
12901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                __FUNCTION__);
12911a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
12928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
12938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
12941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
1295af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
1296bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    generateROI(ctx, list);
1297bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
1298d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    //Convert from kbps to gbps
1299d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    sMaxBw = mdpVersion.getHighBw() / 1000000.0;
1300d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    if (ctx->mExtDisplay->isConnected() || ctx->mMDP.panel != MIPI_CMD_PANEL) {
1301d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah        sMaxBw = mdpVersion.getLowBw() / 1000000.0;
1302d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    }
1303d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah
13041a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Check whether layers marked for MDP Composition is actually doable.
13051a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(isFullFrameDoable(ctx, list)) {
13061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
13071a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
13081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
130915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //If 4k2k Yuv layer split is possible,  and if
131015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //fbz is above 4k2k layer, increment fb zorder by 1
131115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //as we split 4k2k layer and increment zorder for right half
131215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //of the layer
131315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(sEnable4k2kYUVSplit){
131415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount;
131515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                for(int index = 0; index < n4k2kYuvCount; index++){
131615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    int n4k2kYuvIndex =
131715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            ctx->listStats[mDpy].yuv4k2kIndices[index];
131815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    if(mCurrentFrame.fbZ > n4k2kYuvIndex){
131915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        mCurrentFrame.fbZ += 1;
132015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    }
132115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
132215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
13231a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
1324699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                        mCurrentFrame.fbZ)) {
13251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
1326699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
1327d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
13288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
13298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
133089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
13311a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
13321a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Acquire and Program MDP pipes
13331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programMDP(ctx, list)) {
13341a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            reset(numLayers, list);
1335d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
13368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
13378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
13381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        } else { //Success
13391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            //Any change in composition types needs an FB refresh
13401a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.needsRedraw = false;
1341e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran            if(!mCachedFrame.isSameFrame(mCurrentFrame, list) ||
13421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
134387957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula                     isSkipPresent(ctx, mDpy)) {
13441a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                mCurrentFrame.needsRedraw = true;
1345699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
13461a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
134711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    } else if(isOnlyVideoDoable(ctx, list, false /*secure only*/) ||
134811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            isOnlyVideoDoable(ctx, list, true /*secure only*/)) {
13491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //All layers marked for MDP comp cannot be bypassed.
13501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Try to compose atleast YUV layers through MDP comp and let
13511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //all the RGB layers compose in FB
13521a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Destination over
135315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
135415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(sEnable4k2kYUVSplit){
135515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            modifymdpCountfor4k2k(ctx, list);
135615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
135715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
13581a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.fbZ = -1;
13591a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbCount)
13601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
13611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
13621a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
13631a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
13641a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
13651a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
13661a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
13671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
1368699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
1369d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
13708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
13718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
137289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
13731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
13748beff124c3a101d55afde1aaa7c27bb8afc19df9Saurabh Shah        if(!programMDP(ctx, list)) {
1375699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            reset(numLayers, list);
1376d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
13778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
13788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
1379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
13801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    } else {
13811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
1382a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
1383a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        mCurrentFrame.dropCount = 0;
13848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
13858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
13861a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
13871a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //UpdateLayerFlags
13881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    setMDPCompLayerFlags(ctx, list);
1389bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCachedFrame.cacheAll(list);
13901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
1391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
139289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    // unlock it before calling dump function to avoid deadlock
1393f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
1394af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
1395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
1396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
1397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
1398c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1399c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
14008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit:
1401d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    double panelRefRate =
1402d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah            1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
1403d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    sBwClaimed += calcMDPBytesRead(ctx, list) * panelRefRate;
14048eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return ret;
1405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
140715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::allocSplitVGPipesfor4k2k(hwc_context_t *ctx,
140815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_display_contents_1_t* list, int index) {
140915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
141015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    bool bRet = true;
141115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    hwc_layer_1_t* layer = &list->hwLayers[index];
141215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    private_handle_t *hnd = (private_handle_t *)layer->handle;
141315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    int mdpIndex = mCurrentFrame.layerToMDP[index];
141415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
141515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    info.pipeInfo = new MdpYUVPipeInfo;
141615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    info.rot = NULL;
141715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo;
141815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    ePipeType type =  MDPCOMP_OV_VG;
141915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
142015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.lIndex = ovutils::OV_INVALID;
142115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.rIndex = ovutils::OV_INVALID;
142215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
142315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
142415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(pipe_info.lIndex == ovutils::OV_INVALID){
142515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        bRet = false;
142615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed",
142715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                __FUNCTION__);
142815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
142915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
143015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(pipe_info.rIndex == ovutils::OV_INVALID){
143115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        bRet = false;
143215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed",
143315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                __FUNCTION__);
143415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
143515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    return bRet;
143615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
1437f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompNonSplit===================================================
1438c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
143915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnavoid MDPCompNonSplit::modifymdpCountfor4k2k(hwc_context_t *ctx,
144015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna         hwc_display_contents_1_t* list){
144115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //As we split 4kx2k yuv layer and program to 2 VG pipes
144215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //(if available) increase mdpcount accordingly
144315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    mCurrentFrame.mdpCount += ctx->listStats[mDpy].yuv4k2kCount;
144415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
144515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1446c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
1447c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
1448c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
1449f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
1450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
1451f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoNonSplit& mdp_info =
1452f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo));
1453327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
1454327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1455327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1456327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
1457327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1458f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
1459f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
1460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1461f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
1462f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
1463c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1464c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1465f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx,
14661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
14671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
14681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int numPipesNeeded = mCurrentFrame.mdpCount;
14691a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT);
14701a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
14711a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    //Reserve pipe for FB
14721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(mCurrentFrame.fbCount)
14731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        availPipes -= 1;
14741a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
14751a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(numPipesNeeded > availPipes) {
14761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d",
14771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                __FUNCTION__, mDpy, numPipesNeeded, availPipes);
14781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return false;
14791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
14801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
148111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(not areVGPipesAvailable(ctx, list)) {
148211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
148311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
148411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
148511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    return true;
148611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah}
148711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
148811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx,
148911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list) {
149011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
149111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int pipesNeeded = 0;
149211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
149311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
149411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
149511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_rect_t dst = layer->displayFrame;
149611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
149715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
149815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                pipesNeeded = pipesNeeded + 2;
149915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
150015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            else if(isYuvBuffer(hnd)) {
150111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                pipesNeeded++;
150211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            }
150311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        }
150411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
150511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
150611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
150711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(pipesNeeded > availableVGPipes) {
150811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
150911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                "dpy %d needed %d, avail %d",
151011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
151111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
151211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
151311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
15141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
1515c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
151616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
1517f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx,
151820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
151920242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
1520c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1521f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
152220242a75d65c410071434d639266311376a5b7f6Saurabh Shah
1523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
1524c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
152515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
152615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(allocSplitVGPipesfor4k2k(ctx, list, index)){
152715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                continue;
152815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
152915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
153015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
1532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1533f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoNonSplit;
1534327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
1535f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo;
1536f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1537f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
153820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
153920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
154086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        } else if(!qhwc::needsScaling(layer)
154111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
154211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1543f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
1544f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
1545f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
15461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
1547c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
154820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
154920242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
1550c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
1551c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1552c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1553c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
1554c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
155615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompNonSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
155715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        PipeLayerPair& PipeLayerPair) {
155815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    MdpYUVPipeInfo& mdp_info =
155915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo));
156015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
156115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eIsFg isFg = IS_FG_OFF;
156215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
156315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eDest lDest = mdp_info.lIndex;
156415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eDest rDest = mdp_info.rIndex;
156515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
156615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg,
156715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            lDest, rDest, &PipeLayerPair.rot);
156815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
156915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1570f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1571c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
1573c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
1574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
157533650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
157633650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
1577c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
1578c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
1579c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
1580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1582ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1583ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1584ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1585ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1586ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
1587c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
158833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
1589c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
15900ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1591c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
1592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1593c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1596c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
1597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1599c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
1600327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1601327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
160208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            if (!(layer->flags & HWC_COLOR_FILL)) {
160308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan                ALOGE("%s handle null", __FUNCTION__);
160408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan                return false;
160508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            }
160608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            // No PLAY for Color layer
160708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            layerProp[i].mFlags &= ~HWC_MDPCOMP;
160808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            continue;
1609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
16100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
161315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit)
161415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        {
161515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpYUVPipeInfo& pipe_info =
161615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
161715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
161815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexL = pipe_info.lIndex;
161915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexR = pipe_info.rIndex;
162015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
162115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            uint32_t offset = hnd->offset;
162215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
162315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                rot->queueBuffer(fd, offset);
162415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
162515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
162615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
162715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexL != ovutils::OV_INVALID) {
162815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destL = (ovutils::eDest)indexL;
162915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
163015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
163115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destL)) {
163215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
163315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
163415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
163515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
163615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1637c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
163815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexR != ovutils::OV_INVALID) {
163915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destR = (ovutils::eDest)indexR;
164015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
164115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
164215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destR)) {
164315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
164415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
164515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
164615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
164715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1648327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
164915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        else{
165015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpPipeInfoNonSplit& pipe_info =
165115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
165215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest dest = pipe_info.index;
165315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(dest == ovutils::OV_INVALID) {
165415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
165515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                return false;
165615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1657c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
165815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
165915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                continue;
166015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1661c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
166215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
166315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    using  pipe: %d", __FUNCTION__, layer,
166415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    hnd, dest );
1665f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
166615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
166715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            uint32_t offset = hnd->offset;
1668327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
166915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
167015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
167115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(!rot->queueBuffer(fd, offset))
167215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
167315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
167415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
167515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
167615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
167715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if (!ov.queueBuffer(fd, offset, dest)) {
167815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGE("%s: queueBuffer failed for display:%d ",
167915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        __FUNCTION__, mDpy);
168015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                return false;
168115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1682c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1683c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1684c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1685c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1686c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1687c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1688c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1689f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit===================================================
1690c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
169115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnavoid MDPCompSplit::modifymdpCountfor4k2k(hwc_context_t *ctx,
169215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna         hwc_display_contents_1_t* list){
169315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //if 4kx2k yuv layer is totally present in either in left half
169415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //or right half then try splitting the yuv layer to avoid decimation
169515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount;
169615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    const int lSplit = getLeftSplit(ctx, mDpy);
169715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    for(int index = 0; index < n4k2kYuvCount; index++){
169815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        int n4k2kYuvIndex = ctx->listStats[mDpy].yuv4k2kIndices[index];
169915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_layer_1_t* layer = &list->hwLayers[n4k2kYuvIndex];
170015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_rect_t dst = layer->displayFrame;
170115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
170215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if((dst.left > lSplit)||(dst.right < lSplit)){
170315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            mCurrentFrame.mdpCount += 1;
170415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
170515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
170615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
170715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1708f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx,
17091a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list,
17101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
1711c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
17122e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
17139640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah
17149640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
1717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
1718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
1719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
17201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) {
1721f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
17221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) {
1723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
1724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1726c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1727c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
1728c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1729c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1730f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx,
17311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
17321a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
173301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    int totalPipesNeeded = 0;
17341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
17351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    for(int i = 0; i < Overlay::MIXER_MAX; i++) {
17361a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int numPipesNeeded = pipesNeeded(ctx, list, i);
17371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int availPipes = ov.availablePipes(mDpy, i);
17381a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
17391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        //Reserve pipe(s)for FB
17401a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(mCurrentFrame.fbCount)
174101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah            numPipesNeeded += 1;
17421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
174301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        totalPipesNeeded += numPipesNeeded;
174401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
174501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        //Per mixer check.
17461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(numPipesNeeded > availPipes) {
17471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
17481a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     "dpy %d mixer %d needed %d, avail %d",
17491a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     __FUNCTION__, mDpy, i, numPipesNeeded, availPipes);
17501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            return false;
17511a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        }
17521a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
175301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
175401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    //Per display check, since unused pipes can get counted twice.
175501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    int totalPipesAvailable = ov.availablePipes(mDpy);
175601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    if(totalPipesNeeded > totalPipesAvailable) {
175701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
175801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah                "dpy %d needed %d, avail %d",
175901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah                __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable);
176001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        return false;
176101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    }
176201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
176311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(not areVGPipesAvailable(ctx, list)) {
176411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
176511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
176611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
176711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    return true;
176811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah}
176911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
177011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx,
177111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list) {
177211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
177311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int pipesNeeded = 0;
177411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
177511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
177611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
177711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
177811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_rect_t dst = layer->displayFrame;
177911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
178015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
178115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if((dst.left > lSplit)||(dst.right < lSplit)){
178215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    pipesNeeded = pipesNeeded + 2;
178315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    continue;
178415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
178515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
178611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            if(isYuvBuffer(hnd)) {
178711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(dst.left < lSplit) {
178811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    pipesNeeded++;
178911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
179011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(dst.right > lSplit) {
179111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    pipesNeeded++;
179211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
179311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            }
179411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        }
179511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
179611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
179711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
179811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(pipesNeeded > availableVGPipes) {
179911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
180011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                "dpy %d needed %d, avail %d",
180111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
180211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
180311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
180411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
18051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
18061a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah}
18071a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1808f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
1809f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info,
18102e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        ePipeType type) {
18112e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
18129640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
18151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.lIndex = ovutils::OV_INVALID;
18161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.rIndex = ovutils::OV_INVALID;
18171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
18181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if (dst.left < lSplit) {
18191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT);
1820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
1821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
18221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
18231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
18241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(dst.right > lSplit) {
18251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT);
18261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID)
1827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1828f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
18291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1830f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
1831c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1832c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1833f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx,
183420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
183520242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
183620242a75d65c410071434d639266311376a5b7f6Saurabh Shah
183720242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
1838c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
18395a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
18405a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
184115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_rect_t dst = layer->displayFrame;
184215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        const int lSplit = getLeftSplit(ctx, mDpy);
184315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
184415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if((dst.left > lSplit)||(dst.right < lSplit)){
184515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(allocSplitVGPipesfor4k2k(ctx, list, index)){
184615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    continue;
184715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
184815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
184915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
18501bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
18511bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1852f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoSplit;
18533393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1854f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo;
1855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
185720242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
185820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
185944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan        } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy)
186011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
186120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1862c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
186320242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
1864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
186620242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
186720242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
186816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
186916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1870c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1871c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1872c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
18731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
187415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
187515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        PipeLayerPair& PipeLayerPair) {
187615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    const int lSplit = getLeftSplit(ctx, mDpy);
187715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    hwc_rect_t dst = layer->displayFrame;
187815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if((dst.left > lSplit)||(dst.right < lSplit)){
187915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        MdpYUVPipeInfo& mdp_info =
188015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo));
188115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
188215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eIsFg isFg = IS_FG_OFF;
188315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
188415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eDest lDest = mdp_info.lIndex;
188515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eDest rDest = mdp_info.rIndex;
188615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
188715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg,
188815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                lDest, rDest, &PipeLayerPair.rot);
188915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
189015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    else{
189115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        return configure(ctx, layer, PipeLayerPair);
189215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
189315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
189415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1897c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1898f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
18992e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        PipeLayerPair& PipeLayerPair) {
1900f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoSplit& mdp_info =
1901f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo));
1902327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1903327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1904327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1907f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1908f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1909f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1910f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1911f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1912f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1913c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1914c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1915f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1916c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
191816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
191916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1920c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1921c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1922c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
192416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1925c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1927ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1928ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1929ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1930ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1931ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
193216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
193333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
193416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
193516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
193616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1938c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1941c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1944660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1945327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1946327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1947327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1948327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1949327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1950c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
195116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1952c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1953c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1954c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
195715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit)
195815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        {
195915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpYUVPipeInfo& pipe_info =
196015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
196115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
196215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexL = pipe_info.lIndex;
196315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexR = pipe_info.rIndex;
196415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
196515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            uint32_t offset = hnd->offset;
196615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
196715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                rot->queueBuffer(fd, offset);
196815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
196915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
197015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
197115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexL != ovutils::OV_INVALID) {
197215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destL = (ovutils::eDest)indexL;
197315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
197415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
197515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destL)) {
197615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
197715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
197815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
197915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
198015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
198115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
198215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexR != ovutils::OV_INVALID) {
198315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destR = (ovutils::eDest)indexR;
198415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
198515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
198615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destR)) {
198715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
198815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
198915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
199015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
199115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
199215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
199315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        else{
199415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpPipeInfoSplit& pipe_info =
199515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
199615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1997327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
199815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexL = pipe_info.lIndex;
199915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexR = pipe_info.rIndex;
2000f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
200115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
200215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int offset = hnd->offset;
2003327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
200415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(ctx->mAD->isModeOn()) {
200515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(ctx->mAD->draw(ctx, fd, offset)) {
200615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    fd = ctx->mAD->getDstFd(ctx);
200715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    offset = ctx->mAD->getDstOffset(ctx);
200815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
2009f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            }
2010f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
201115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
201215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                rot->queueBuffer(fd, offset);
201315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
201415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
201515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
2016c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
201715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //************* play left mixer **********
201815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexL != ovutils::OV_INVALID) {
201915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destL = (ovutils::eDest)indexL;
202015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
202115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
202215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destL)) {
202315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for left mixer",
202415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__);
202515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
202615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
2027c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
2028c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
202915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //************* play right mixer **********
203015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexR != ovutils::OV_INVALID) {
203115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destR = (ovutils::eDest)indexR;
203215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
203315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
203415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destR)) {
203515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for right mixer",
203615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__);
203715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
203815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
2039c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
2040c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
2041327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
204216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
2043c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
2044327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
204516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
2046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
2047c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
2048c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2049