hwc_mdpcomp.cpp revision dfe40345210611d4548daa7ba1fc032fac238e97
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h>
20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
23361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h"
24591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
26699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h"
27f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h"
28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
3011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
35327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
36327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
41e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnanbool MDPComp::sHandleTimeout = false;
42c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
4316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
44e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true;
45bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::sEnablePartialFrameUpdate = false;
46f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
4715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnabool MDPComp::sEnable4k2kYUVSplit = false;
48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) {
50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    if(isDisplaySplit(ctx, dpy)) {
51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        return new MDPCompSplit(dpy);
52c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
53f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return new MDPCompNonSplit(dpy);
54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
5516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
56f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran    if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS)
61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran        return;
62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 0) ? "\"PRIMARY\"" :
65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\"");
66efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d "
67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                "fbCount:%2d \n", mCurrentFrame.layerCount,
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
79bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                     mCurrentFrame.layerToMDP[index],
80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
81bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (mCurrentFrame.drop[index] ? "DROP" :
82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"),
83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
99f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
104e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    sEnableMixedMode = true;
105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) &&
106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        sEnableMixedMode = false;
109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
116bc35f9e7e36658230062bdb96f1ea51798c699b7Jeykumar Sankaran    if(property_get("persist.hwc.partialupdate", property, NULL) > 0) {
117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL &&
118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran           qdutils::MDPVersion::getInstance().is8x74v2())
119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            sEnablePartialFrameUpdate = true;
120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__,
122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                                    sEnablePartialFrameUpdate);
123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
12511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
129f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1316bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed    if(ctx->mMDP.panel != MIPI_CMD_PANEL) {
1326bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        // Idle invalidation is not necessary on command mode panels
1336bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        long idle_timeout = DEFAULT_IDLE_TIME;
1346bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
1356bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            if(atoi(property) != 0)
1366bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                idle_timeout = atoi(property);
1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
138c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1396bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        //create Idle Invalidator only when not disabled through property
1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idle_timeout != -1)
1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator = IdleInvalidator::getInstance();
142c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idleInvalidator == NULL) {
1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            ALOGE("%s: failed to instantiate idleInvalidator object",
1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                  __FUNCTION__);
1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        } else {
1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator->init(timeout_handler, ctx, idle_timeout);
1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
149c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
15015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
15115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if((property_get("debug.mdpcomp.4k2kSplit", property, "0") > 0) &&
15215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
15315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna             (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
15415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        sEnable4k2kYUVSplit = true;
15515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
159c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::reset(hwc_context_t *ctx) {
160c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCurrentFrame.reset(numLayers);
162c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    ctx->mOverlay->clear(mDpy);
163c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    ctx->mLayerRotMap[mDpy]->clear();
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    }
173e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    Locker::Autolock _l(ctx->mDrawLock);
174e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    // Handle timeout event only if the previous composition is MDP or MIXED.
175e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    if(!sHandleTimeout) {
176e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan        ALOGD_IF(isDebug(), "%s:Do not handle this timeout", __FUNCTION__);
177e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan        return;
178e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    }
179359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
185359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
187c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
194f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
197f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
198f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
199bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Drop the layer when its already present in FB OR when it lies
200bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             * outside frame's ROI */
201bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) {
202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
203bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            }
204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
206c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
20716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
208c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahvoid MDPComp::setRedraw(hwc_context_t *ctx,
209c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        hwc_display_contents_1_t* list) {
210c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    mCurrentFrame.needsRedraw = false;
211c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!mCachedFrame.isSameFrame(mCurrentFrame, list) ||
212c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            (list->flags & HWC_GEOMETRY_CHANGED) ||
213c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            isSkipPresent(ctx, mDpy)) {
214c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        mCurrentFrame.needsRedraw = true;
215c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    }
216c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah}
217c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
218f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
221c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
229c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
230c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
232f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
235f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
239ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
2402b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah    fbZ = -1;
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
254f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
255f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
256f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
26087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memset(&isFBComposed, true, sizeof(isFBComposed));
26187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memset(&drop, false, sizeof(drop));
262f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
264af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
265af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
270af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
271af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
272af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
273af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
27487957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memcpy(&isFBComposed, &curFrame.isFBComposed, sizeof(isFBComposed));
27587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    memcpy(&drop, &curFrame.drop, sizeof(drop));
27687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula}
27787957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula
278e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaranbool MDPComp::LayerCache::isSameFrame(const FrameInfo& curFrame,
279e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran                                      hwc_display_contents_1_t* list) {
28087957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    if(layerCount != curFrame.layerCount)
28187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula        return false;
28287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    for(int i = 0; i < curFrame.layerCount; i++) {
28387957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula        if((curFrame.isFBComposed[i] != isFBComposed[i]) ||
28487957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula                (curFrame.drop[i] != drop[i])) {
28587957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula            return false;
28687957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula        }
287e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran        if(curFrame.isFBComposed[i] &&
288e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran           (hnd[i] != list->hwLayers[i].handle)){
289e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran            return false;
290e21d2bb081af1c4c05c4a5df0b6306eca09e5f66Jeykumar Sankaran        }
29187957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    }
29287957481f22edffdc0b865189807380d75579a12Prabhanjan Kandula    return true;
293c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
294c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
295efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) {
296efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
297efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((not isYuvBuffer(hnd) and has90Transform(layer)) or
298efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        (not isValidDimension(ctx,layer))
299efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        //More conditions here, SKIP, sRGB+Blend etc
300efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ) {
301efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
302efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
303efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    return true;
304efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah}
305efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
3061b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
3070ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
3080ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3090ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
31008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan        if (layer->flags & HWC_COLOR_FILL) {
31108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            // Color layer
31208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            return true;
31308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan        }
3140ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
3150ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3160ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
3170ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
31880864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed    //XXX: Investigate doing this with pixel phase on MDSS
3198d07dd7a9493c19215acf1e992502d1f51329fe0Naseer Ahmed    if(!isSecureBuffer(hnd) && isNonIntegralSourceCrop(layer->sourceCropf))
32080864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed        return false;
32180864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed
3228f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah    hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
32341269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
3240ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
3250ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
3260ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
3270ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
328df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran    float w_scale = ((float)crop_w / (float)dst_w);
329df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran    float h_scale = ((float)crop_h / (float)dst_h);
3300ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
3341b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
3351b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
3361b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3380ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3390ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
340df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran    if((w_scale > 1.0f) || (h_scale > 1.0f)) {
341bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran        const uint32_t downscale =
34241269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
343df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran        const float w_dscale = w_scale;
344df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran        const float h_dscale = h_scale;
345df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran
346bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran        if(ctx->mMDP.version >= qdutils::MDSS_V5) {
347bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            /* Workaround for downscales larger than 4x.
348bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran             * Will be removed once decimator block is enabled for MDSS
349bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran             */
350bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
351bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
352bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                   h_dscale > downscale)
353bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                    return false;
354bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            } else {
355bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                if(w_dscale > 64 || h_dscale > 64)
356bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran                    return false;
357bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            }
358bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran        } else { //A-family
359bec4a8e65d5af78b14adebcec3d9582dc229e6f2Jeykumar Sankaran            if(w_dscale > downscale || h_dscale > downscale)
36041269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
36141269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
36241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
36341269096daf2363b16dcd89627dd674529a26601Saurabh Shah
364df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran    if((w_scale < 1.0f) || (h_scale < 1.0f)) {
365df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran        const uint32_t upscale =
366df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran            qdutils::MDPVersion::getInstance().getMaxMDPUpscale();
367df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran        const float w_uscale = 1.0f / w_scale;
368df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran        const float h_uscale = 1.0f / h_scale;
369df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran
370df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran        if(w_uscale > upscale || h_uscale > upscale)
371df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran            return false;
372df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran    }
373df991ce9e82b63e27859a4c534df4c6c9af2c915Jeykumar Sankaran
3740ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3750ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type,
3781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
379c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
381c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
382c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
3841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer);
385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
3901a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer);
391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
392f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
393f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
4001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer);
401f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
402f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
403f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
409af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
410f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
412f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
41456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    } else if(qdutils::MDPVersion::getInstance().is8x26() &&
415140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            ctx->mVideoTransFlag &&
416140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            isSecondaryConnected(ctx)) {
41756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        //1 Padding round to shift pipes across mixers
41856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
41956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah                __FUNCTION__);
42056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ret = false;
421140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan    } else if(isSecondaryConfiguring(ctx)) {
422c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
423f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
42603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal        ALOGD_IF(isDebug(), "%s: padding round invoked for dpy %d",
42703514577d0c705056352898f66ed2a8e9b131df8Raj Kamal                 __FUNCTION__,mDpy);
428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
429586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
431f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
432f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
433a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran/*
434a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 1) Identify layers that are not visible in the updating ROI and drop them
435a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * from composition.
436a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * 2) If we have a scaling layers which needs cropping against generated ROI.
437a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran * Reset ROI to full resolution.
438a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran */
439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx,
440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                               hwc_display_contents_1_t* list, hwc_rect_t roi) {
441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
442bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
443bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!isValidRect(roi))
444bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return false;
445bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
446a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran    hwc_rect_t visibleRect = roi;
447a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
448a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran    for(int i = numAppLayers - 1; i >= 0; i--){
449a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
450a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        if(!isValidRect(visibleRect)) {
451a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran            mCurrentFrame.drop[i] = true;
452a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran            mCurrentFrame.dropCount++;
453f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran            continue;
454a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        }
455a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        const hwc_layer_1_t* layer =  &list->hwLayers[i];
457bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        hwc_rect_t dstRect = layer->displayFrame;
459f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R        hwc_rect_t srcRect = integerizeSourceCrop(layer->sourceCropf);
460bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
461a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        hwc_rect_t res  = getIntersection(visibleRect, dstRect);
462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int res_w = res.right - res.left;
464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int res_h = res.bottom - res.top;
465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int dst_w = dstRect.right - dstRect.left;
466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int dst_h = dstRect.bottom - dstRect.top;
467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!isValidRect(res)) {
469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.drop[i] = true;
470bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.dropCount++;
471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }else {
472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Reset frame ROI when any layer which needs scaling also needs ROI
473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             * cropping */
474f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran            if((res_w != dst_w || res_h != dst_h) && needsScaling (layer)) {
4750938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee                ALOGI("%s: Resetting ROI due to scaling", __FUNCTION__);
476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
477bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                mCurrentFrame.dropCount = 0;
478bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                return false;
479bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            }
480a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
481f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran            /* deduct any opaque region from visibleRect */
482f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran            if (layer->blending == HWC_BLENDING_NONE)
483f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran                visibleRect = deductRect(visibleRect, res);
484f74196ba20c5e3e9525cb10b6f51712e07ca107eJeykumar Sankaran        }
485bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
486bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    return true;
487bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
488bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
489bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
490bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
491bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
492bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!sEnablePartialFrameUpdate) {
493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
495bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
496bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(mDpy || isDisplaySplit(ctx, mDpy)){
497bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        ALOGE_IF(isDebug(), "%s: ROI not supported for"
498bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                 "the (1) external / virtual display's (2) dual DSI displays",
499bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                 __FUNCTION__);
500bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
501bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
502bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
503a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy))
504a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran        return;
505a0179fa554ea9d26d74bdb55bb95796c08d76b44Jeykumar Sankaran
506bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(list->flags & HWC_GEOMETRY_CHANGED)
507bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
508bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
509bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0};
510bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    for(int index = 0; index < numAppLayers; index++ ) {
511bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) ||
512bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) {
513bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            hwc_rect_t dstRect = list->hwLayers[index].displayFrame;
514f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R            hwc_rect_t srcRect = integerizeSourceCrop(
515f44bcdd642866a7763d09d568b0f91dd0949bc5bArun Kumar K.R                                        list->hwLayers[index].sourceCropf);
516bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
517bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Intersect against display boundaries */
518bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            roi = getUnion(roi, dstRect);
519bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }
520bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
521bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
522bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!validateAndApplyROI(ctx, list, roi)){
523bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        roi = (struct hwc_rect) {0, 0,
524bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres};
525bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
526bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
527bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.x = roi.left;
528bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.y = roi.top;
529bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.w = roi.right - roi.left;
530bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.h = roi.bottom - roi.top;
531bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
532bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__,
533bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                               roi.left, roi.top, roi.right, roi.bottom);
534bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
535bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
538c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryFullFrame(hwc_context_t *ctx,
539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
54269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R    int priDispW = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
5441b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan    if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) {
54533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
54633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
54733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
54833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
553c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
554c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
555c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
55669f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R    if(mDpy > HWC_DISPLAY_PRIMARY && (priDispW > MAX_DISPLAY_DIM) &&
55769f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R                              (ctx->dpyAttr[mDpy].xres < MAX_DISPLAY_DIM)) {
55869f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R        // Disable MDP comp on Secondary when the primary is highres panel and
55969f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R        // the secondary is a normal 1080p, because, MDP comp on secondary under
56069f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R        // in such usecase, decimation gets used for downscale and there will be
56169f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R        // a quality mismatch when there will be a fallback to GPU comp
56269f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R        ALOGD_IF(isDebug(), "%s: Disable MDP Compositon for Secondary Disp",
56369f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R              __FUNCTION__);
56469f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R        return false;
56569f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R    }
56669f90bdd131ca3c1daef99872aaf435fc2ef6e95Arun Kumar K.R
567ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan    // check for action safe flag and downscale mode which requires scaling.
568ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan    if(ctx->dpyAttr[mDpy].mActionSafePresent
569ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan            || ctx->dpyAttr[mDpy].mDownScaleMode) {
570ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan        ALOGD_IF(isDebug(), "%s: Scaling needed for this frame",__FUNCTION__);
571ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan        return false;
572ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan    }
573ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan
574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
575c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
576c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
577f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
578efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(isYuvBuffer(hnd) && has90Transform(layer)) {
579efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            if(!canUseRotator(ctx, mDpy)) {
580efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d",
581efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                        __FUNCTION__, mDpy);
58286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
58386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }
584c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
5852902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula
5862902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp
5872902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        // may not need it if Gfx pre-rotation can handle all flips & rotations
5882902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        if(qdutils::MDPVersion::getInstance().is8x26() &&
5892902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (ctx->dpyAttr[mDpy].xres > 1024) &&
5902902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (layer->transform & HWC_TRANSFORM_FLIP_H) &&
5912902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (!isYuvBuffer(hnd)))
5922902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                   return false;
593c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
594af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
595f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    if(ctx->mAD->isDoable()) {
596f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        return false;
597f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    }
598f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
599af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
601af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
602af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
603e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    } else if(partialMDPComp(ctx, list)) {
604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
60686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
607af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
608af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
609af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
610af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
611efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //Will benefit presentation / secondary-only layer.
612efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((mDpy > HWC_DISPLAY_PRIMARY) &&
613efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            (list->numHwLayers - 1) > MAX_SEC_LAYERS) {
614efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__);
615efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
616efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
617efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
618efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
619efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
620efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
621efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(not isSupportedForMDPComp(ctx, layer)) {
622efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__);
623efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            return false;
624efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        }
62584a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu
62684a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //For 8x26, if there is only one layer which needs scale for secondary
62784a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //while no scale for primary display, DMA pipe is occupied by primary.
62884a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //If need to fall back to GLES composition, virtual display lacks DMA
62984a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        //pipe and error is reported.
63084a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu        if(qdutils::MDPVersion::getInstance().is8x26() &&
63184a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu                                mDpy >= HWC_DISPLAY_EXTERNAL &&
63286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                                qhwc::needsScaling(layer))
63384a958f6e82e8817c4a868b7e1d7c044ebbd8e74Yang Xu            return false;
634efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
635c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
637bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop,
638bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran           sizeof(mCurrentFrame.isFBComposed));
639bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount -
640bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        mCurrentFrame.dropCount;
641af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
64215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(sEnable4k2kYUVSplit){
643f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        adjustForSourceSplit(ctx, list);
64415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
64515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
646c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!postHeuristicsHandling(ctx, list)) {
647c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD_IF(isDebug(), "post heuristic handling failed");
648c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
6498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
6508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
6518eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
652af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
653af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
654af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
655af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
657e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if(!sEnableMixedMode) {
658e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        //Mixed mode is disabled. No need to even try caching.
659e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        return false;
660e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
661e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
66294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    bool ret = false;
663116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah    if(list->flags & HWC_GEOMETRY_CHANGED) { //Try load based first
664dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        ret =   loadBasedComp(ctx, list) or
665116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah                cacheBasedComp(ctx, list);
666116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah    } else {
667116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah        ret =   cacheBasedComp(ctx, list) or
668dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah                loadBasedComp(ctx, list);
66994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
67094f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
67194f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    return ret;
67294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah}
67394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
67494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahbool MDPComp::cacheBasedComp(hwc_context_t *ctx,
67594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        hwc_display_contents_1_t* list) {
67694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
677af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
678af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
679efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
680efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //If an MDP marked layer is unsupported cannot do partial MDP Comp
681efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
682efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
683efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
684efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            if(not isSupportedForMDPComp(ctx, layer)) {
685efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                ALOGD_IF(isDebug(), "%s: Unsupported layer in list",
686efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                        __FUNCTION__);
687c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah                reset(ctx);
688efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                return false;
689efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            }
690efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        }
691efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
692efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
69311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, false /*secure only*/);
69436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    bool ret = markLayersForCaching(ctx, list); //sets up fbZ also
695efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if(!ret) {
696efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy);
697c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
698efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
699efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
702efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
70315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(sEnable4k2kYUVSplit){
704f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        adjustForSourceSplit(ctx, list);
70515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
70615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
707efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //Will benefit cases where a video has non-updating background.
708efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((mDpy > HWC_DISPLAY_PRIMARY) and
709efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            (mdpCount > MAX_SEC_LAYERS)) {
710efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__);
711c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
712efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
713efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
714efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
715c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!postHeuristicsHandling(ctx, list)) {
716c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD_IF(isDebug(), "post heuristic handling failed");
717c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
7188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
7198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
7208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
724dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shahbool MDPComp::loadBasedComp(hwc_context_t *ctx,
72594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        hwc_display_contents_1_t* list) {
726404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R    if(not isLoadBasedCompDoable(ctx)) {
727116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah        return false;
728116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah    }
729116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah
730dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
731dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    const int numNonDroppedLayers = numAppLayers - mCurrentFrame.dropCount;
732dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    const int stagesForMDP = min(sMaxPipesPerMixer,
733dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            ctx->mOverlay->availablePipes(mDpy, Overlay::MIXER_DEFAULT));
734dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah
735dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    int mdpBatchSize = stagesForMDP - 1; //1 stage for FB
736dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    int fbBatchSize = numNonDroppedLayers - mdpBatchSize;
737dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    int lastMDPSupportedIndex = numAppLayers;
738dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    int dropCount = 0;
739dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah
740dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    //Find the minimum MDP batch size
741dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    for(int i = 0; i < numAppLayers;i++) {
742dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        if(mCurrentFrame.drop[i]) {
743dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            dropCount++;
744e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran            continue;
74594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        }
746dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
747dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        if(not isSupportedForMDPComp(ctx, layer)) {
748dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            lastMDPSupportedIndex = i;
749dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            mdpBatchSize = min(i - dropCount, stagesForMDP - 1);
750dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            fbBatchSize = numNonDroppedLayers - mdpBatchSize;
751dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            break;
75294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        }
75394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
75494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
755dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    ALOGD_IF(isDebug(), "%s:Before optimizing fbBatch, mdpbatch %d, fbbatch %d "
756dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            "dropped %d", __FUNCTION__, mdpBatchSize, fbBatchSize,
757dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            mCurrentFrame.dropCount);
75815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
759dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    //Start at a point where the fb batch should at least have 2 layers, for
760dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    //this mode to be justified.
761dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    while(fbBatchSize < 2) {
762dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        ++fbBatchSize;
763dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        --mdpBatchSize;
76494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
76594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
766dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    //If there are no layers for MDP, this mode doesnt make sense.
767dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    if(mdpBatchSize < 1) {
768dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        ALOGD_IF(isDebug(), "%s: No MDP layers after optimizing for fbBatch",
769dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah                __FUNCTION__);
770116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah        return false;
771116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah    }
772116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah
773116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah    mCurrentFrame.reset(numAppLayers);
774116df906200ccbdd0933d2cabc8ac8f0d65fa1baSaurabh Shah
775dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    //Try with successively smaller mdp batch sizes until we succeed or reach 1
776dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    while(mdpBatchSize > 0) {
777dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        //Mark layers for MDP comp
778dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        int mdpBatchLeft = mdpBatchSize;
779dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        for(int i = 0; i < lastMDPSupportedIndex and mdpBatchLeft; i++) {
780dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            if(mCurrentFrame.drop[i]) {
781dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah                continue;
782e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran            }
783e4ce4d8657dc2e8fd70600b0dc1010aa798c7305Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
784dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            --mdpBatchLeft;
78595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah        }
78695a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
787dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        mCurrentFrame.fbZ = mdpBatchSize;
788dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        mCurrentFrame.fbCount = fbBatchSize;
789dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        mCurrentFrame.mdpCount = mdpBatchSize;
79095a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
791dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        ALOGD_IF(isDebug(), "%s:Trying with: mdpbatch %d fbbatch %d dropped %d",
792dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah                __FUNCTION__, mdpBatchSize, fbBatchSize,
793dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah                mCurrentFrame.dropCount);
794c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
795dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        if(postHeuristicsHandling(ctx, list)) {
796dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            ALOGD_IF(isDebug(), "%s: Postheuristics handling succeeded",
797dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah                    __FUNCTION__);
798dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah            return true;
799dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        }
80015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
801c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
802dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        --mdpBatchSize;
803dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah        ++fbBatchSize;
80495a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah    }
80595a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
806dfe40345210611d4548daa7ba1fc032fac238e97Saurabh Shah    return false;
80795a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah}
80895a0158274f4239439e0dde307994a53fb12a8b5Saurabh Shah
809404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::isLoadBasedCompDoable(hwc_context_t *ctx) {
8107cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula    if(mDpy or isSecurePresent(ctx, mDpy) or
8117cd2a020040a3e81fdd88c376169fd78b5417efdPrabhanjan Kandula            isYuvPresent(ctx, mDpy)) {
81294f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah        return false;
81394f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    }
81494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah    return true;
81594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah}
81694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah
817c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::tryVideoOnly(hwc_context_t *ctx,
818c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        hwc_display_contents_1_t* list) {
819c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    const bool secureOnly = true;
820c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    return videoOnlyComp(ctx, list, not secureOnly) or
821c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            videoOnlyComp(ctx, list, secureOnly);
822c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah}
823c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
824c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::videoOnlyComp(hwc_context_t *ctx,
82511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list, bool secureOnly) {
826af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
827bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
828af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
82911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, secureOnly);
83041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
831af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
832c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!isYuvPresent(ctx, mDpy) or (mdpCount == 0)) {
833c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
834af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
835af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
836af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
83711c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran    /* Bail out if we are processing only secured video layers
83811c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran     * and we dont have any */
83911c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran    if(!isSecurePresent(ctx, mDpy) && secureOnly){
840c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
84111c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran        return false;
84211c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran    }
84311c3d6d70c9b3e1f9a9245573d682d009fe05744Jeykumar Sankaran
844c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(mCurrentFrame.fbCount)
845c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
84641269096daf2363b16dcd89627dd674529a26601Saurabh Shah
847c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(sEnable4k2kYUVSplit){
848c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        adjustForSourceSplit(ctx, list);
849c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    }
850c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
851c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!postHeuristicsHandling(ctx, list)) {
852c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD_IF(isDebug(), "post heuristic handling failed");
853c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        reset(ctx);
8548eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
8558eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
8568eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
859c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
860f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
861f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
862c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan    if(isSkipLayer(layer)) {
863e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
866c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
86786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) {
86886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
86986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        return false;
87086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    }
87186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar
872f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
873f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
875f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
876f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
87741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
87841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
87941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
88041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
88241269096daf2363b16dcd89627dd674529a26601Saurabh Shah
883a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    if(layer->planeAlpha < 0xFF) {
884a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\
885a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 in video only mode",
886a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 __FUNCTION__);
887a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        return false;
888a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    }
889a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
891c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
89336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* starts at fromIndex and check for each layer to find
89436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * if it it has overlapping with any Updating layer above it in zorder
89536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * till the end of the batch. returns true if it finds any intersection */
89636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::canPushBatchToTop(const hwc_display_contents_1_t* list,
89736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int fromIndex, int toIndex) {
89836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    for(int i = fromIndex; i < toIndex; i++) {
89936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) {
90036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(intersectingUpdatingLayers(list, i+1, toIndex, i)) {
90136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                return false;
90236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
90336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
90436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    }
90536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    return true;
90636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula}
90736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
90836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula/* Checks if given layer at targetLayerIndex has any
90936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * intersection with all the updating layers in beween
91036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula * fromIndex and toIndex. Returns true if it finds intersectiion */
91136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool MDPComp::intersectingUpdatingLayers(const hwc_display_contents_1_t* list,
91236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int fromIndex, int toIndex, int targetLayerIndex) {
91336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    for(int i = fromIndex; i <= toIndex; i++) {
91436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        if(!mCurrentFrame.isFBComposed[i]) {
91536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(areLayersIntersecting(&list->hwLayers[i],
91636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        &list->hwLayers[targetLayerIndex]))  {
91736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                return true;
91836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
91936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
92036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    }
92136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    return false;
92236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula}
92336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
92436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulaint MDPComp::getBatch(hwc_display_contents_1_t* list,
92536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int& maxBatchStart, int& maxBatchEnd,
92636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int& maxBatchCount) {
92736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int i = 0;
92836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int fbZOrder =-1;
929eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran    int droppedLayerCt = 0;
93036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    while (i < mCurrentFrame.layerCount) {
93136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int batchCount = 0;
93236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int batchStart = i;
93336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int batchEnd = i;
934eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran        /* Adjust batch Z order with the dropped layers so far */
935eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran        int fbZ = batchStart - droppedLayerCt;
93636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        int firstZReverseIndex = -1;
93785cc9b8dfc7a50f6e8083b67056f3a25702fbba1Prabhanjan Kandula        int updatingLayersAbove = 0;//Updating layer count in middle of batch
93836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        while(i < mCurrentFrame.layerCount) {
93936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(!mCurrentFrame.isFBComposed[i]) {
94036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                if(!batchCount) {
94136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    i++;
94236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    break;
94336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                }
94436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                updatingLayersAbove++;
94536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                i++;
94636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                continue;
94736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            } else {
94836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                if(mCurrentFrame.drop[i]) {
94936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    i++;
950eeeb8334059a63fe95f8a7db276d358bb2ddb857Jeykumar Sankaran                    droppedLayerCt++;
95136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    continue;
95236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                } else if(updatingLayersAbove <= 0) {
95336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    batchCount++;
95436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    batchEnd = i;
95536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    i++;
95636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    continue;
95736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                } else { //Layer is FBComposed, not a drop & updatingLayer > 0
95836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
95936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    // We have a valid updating layer already. If layer-i not
96036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    // have overlapping with all updating layers in between
96136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    // batch-start and i, then we can add layer i to batch.
96236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    if(!intersectingUpdatingLayers(list, batchStart, i-1, i)) {
96336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchCount++;
96436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchEnd = i;
96536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        i++;
96636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        continue;
96736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    } else if(canPushBatchToTop(list, batchStart, i)) {
96836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //If All the non-updating layers with in this batch
96936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //does not have intersection with the updating layers
97036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //above in z-order, then we can safely move the batch to
97136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //higher z-order. Increment fbZ as it is moving up.
97236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        if( firstZReverseIndex < 0) {
97336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                            firstZReverseIndex = i;
97436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        }
97536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchCount++;
97636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        batchEnd = i;
97736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        fbZ += updatingLayersAbove;
97836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        i++;
97936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        updatingLayersAbove = 0;
98036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        continue;
98136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    } else {
98236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        //both failed.start the loop again from here.
98336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        if(firstZReverseIndex >= 0) {
98436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                            i = firstZReverseIndex;
98536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        }
98636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                        break;
98736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                    }
98836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                }
98936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
99036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
99136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        if(batchCount > maxBatchCount) {
99236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            maxBatchCount = batchCount;
99336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            maxBatchStart = batchStart;
99436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            maxBatchEnd = batchEnd;
99536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            fbZOrder = fbZ;
99636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        }
99736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    }
99836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    return fbZOrder;
99936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula}
100036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula
100136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool  MDPComp::markLayersForCaching(hwc_context_t* ctx,
100236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula        hwc_display_contents_1_t* list) {
100336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    /* Idea is to keep as many non-updating(cached) layers in FB and
100436035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     * send rest of them through MDP. This is done in 2 steps.
100536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *   1. Find the maximum contiguous batch of non-updating layers.
100636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *   2. See if we can improve this batch size for caching by adding
100736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *      opaque layers around the batch, if they don't have
100836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     *      any overlapping with the updating layers in between.
100936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     * NEVER mark an updating layer for caching.
101036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula     * But cached ones can be marked for MDP */
1011f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1012f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
1013bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int maxBatchEnd = -1;
1014f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
101536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    int fbZ = -1;
1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
10172b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah    /* Nothing is cached. No batching needed */
10182b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah    if(mCurrentFrame.fbCount == 0) {
1019efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return true;
1020af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
10212b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah
10222b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah    /* No MDP comp layers, try to use other comp modes */
10232b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah    if(mCurrentFrame.mdpCount == 0) {
10242b59168391f5d3fb025ccae8d936d5b09bddb162Saurabh Shah        return false;
1025af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
102736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    fbZ = getBatch(list, maxBatchStart, maxBatchEnd, maxBatchCount);
1028bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
102936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    /* reset rest of the layers lying inside ROI for MDP comp */
1030f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
1031efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
1032bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if((i < maxBatchStart || i > maxBatchEnd) &&
103336035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                mCurrentFrame.isFBComposed[i]){
1034bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i]){
1035bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                //If an unsupported layer is being attempted to
1036bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                //be pulled out we should fail
1037bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                if(not isSupportedForMDPComp(ctx, layer)) {
1038bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    return false;
1039bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                }
1040bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                mCurrentFrame.isFBComposed[i] = false;
1041efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            }
1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
104536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    // update the frame data
104636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    mCurrentFrame.fbZ = fbZ;
104736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula    mCurrentFrame.fbCount = maxBatchCount;
1048af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
1049bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.fbCount - mCurrentFrame.dropCount;
1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
105236035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            mCurrentFrame.fbCount);
1053efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
1054efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    return true;
1055f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
105611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
1057f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
1058efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_display_contents_1_t* list) {
1059f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
1060efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    int fbCount = 0;
1061f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1062f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
1063f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
1064bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i])
1065bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                fbCount++;
1066f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
1068af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
1069f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1070c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1071af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
1072efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    mCurrentFrame.fbCount = fbCount;
1073bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount
1074bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                                    - mCurrentFrame.dropCount;
1075efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
1076bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d"
1077bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount,
1078bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.dropCount);
1079f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
1080c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
108111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
108211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        bool secureOnly) {
1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
1085f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1088f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
1089f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
1090f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1093c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
1094f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
109511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                private_handle_t *hnd = (private_handle_t *)layer->handle;
109611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(!secureOnly || isSecureBuffer(hnd)) {
109711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.isFBComposed[nYuvIndex] = false;
109811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.fbCount--;
109911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
1100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1101c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1103af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
1104af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
1105bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.fbCount - mCurrentFrame.dropCount;
1106bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__,
1107f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
1108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
1109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1110d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaranhwc_rect_t MDPComp::getUpdatingFBRect(hwc_context_t *ctx,
1111d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran        hwc_display_contents_1_t* list){
1112d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran    hwc_rect_t fbRect = (struct hwc_rect){0, 0, 0, 0};
1113d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran    hwc_layer_1_t *fbLayer = &list->hwLayers[mCurrentFrame.layerCount];
1114d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran
1115d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran    /* Update only the region of FB needed for composition */
1116d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++ ) {
1117d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran        if(mCurrentFrame.isFBComposed[i] && !mCurrentFrame.drop[i]) {
1118d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
1119d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
1120d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran            fbRect = getUnion(fbRect, dst);
1121d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran        }
1122d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran    }
1123d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran    return fbRect;
1124d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran}
1125d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran
1126c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shahbool MDPComp::postHeuristicsHandling(hwc_context_t *ctx,
1127c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        hwc_display_contents_1_t* list) {
1128c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
1129c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    //Capability checks
1130c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!resourceCheck(ctx, list)) {
1131c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD_IF(isDebug(), "%s: resource check failed", __FUNCTION__);
1132c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        return false;
1133c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    }
1134c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
1135c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    //Limitations checks
1136c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(!hwLimitationsCheck(ctx, list)) {
1137c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD_IF(isDebug(), "%s: HW limitations",__FUNCTION__);
1138c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        return false;
1139c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    }
1140c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
1141f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    //Configure framebuffer first if applicable
1142f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    if(mCurrentFrame.fbZ >= 0) {
1143d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran        hwc_rect_t fbRect = getUpdatingFBRect(ctx, list);
1144d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran        if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, fbRect, mCurrentFrame.fbZ))
1145d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran        {
1146f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah            ALOGD_IF(isDebug(), "%s configure framebuffer failed",
1147f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah                    __FUNCTION__);
1148f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah            return false;
1149f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        }
1150f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    }
1151f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah
1152c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    mCurrentFrame.map();
1153c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
1154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
1155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
1156af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
1157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1159f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
1160af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
1161f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
1162f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
1163f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
1164f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
116536035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            //Leave fbZ for framebuffer. CACHE/GLES layers go here.
116636035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            if(mdpNextZOrder == mCurrentFrame.fbZ) {
116736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula                mdpNextZOrder++;
116836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula            }
1169f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1170f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
1171f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
117215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            private_handle_t *hnd = (private_handle_t *)layer->handle;
117315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
117415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(configure4k2kYuv(ctx, layer,
117515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            mCurrentFrame.mdpToLayer[mdpIndex])
117615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        != 0 ){
117715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGD_IF(isDebug(), "%s: Failed to configure split pipes \
117815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            for layer %d",__FUNCTION__, index);
117915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
118015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
118115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                else{
118215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    mdpNextZOrder++;
118315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
118415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                continue;
118515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
1187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
118815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        layer %d",__FUNCTION__, index);
1189af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
1190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1191af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
11941029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    if(!ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd)) {
11951029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        ALOGD_IF(isDebug(), "%s: Failed to validate and set overlay for dpy %d"
11961029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah                ,__FUNCTION__, mDpy);
11971029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        return false;
11981029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    }
11991029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
1200c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    setRedraw(ctx, list);
1201af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
1202af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
1203f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
120402e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shahbool MDPComp::resourceCheck(hwc_context_t *ctx,
120502e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        hwc_display_contents_1_t *list) {
120602e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    const bool fbUsed = mCurrentFrame.fbCount;
120702e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    if(mCurrentFrame.mdpCount > sMaxPipesPerMixer - fbUsed) {
120802e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
120902e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah        return false;
121002e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    }
121102e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah    return true;
121202e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah}
121302e299800013a8758daa9ed58a3fba1199bb32daSaurabh Shah
121486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool MDPComp::hwLimitationsCheck(hwc_context_t* ctx,
121586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        hwc_display_contents_1_t* list) {
121686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
121786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //A-family hw limitation:
121886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //If a layer need alpha scaling, MDP can not support.
121986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    if(ctx->mMDP.version < qdutils::MDSS_V5) {
122086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
122186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            if(!mCurrentFrame.isFBComposed[i] &&
122286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    isAlphaScaled( &list->hwLayers[i])) {
122386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                ALOGD_IF(isDebug(), "%s:frame needs alphaScaling",__FUNCTION__);
122486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                return false;
122586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            }
122686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        }
122786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    }
122886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
122986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    // On 8x26 & 8974 hw, we have a limitation of downscaling+blending.
123086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //If multiple layers requires downscaling and also they are overlapping
123186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    //fall back to GPU since MDSS can not handle it.
123286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    if(qdutils::MDPVersion::getInstance().is8x74v2() ||
123386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            qdutils::MDPVersion::getInstance().is8x26()) {
123486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        for(int i = 0; i < mCurrentFrame.layerCount-1; ++i) {
123586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            hwc_layer_1_t* botLayer = &list->hwLayers[i];
123686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            if(!mCurrentFrame.isFBComposed[i] &&
123786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    isDownscaleRequired(botLayer)) {
123886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                //if layer-i is marked for MDP and needs downscaling
123986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                //check if any MDP layer on top of i & overlaps with layer-i
124086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                for(int j = i+1; j < mCurrentFrame.layerCount; ++j) {
124186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    hwc_layer_1_t* topLayer = &list->hwLayers[j];
124286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    if(!mCurrentFrame.isFBComposed[j] &&
124386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                            isDownscaleRequired(topLayer)) {
124486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                        hwc_rect_t r = getIntersection(botLayer->displayFrame,
124586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                                topLayer->displayFrame);
124686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                        if(isValidRect(r))
124786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                            return false;
124886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                    }
124986c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula                }
125086c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula            }
125186c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        }
125286c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    }
125386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula    return true;
125486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula}
125586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula
1256f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
12578eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    int ret = 0;
1258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
1259d2123672fa85dec556fc9b3b3b4de8c185c411bdSaurabh Shah    MDPVersion& mdpVersion = qdutils::MDPVersion::getInstance();
1260b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
126103514577d0c705056352898f66ed2a8e9b131df8Raj Kamal    //Do not cache the information for next draw cycle.
126203514577d0c705056352898f66ed2a8e9b131df8Raj Kamal    if(numLayers > MAX_NUM_APP_LAYERS or (!numLayers)) {
126303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal        ALOGI("%s: Unsupported layer count for mdp composition",
126403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal                __FUNCTION__);
1265c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        mCachedFrame.reset();
1266c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        return -1;
12671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
126889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
1269c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    //reset old data
1270c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    mCurrentFrame.reset(numLayers);
1271c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
1272c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    mCurrentFrame.dropCount = 0;
1273c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
1274c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan    // Detect the start of animation and fall back to GPU only once to cache
1275c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan    // all the layers in FB and display FB content untill animation completes.
1276c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan    if(ctx->listStats[mDpy].isDisplayAnimating) {
1277c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        mCurrentFrame.needsRedraw = false;
1278c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        if(ctx->mAnimationState[mDpy] == ANIMATION_STOPPED) {
1279c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan            mCurrentFrame.needsRedraw = true;
1280c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan            ctx->mAnimationState[mDpy] = ANIMATION_STARTED;
1281c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        }
1282c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        setMDPCompLayerFlags(ctx, list);
1283c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        mCachedFrame.updateCounts(mCurrentFrame);
1284c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        ret = -1;
1285c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        return ret;
1286c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan    } else {
1287c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan        ctx->mAnimationState[mDpy] = ANIMATION_STOPPED;
1288c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan    }
1289c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan
12901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Hard conditions, if not met, cannot do MDP comp
1291c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    if(isFrameDoable(ctx)) {
1292c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        generateROI(ctx, list);
1293c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah
1294c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        if(tryFullFrame(ctx, list) || tryVideoOnly(ctx, list)) {
1295c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            setMDPCompLayerFlags(ctx, list);
1296c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        } else {
1297c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            reset(ctx);
1298c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
1299c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah            mCurrentFrame.dropCount = 0;
13008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
1301f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
13021a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    } else {
1303c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
1304c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah                __FUNCTION__);
13058eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
13061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
1307f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1308f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
1309c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD("GEOMETRY change: %d",
1310c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah                (list->flags & HWC_GEOMETRY_CHANGED));
1311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
1312f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
1313c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah        ALOGD("%s",sDump.string());
1314c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1315c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1316c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    mCachedFrame.cacheAll(list);
1317c477a410de65e8b662c0e9d7642afb538d0430eaSaurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
13188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return ret;
1319c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1320c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1321404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rbool MDPComp::allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index) {
132215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
132315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    bool bRet = true;
132415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    int mdpIndex = mCurrentFrame.layerToMDP[index];
132515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
132615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    info.pipeInfo = new MdpYUVPipeInfo;
132715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    info.rot = NULL;
132815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo;
132915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    ePipeType type =  MDPCOMP_OV_VG;
133015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
133115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.lIndex = ovutils::OV_INVALID;
133215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.rIndex = ovutils::OV_INVALID;
133315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
133415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
133515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(pipe_info.lIndex == ovutils::OV_INVALID){
133615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        bRet = false;
133715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed",
133815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                __FUNCTION__);
133915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
134015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
134115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if(pipe_info.rIndex == ovutils::OV_INVALID){
134215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        bRet = false;
134315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed",
134415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                __FUNCTION__);
134515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
134615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    return bRet;
134715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
1348404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R//=============MDPCompNonSplit==================================================
1349c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1350f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompNonSplit::adjustForSourceSplit(hwc_context_t *ctx,
1351404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R        hwc_display_contents_1_t*) {
135215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //As we split 4kx2k yuv layer and program to 2 VG pipes
135315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //(if available) increase mdpcount accordingly
135415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    mCurrentFrame.mdpCount += ctx->listStats[mDpy].yuv4k2kCount;
1355f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah
1356f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    //If 4k2k Yuv layer split is possible,  and if
1357f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    //fbz is above 4k2k layer, increment fb zorder by 1
1358f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    //as we split 4k2k layer and increment zorder for right half
1359f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    //of the layer
1360f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    if(mCurrentFrame.fbZ >= 0) {
1361f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount;
1362f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        for(int index = 0; index < n4k2kYuvCount; index++){
1363f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah            int n4k2kYuvIndex =
1364f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah                    ctx->listStats[mDpy].yuv4k2kIndices[index];
1365f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah            if(mCurrentFrame.fbZ > n4k2kYuvIndex){
1366f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah                mCurrentFrame.fbZ += 1;
1367f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah            }
1368f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        }
1369f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah    }
137015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
137115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1372c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
1373c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
1374c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
1375f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
1376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
1377f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoNonSplit& mdp_info =
1378f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo));
1379327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
1380327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1381327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1382327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
1383327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
1385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
1386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1387f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
1388f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
1389c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1390c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1391f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx,
139220242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
139320242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
1394c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
139620242a75d65c410071434d639266311376a5b7f6Saurabh Shah
1397c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
1398c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
139915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
1400404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R            if(allocSplitVGPipesfor4k2k(ctx, index)){
140115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                continue;
140215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
140315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
140415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1405f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
1406f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1407f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoNonSplit;
1408327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
1409f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo;
1410f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1411f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
141220242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
141320242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
1414319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula        } else if(qdutils::MDPVersion::getInstance().is8x26() &&
1415319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula                (ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres > 1024)) {
1416319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula            if(qhwc::needsScaling(layer))
1417319d01534158fe3edca7cf941a10b3423df0bd01Prabhanjan Kandula                type = MDPCOMP_OV_RGB;
141886c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandula        } else if(!qhwc::needsScaling(layer)
141911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
142011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1421f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
1422f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
1423f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
14241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
1425c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
142620242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
142720242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
1428c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
1429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
1432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1433c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
143415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompNonSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
143515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        PipeLayerPair& PipeLayerPair) {
143615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    MdpYUVPipeInfo& mdp_info =
143715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo));
143815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
143915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eIsFg isFg = IS_FG_OFF;
144015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
144115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eDest lDest = mdp_info.lIndex;
144215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    eDest rDest = mdp_info.rIndex;
144315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
144415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg,
144515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            lDest, rDest, &PipeLayerPair.rot);
144615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
144715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1448f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1449c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
1451c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
1452c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
145333650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
145433650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
1455c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
1456c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
1457c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
1458c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1459c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1460ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1461ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1462ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1463ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1464ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
1465e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    // Set the Handle timeout to true for MDP or MIXED composition.
1466e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) {
1467e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan        sHandleTimeout = true;
1468e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    }
14690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1470c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
1471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1472c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1474f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1475c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
1476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1478c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
1479327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1480327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
148108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            if (!(layer->flags & HWC_COLOR_FILL)) {
148208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan                ALOGE("%s handle null", __FUNCTION__);
148308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan                return false;
148408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            }
148508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            // No PLAY for Color layer
148608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            layerProp[i].mFlags &= ~HWC_MDPCOMP;
148708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan            continue;
1488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
14890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1490f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1491f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
149215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit)
149315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        {
149415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpYUVPipeInfo& pipe_info =
149515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
149615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
149715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexL = pipe_info.lIndex;
149815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexR = pipe_info.rIndex;
149915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
150015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            uint32_t offset = hnd->offset;
150115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
150215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                rot->queueBuffer(fd, offset);
150315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
150415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
150515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
150615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexL != ovutils::OV_INVALID) {
150715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destL = (ovutils::eDest)indexL;
150815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
150915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
151015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destL)) {
151115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
151215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
151315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
151415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
151515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1516c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
151715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexR != ovutils::OV_INVALID) {
151815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destR = (ovutils::eDest)indexR;
151915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
152015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
152115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destR)) {
152215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
152315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
152415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
152515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
152615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1527327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
152815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        else{
152915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpPipeInfoNonSplit& pipe_info =
153015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
153115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest dest = pipe_info.index;
153215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(dest == ovutils::OV_INVALID) {
153315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
153415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                return false;
153515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1536c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
153715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
153815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                continue;
153915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1540c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
154115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
154215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    using  pipe: %d", __FUNCTION__, layer,
154315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    hnd, dest );
1544f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
154515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
154615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            uint32_t offset = hnd->offset;
1547327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
154815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
154915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
155015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(!rot->queueBuffer(fd, offset))
155115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
155215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
155315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
155415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
155515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
155615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if (!ov.queueBuffer(fd, offset, dest)) {
155715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGE("%s: queueBuffer failed for display:%d ",
155815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        __FUNCTION__, mDpy);
155915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                return false;
156015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1561c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1562c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1563c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1564c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1565c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1566c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1567c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1568f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit===================================================
1569c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1570f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shahvoid MDPCompSplit::adjustForSourceSplit(hwc_context_t *ctx,
157115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna         hwc_display_contents_1_t* list){
157215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //if 4kx2k yuv layer is totally present in either in left half
157315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    //or right half then try splitting the yuv layer to avoid decimation
157415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    int n4k2kYuvCount = ctx->listStats[mDpy].yuv4k2kCount;
157515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    const int lSplit = getLeftSplit(ctx, mDpy);
157615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    for(int index = 0; index < n4k2kYuvCount; index++){
157715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        int n4k2kYuvIndex = ctx->listStats[mDpy].yuv4k2kIndices[index];
157815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_layer_1_t* layer = &list->hwLayers[n4k2kYuvIndex];
157915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_rect_t dst = layer->displayFrame;
1580f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        if((dst.left > lSplit) || (dst.right < lSplit)) {
158115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            mCurrentFrame.mdpCount += 1;
158215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
1583f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        if(mCurrentFrame.fbZ > n4k2kYuvIndex){
1584f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah            mCurrentFrame.fbZ += 1;
1585f29205fd13a7d86767280bf1665149587faf86b2Saurabh Shah        }
158615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
158715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
158815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1589f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
1590f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info,
15912e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        ePipeType type) {
15929640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
15951a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.lIndex = ovutils::OV_INVALID;
15961a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.rIndex = ovutils::OV_INVALID;
15971a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
15981a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if (dst.left < lSplit) {
15991a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT);
1600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
1601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
16021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
16031a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
16041a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(dst.right > lSplit) {
16051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT);
16061a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID)
1607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
16091a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
1611c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1612c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1613f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx,
161420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
161520242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
161620242a75d65c410071434d639266311376a5b7f6Saurabh Shah
161720242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
1618c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
16195a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
16205a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
162115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        hwc_rect_t dst = layer->displayFrame;
162215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        const int lSplit = getLeftSplit(ctx, mDpy);
162315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit){
162415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if((dst.left > lSplit)||(dst.right < lSplit)){
1625404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R                if(allocSplitVGPipesfor4k2k(ctx, index)){
162615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    continue;
162715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
162815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
162915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
16301bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
16311bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1632f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoSplit;
16333393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1634f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo;
1635c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1636c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
163720242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
163820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
163944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan        } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy)
164011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
164120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1642c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
164320242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
1644c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1645c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
164620242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
164720242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
164816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
164916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1650c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1651c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1652c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
16531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
165415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint MDPCompSplit::configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
165515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        PipeLayerPair& PipeLayerPair) {
165615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    const int lSplit = getLeftSplit(ctx, mDpy);
165715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    hwc_rect_t dst = layer->displayFrame;
165815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    if((dst.left > lSplit)||(dst.right < lSplit)){
165915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        MdpYUVPipeInfo& mdp_info =
166015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(static_cast<MdpYUVPipeInfo*>(PipeLayerPair.pipeInfo));
166115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
166215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eIsFg isFg = IS_FG_OFF;
166315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
166415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eDest lDest = mdp_info.lIndex;
166515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        eDest rDest = mdp_info.rIndex;
166615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
166715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        return configureSourceSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg,
166815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                lDest, rDest, &PipeLayerPair.rot);
166915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
167015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    else{
167115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        return configure(ctx, layer, PipeLayerPair);
167215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna    }
167315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna}
167415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
1675c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1676c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1677c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1678f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
16792e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        PipeLayerPair& PipeLayerPair) {
1680f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoSplit& mdp_info =
1681f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo));
1682327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1683327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1684327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1685327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1686327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1691f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1693c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1694c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1695f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1696c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
169816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
169916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1700c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1701c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1702c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1703c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
170416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1705c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1706c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1707ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1708ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1709ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1710ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1711ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
1712e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    // Set the Handle timeout to true for MDP or MIXED composition.
1713e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) {
1714e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan        sHandleTimeout = true;
1715e7403150b1a7a50e5b2689dd40ae7825c4641fe2Ramkumar Radhakrishnan    }
171616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
171716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1719c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1720f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1721f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1722c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1725660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1726327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1727327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1728327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1729327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1730327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1731c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
173216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1733c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1734c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1735c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1737f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
173815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        if(is4kx2kYuvBuffer(hnd) && sEnable4k2kYUVSplit)
173915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        {
174015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpYUVPipeInfo& pipe_info =
174115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(MdpYUVPipeInfo*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
174215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
174315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexL = pipe_info.lIndex;
174415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexR = pipe_info.rIndex;
174515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
174615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            uint32_t offset = hnd->offset;
174715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
174815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                rot->queueBuffer(fd, offset);
174915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
175015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
175115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
175215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexL != ovutils::OV_INVALID) {
175315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destL = (ovutils::eDest)indexL;
175415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
175515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
175615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destL)) {
175715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
175815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
175915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
176015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
176115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
176215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna
176315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexR != ovutils::OV_INVALID) {
176415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destR = (ovutils::eDest)indexR;
176515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
176615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
176715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destR)) {
176815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for display:%d",
176915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__, mDpy);
177015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
177115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
177215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
177315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        }
177415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna        else{
177515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            MdpPipeInfoSplit& pipe_info =
177615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
177715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1778327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
177915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexL = pipe_info.lIndex;
178015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            ovutils::eDest indexR = pipe_info.rIndex;
1781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
178215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int fd = hnd->fd;
178315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            int offset = hnd->offset;
1784327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
178515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(ctx->mAD->isModeOn()) {
178615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if(ctx->mAD->draw(ctx, fd, offset)) {
1787404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R                    fd = ctx->mAD->getDstFd();
1788404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R                    offset = ctx->mAD->getDstOffset();
178915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
1790f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            }
1791f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
179215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(rot) {
179315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                rot->queueBuffer(fd, offset);
179415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                fd = rot->getDstMemId();
179515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                offset = rot->getDstOffset();
179615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            }
1797c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
179815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //************* play left mixer **********
179915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexL != ovutils::OV_INVALID) {
180015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destL = (ovutils::eDest)indexL;
180115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
180215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
180315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destL)) {
180415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for left mixer",
180515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__);
180615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
180715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
1808c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1809c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
181015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            //************* play right mixer **********
181115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna            if(indexR != ovutils::OV_INVALID) {
181215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ovutils::eDest destR = (ovutils::eDest)indexR;
181315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
181415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                        using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
181515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                if (!ov.queueBuffer(fd, offset, destR)) {
181615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    ALOGE("%s: queueBuffer failed for right mixer",
181715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                            __FUNCTION__);
181815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                    return false;
181915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna                }
1820c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1821c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1822327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
182316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1824c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1825327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
182616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1827c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1828c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1829c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1830