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