hwc_mdpcomp.cpp revision 11bf9c368a2ff832b1a20d9c90ec796e3d29bf9f
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h>
20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
23361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h"
24591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
26699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h"
27f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h"
28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
3011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
35327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
36327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
43e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true;
44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
458eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahfloat MDPComp::sMaxBw = 2.3f;
468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::sCompBytesClaimed = 0;
47c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
48f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) {
49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    if(isDisplaySplit(ctx, dpy)) {
50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        return new MDPCompSplit(dpy);
51c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
52f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return new MDPCompNonSplit(dpy);
53c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
5416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
55f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
57c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
59bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran    if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS)
60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran        return;
61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran
62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
63361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 0) ? "\"PRIMARY\"" :
64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\"");
65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
82f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
83f9572cdbe3541d85522adea584f925671b375300Jeykumar 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    sDebugLogs = false;
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
118f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
11911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
12011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
12111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
12211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1258eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(property_get("debug.mdpcomp.bw", property, "0") > 0) {
1268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        float val = atof(property);
1278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(val > 0.0f) {
1288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            sMaxBw = val;
1298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
1308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
1318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
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    }
151c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
154699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
155699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCurrentFrame.reset(numLayers);
156699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.cacheAll(list);
157699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
158699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah}
159699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah
160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
161c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
164c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
168359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
174359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
179f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
188f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw)
189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
19316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
194f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
195af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
198af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
199af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
200f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
201f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
203f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
204f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
205c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
210af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
212af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
213af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
215ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
220af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
221af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
224af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
225af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
226af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
227af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
228af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
230f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
232f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    cacheCount = 0;
238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = -1;
240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
241af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
242af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mdpCount = curFrame.mdpCount;
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    cacheCount = curFrame.fbCount;
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = curFrame.fbZ;
254c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
255c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
2561b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
25741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
2580ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2590ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2600ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
2610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
2620ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2630ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2640ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
265f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
266f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
2670ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
26841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
26941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
27041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
27141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
27241269096daf2363b16dcd89627dd674529a26601Saurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
27341269096daf2363b16dcd89627dd674529a26601Saurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
27441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
2750ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
2780ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
28041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
28141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
283f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
284f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
285f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
2861b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
2871b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
2881b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
289f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
2900ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2910ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
29241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const uint32_t downscale =
29341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
29441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
29541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        /* Workaround for downscales larger than 4x.
29641269096daf2363b16dcd89627dd674529a26601Saurabh Shah         * Will be removed once decimator block is enabled for MDSS
29741269096daf2363b16dcd89627dd674529a26601Saurabh Shah         */
29841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
29941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
30041269096daf2363b16dcd89627dd674529a26601Saurabh Shah                    h_dscale > downscale)
30141269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        } else {
30341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(w_dscale > 64 || h_dscale > 64)
30441269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
30541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
30641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    } else { //A-family
30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(w_dscale > downscale || h_dscale > downscale)
30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah            return false;
30941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
31041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3110ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3120ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3130ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type,
3151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
316c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
317c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
318c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
319c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
3211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer);
322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
323f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
324f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
3271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer);
328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
331c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
3371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer);
338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
341c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
342c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
343c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
344c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
346af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
347e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
348f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
351af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
35256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    } else if(qdutils::MDPVersion::getInstance().is8x26() &&
353361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) {
35456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        //1 Padding round to shift pipes across mixers
35556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
35656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah                __FUNCTION__);
35756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ret = false;
358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring ||
359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran              ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) {
360c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
361f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
362af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
363af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
364586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
365586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
366af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
367586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
368af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
376af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
37833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(sIdleFallBack) {
37933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
38033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
38133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
38233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
390af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
391af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
393c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
396ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
397ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
398ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
399ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        return false;
400ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    }
401ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah
402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
403c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
408f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
40986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        if(layer->transform & HWC_TRANSFORM_ROT_90) {
41086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            if(!isYuvBuffer(hnd) ) {
41186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
41286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
41386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }else if(!canUseRotator(ctx, mDpy)) {
41486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
41586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
41686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }
417c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
41841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!isValidDimension(ctx,layer)) {
41941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
42041269096daf2363b16dcd89627dd674529a26601Saurabh Shah                __FUNCTION__);
421c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
422c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
4232902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula
4242902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp
4252902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        // may not need it if Gfx pre-rotation can handle all flips & rotations
4262902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        if(qdutils::MDPVersion::getInstance().is8x26() &&
4272902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (ctx->dpyAttr[mDpy].xres > 1024) &&
4282902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (layer->transform & HWC_TRANSFORM_FLIP_H) &&
4292902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (!isYuvBuffer(hnd)))
4302902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                   return false;
431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
433f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    if(ctx->mAD->isDoable()) {
434f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        return false;
435f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    }
436f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
441e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    } else if(partialMDPComp(ctx, list)) {
442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
4601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
4648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
4658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
4668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
4678eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
4688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
4698eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
476e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
477e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if(!sEnableMixedMode) {
478e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        //Mixed mode is disabled. No need to even try caching.
479e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        return false;
480e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
481e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
48511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, false /*secure only*/);
486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    batchLayers(); //sets up fbZ also
487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
4941a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
496af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
497af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
4988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
4998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
5008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
5018eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
5028eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
5038eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
50811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list, bool secureOnly) {
509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
51111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, secureOnly);
51241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
513af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
514af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
515af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
516af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
517af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
518af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
51941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
52041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
52141269096daf2363b16dcd89627dd674529a26601Saurabh Shah
522af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
523af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
524af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
525af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
526af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
530af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
5328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
5338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
5348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
5358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
5368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
537c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
538c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
539c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
542e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating;
543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
544e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    if(isSkipLayer(layer) && !extAnimBlockFeature) {
545e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
547c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
548c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
54986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) {
55086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
55186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        return false;
55286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    }
55386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar
554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
55941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
56041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
56141269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
56241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
563c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
56441269096daf2363b16dcd89627dd674529a26601Saurabh Shah
565a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    if(layer->planeAlpha < 0xFF) {
566a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\
567a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 in video only mode",
568a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 __FUNCTION__);
569a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        return false;
570a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    }
571a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed
572c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
573c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
584af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
585af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
587af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
588af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
589af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
590af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return;
591af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
603af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
618af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
619af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
62411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
639c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
640af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
642af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
643af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
646c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
64711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
64811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        bool secureOnly) {
649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
650a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
651a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
652a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
653a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
654a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
655a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
656a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
657a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
658a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
668c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
67011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                private_handle_t *hnd = (private_handle_t *)layer->handle;
67111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(!secureOnly || isSecureBuffer(hnd)) {
67211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.isFBComposed[nYuvIndex] = false;
67311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.fbCount--;
67411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
676c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
678af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
679af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
680af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
695f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
696f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
699f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
700f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
701f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
702f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
703f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
706af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        } else if(fbBatch == false) {
707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
708af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
711f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
712af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
713af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
715af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
717af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
718af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
719af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
724af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
726af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
727af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
728af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
739f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
7418eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx,
7428eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_display_contents_1_t* list) {
7438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = 0;
7448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
7454b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson    if(!qdutils::MDPVersion::getInstance().is8x74v2())
7464b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson        return 0;
7474b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson
7488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    for (uint32_t i = 0; i < list->numHwLayers - 1; i++) {
7498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
7508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
7518eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
7524b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            if (hnd) {
7534b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson                hwc_rect_t crop = layer->sourceCrop;
7544b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson                float bpp = ((float)hnd->size) / (hnd->width * hnd->height);
7554b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson                size += bpp * ((crop.right - crop.left) *
7568eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                    (crop.bottom - crop.top));
7574b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            }
7588eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
7598eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
7608eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
7618eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(mCurrentFrame.fbCount) {
7628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1];
7638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
7644b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson        if (hnd)
7654b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            size += hnd->size;
7668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
7678eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
7688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return size;
7698eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
7708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
7718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) {
7728eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    //Will be added for other targets if we run into bandwidth issues and when
7738eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    //we have profiling data to set an upper limit.
7748eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(qdutils::MDPVersion::getInstance().is8x74v2()) {
7758eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        const uint32_t ONE_GIG = 1024 * 1024 * 1024;
7768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        double panelRefRate =
7778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
7788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if((size + sCompBytesClaimed) > ((sMaxBw / panelRefRate) * ONE_GIG)) {
7798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            return false;
7808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
7818eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
7828eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return true;
7838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
7848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
7868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    int ret = 0;
787af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
788b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
7891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //reset old data
7901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCurrentFrame.reset(numLayers);
791f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
7921a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
7931a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //do not cache the information for next draw cycle.
7941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(numLayers > MAX_NUM_APP_LAYERS) {
7951a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
7961a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
7971a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                __FUNCTION__);
7988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
7998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
8001a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
80189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
8021a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Hard conditions, if not met, cannot do MDP comp
8031a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(!isFrameDoable(ctx)) {
8041a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
8051a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                __FUNCTION__);
8061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
8078eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
8088eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
8091a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
810af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
8111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Check whether layers marked for MDP Composition is actually doable.
8121a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(isFullFrameDoable(ctx, list)) {
8131a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
8141a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
8151a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
8161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
817699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                        mCurrentFrame.fbZ)) {
8181a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
819699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
820d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
8218eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
8228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
82389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
8241a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
8251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Acquire and Program MDP pipes
8261a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programMDP(ctx, list)) {
8271a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            reset(numLayers, list);
828d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
8298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
8308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
8311a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        } else { //Success
8321a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            //Any change in composition types needs an FB refresh
8331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.needsRedraw = false;
8341a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(mCurrentFrame.fbCount &&
8351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                    ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
8361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
8371a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
8381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (!mCurrentFrame.mdpCount) ||
8391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
8401a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     isSkipPresent(ctx, mDpy) ||
8411a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mDpy > HWC_DISPLAY_PRIMARY))) {
8421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                mCurrentFrame.needsRedraw = true;
843699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
8441a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
84511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    } else if(isOnlyVideoDoable(ctx, list, false /*secure only*/) ||
84611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            isOnlyVideoDoable(ctx, list, true /*secure only*/)) {
8471a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //All layers marked for MDP comp cannot be bypassed.
8481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Try to compose atleast YUV layers through MDP comp and let
8491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //all the RGB layers compose in FB
8501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Destination over
8511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.fbZ = -1;
8521a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbCount)
8531a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
8541a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
8551a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
8561a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
8571a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
8581a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
8591a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
8601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
861699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
862d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
8638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
8648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
86589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
8661a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
8671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programYUV(ctx, list)) {
868699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            reset(numLayers, list);
869d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
8708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
8718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
872f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
8731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    } else {
8741a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
8758eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
8768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
8771a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
878f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
8791a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //UpdateLayerFlags
8801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    setMDPCompLayerFlags(ctx, list);
8811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
882f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
88389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    // unlock it before calling dump function to avoid deadlock
884f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
885af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
886f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
887f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
888f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
8918eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit:
8928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    sCompBytesClaimed += calcMDPBytesRead(ctx, list);
8938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return ret;
894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
896f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompNonSplit===================================================
897c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
898c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
899c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
900c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
901f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
902f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
903f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoNonSplit& mdp_info =
904f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo));
905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
907327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
908327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
909327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
910f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
911f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
912f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
913f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
914f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
915c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
916c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
917f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx,
9181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
9191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
9201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int numPipesNeeded = mCurrentFrame.mdpCount;
9211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT);
9221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
9231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    //Reserve pipe for FB
9241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(mCurrentFrame.fbCount)
9251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        availPipes -= 1;
9261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
9271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(numPipesNeeded > availPipes) {
9281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d",
9291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                __FUNCTION__, mDpy, numPipesNeeded, availPipes);
9301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return false;
9311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
9321a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
93311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(not areVGPipesAvailable(ctx, list)) {
93411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
93511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
93611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
93711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    return true;
93811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah}
93911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
94011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx,
94111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list) {
94211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
94311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int pipesNeeded = 0;
94411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
94511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
94611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
94711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_rect_t dst = layer->displayFrame;
94811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
94911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            if(isYuvBuffer(hnd)) {
95011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                pipesNeeded++;
95111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            }
95211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        }
95311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
95411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
95511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
95611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(pipesNeeded > availableVGPipes) {
95711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
95811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                "dpy %d needed %d, avail %d",
95911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
96011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
96111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
96211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
9631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
964c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
96516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
966f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx,
96720242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
96820242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
969c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
97120242a75d65c410071434d639266311376a5b7f6Saurabh Shah
972c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
974f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
975f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
976f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoNonSplit;
977327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
978f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo;
979f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
980f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
98120242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
98220242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
9831ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
98411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
98511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
986f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
987f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
988f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
9891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
99120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
99220242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
995c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
997c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
998c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
999f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1000c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1001f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
1002c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
1003c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
100433650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
100533650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
1006c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
1007c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
1008c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
1009c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1010c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1011ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1012ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1013ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1014ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1015ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
1016c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
101733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
1018c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
10190ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1020c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
1021f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1022c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1023f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1024f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1025c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1027f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1028c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
1029327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1030327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1031327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1032327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1033c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
10340ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1035f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1037f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoNonSplit& pipe_info =
1038f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah            *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1039c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
1040c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
1041c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
10420ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
1043c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1044c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1045327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1046327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
1047327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1048c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1049327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
1052c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1053327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1054327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
1055f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1056f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1057327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1058327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
1059c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
1060327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1061327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1062327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1063327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
1065ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula            ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy);
1066327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1067c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1069c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1070c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1071c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1072c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1073c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1074f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit===================================================
1075c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1076f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx,
10771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list,
10781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
10802e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
10819640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah
10829640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
1085f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
10881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) {
1089f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
10901a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) {
1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1093f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1094c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1095c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
1096c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1097c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1098f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx,
10991a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
11001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
110101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    int totalPipesNeeded = 0;
11021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11031a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    for(int i = 0; i < Overlay::MIXER_MAX; i++) {
11041a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int numPipesNeeded = pipesNeeded(ctx, list, i);
11051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int availPipes = ov.availablePipes(mDpy, i);
11061a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11071a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        //Reserve pipe(s)for FB
11081a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(mCurrentFrame.fbCount)
110901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah            numPipesNeeded += 1;
11101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
111101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        totalPipesNeeded += numPipesNeeded;
111201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
111301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        //Per mixer check.
11141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(numPipesNeeded > availPipes) {
11151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
11161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     "dpy %d mixer %d needed %d, avail %d",
11171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     __FUNCTION__, mDpy, i, numPipesNeeded, availPipes);
11181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            return false;
11191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        }
11201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
112101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
112201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    //Per display check, since unused pipes can get counted twice.
112301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    int totalPipesAvailable = ov.availablePipes(mDpy);
112401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    if(totalPipesNeeded > totalPipesAvailable) {
112501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
112601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah                "dpy %d needed %d, avail %d",
112701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah                __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable);
112801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        return false;
112901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    }
113001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
113111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(not areVGPipesAvailable(ctx, list)) {
113211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
113311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
113411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
113511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    return true;
113611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah}
113711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
113811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx,
113911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list) {
114011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
114111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int pipesNeeded = 0;
114211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
114311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
114411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
114511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
114611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_rect_t dst = layer->displayFrame;
114711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
114811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            if(isYuvBuffer(hnd)) {
114911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(dst.left < lSplit) {
115011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    pipesNeeded++;
115111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
115211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(dst.right > lSplit) {
115311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    pipesNeeded++;
115411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
115511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            }
115611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        }
115711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
115811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
115911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
116011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(pipesNeeded > availableVGPipes) {
116111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
116211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                "dpy %d needed %d, avail %d",
116311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
116411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
116511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
116611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
11671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
11681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah}
11691a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1170f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
1171f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info,
11722e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        ePipeType type) {
11732e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
11749640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1175f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1176f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
11771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.lIndex = ovutils::OV_INVALID;
11781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.rIndex = ovutils::OV_INVALID;
11791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if (dst.left < lSplit) {
11811a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT);
1182f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
1183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
11841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
11851a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11861a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(dst.right > lSplit) {
11871a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT);
11881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID)
1189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
11911a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
1193c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1194c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1195f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx,
119620242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
119720242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
119820242a75d65c410071434d639266311376a5b7f6Saurabh Shah
119920242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
1200c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
12015a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
12025a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
12031bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
12041bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1205f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoSplit;
12063393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1207f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo;
1208c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
121020242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
121120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
121244625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan        } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy)
121311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
121420242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1215c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
121620242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
1217c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1218c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
121920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
122020242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
122116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
122216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1223c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1224c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1225c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
12261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1227c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1228c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1229c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1230f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
12312e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        PipeLayerPair& PipeLayerPair) {
1232f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoSplit& mdp_info =
1233f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo));
1234327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1235327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1236327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1237327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1238327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1239f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1243f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1247f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
125016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
125116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1252c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1253c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1255c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
125616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1257c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1258c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1259ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1260ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1261ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1262ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1263ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
126416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
126533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
126616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
126716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
126816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1269f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1270c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1271f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1272f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1273c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1274f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1276660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1277327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1278327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1279327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1280327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1281327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
128316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1284c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1285c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1286c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1287f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1288f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1289f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info =
1290f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah            *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1292327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1293c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1294c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1296327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1297327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1298327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1299f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        if(ctx->mAD->isModeOn()) {
1300f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            if(ctx->mAD->draw(ctx, fd, offset)) {
1301f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                fd = ctx->mAD->getDstFd(ctx);
1302f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                offset = ctx->mAD->getDstOffset(ctx);
1303f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            }
1304f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        }
1305f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1306327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1307327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1308327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1309327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1310327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1311c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1312c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1313c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1314c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1315327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1317327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1318327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1319327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1320c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1321c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1322c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1323c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1325c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1326327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1327f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1328327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1329327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1330327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1331c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1332c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1333327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
133416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1335c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1336327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
133716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1338c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1339c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1340c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1341