hwc_mdpcomp.cpp revision 8eeb53efa1e615545f646a14ae2e8157e0a9bae6
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
482e474227e216ee37ab84a3c9a22ea1f650626231Saurabh ShahMDPComp* MDPComp::getObject(const int& width, const int& rightSplit,
492e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        const int& dpy) {
502e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    if(width > MAX_DISPLAY_DIM || rightSplit) {
51f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompHighRes(dpy);
52c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
532e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    return new MDPCompLowRes(dpy);
54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
5516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
56f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran    if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS)
61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran        return;
62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 0) ? "\"PRIMARY\"" :
65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\"");
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
81f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
82f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
86f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
87f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
1046387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        if(!setupBasePipe(ctx)) {
1056387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
1066387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            return false;
1076387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        }
108c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
109c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    sEnableMixedMode = true;
111e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) &&
112e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
113e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
114e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        sEnableMixedMode = false;
115e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
116e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sDebugLogs = false;
118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
121c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
12411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
12511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
128f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
129f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(property_get("debug.mdpcomp.bw", property, "0") > 0) {
1318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        float val = atof(property);
1328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(val > 0.0f) {
1338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            sMaxBw = val;
1348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
1358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
1368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
1376bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed    if(ctx->mMDP.panel != MIPI_CMD_PANEL) {
1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        // Idle invalidation is not necessary on command mode panels
1396bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        long idle_timeout = DEFAULT_IDLE_TIME;
1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            if(atoi(property) != 0)
1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                idle_timeout = atoi(property);
1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
144c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1456bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        //create Idle Invalidator only when not disabled through property
1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idle_timeout != -1)
1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator = IdleInvalidator::getInstance();
148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1496bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idleInvalidator == NULL) {
1506bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            ALOGE("%s: failed to instantiate idleInvalidator object",
1516bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                  __FUNCTION__);
1526bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        } else {
1536bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator->init(timeout_handler, ctx, idle_timeout);
1546bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
155c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
159699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
160699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCurrentFrame.reset(numLayers);
161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.cacheAll(list);
162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah}
164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah
165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
173359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
179359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
186f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
188f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[index] = NULL;
193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
194f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw)
195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
198c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
19916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/*
201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */
204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_stride = ctx->dpyAttr[dpy].stride;
207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
208c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
209c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
210c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
211c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mdp_overlay ovInfo;
212c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    msmfb_overlay_data ovData;
213c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
214c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
216c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
217c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.width  = fb_width;
218c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.height = fb_height;
219c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.w = fb_width;
220c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.h = fb_height;
221c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.w = fb_width;
222c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.h = fb_height;
223c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
224c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
225c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
226c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
228c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
229c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
230c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
231c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovData.id = ovInfo.id;
232c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
233c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
235c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
236c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
237c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
238c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
239f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
242c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
243af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
250c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
251c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
254f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
256f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
259f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
260ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
261f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
262f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
263f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
264af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
265af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
270af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
271af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
272af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
273af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
274af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
275f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
277f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
279f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
280af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
281f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
282f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    cacheCount = 0;
283f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
284af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = -1;
285af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
286af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
287af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
288af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
289af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
290af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
291af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
292af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
293af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
294af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
295af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mdpCount = curFrame.mdpCount;
296af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    cacheCount = curFrame.fbCount;
297af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
298af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = curFrame.fbZ;
299c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
300c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
3011b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
3060ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
3070ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3080ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
3090ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
3120ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah
31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
3200ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
3230ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
3240ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
32541269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
32641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
3270ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
3311b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
3321b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
3331b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3350ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3360ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
33741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const uint32_t downscale =
33841269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
33941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
34041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        /* Workaround for downscales larger than 4x.
34141269096daf2363b16dcd89627dd674529a26601Saurabh Shah         * Will be removed once decimator block is enabled for MDSS
34241269096daf2363b16dcd89627dd674529a26601Saurabh Shah         */
34341269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
34441269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
34541269096daf2363b16dcd89627dd674529a26601Saurabh Shah                    h_dscale > downscale)
34641269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
34741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        } else {
34841269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(w_dscale > 64 || h_dscale > 64)
34941269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
35041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
35141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    } else { //A-family
35241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(w_dscale > downscale || h_dscale > downscale)
35341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            return false;
35441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
35541269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3560ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3570ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3580ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type,
3601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
363c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
364c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
3661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer);
367f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
368f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
3721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer);
373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
378f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
380f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
3821a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer);
383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
390f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
391af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
392e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
393f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
394f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
396af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
39756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    } else if(qdutils::MDPVersion::getInstance().is8x26() &&
398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) {
39956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        //1 Padding round to shift pipes across mixers
40056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
40156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah                __FUNCTION__);
40256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ret = false;
403361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring ||
404361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran              ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) {
405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
406f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
407af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
408af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
409586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
410586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
411af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
412586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
414f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
415f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
416f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
417f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
418f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
419f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
420f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
422f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
42333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(sIdleFallBack) {
42433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
42533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
42633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
42733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
429f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
430f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
433c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
434f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
438c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
439c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
440c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
441ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
442ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
443ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
444ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        return false;
445ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    }
446ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah
447c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
448c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
449c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
450c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
451c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
452c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
453f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
45486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        if(layer->transform & HWC_TRANSFORM_ROT_90) {
45586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            if(!isYuvBuffer(hnd) ) {
45686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
45786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
45886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }else if(!canUseRotator(ctx, mDpy)) {
45986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
46086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
46186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }
462c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
46341269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!isValidDimension(ctx,layer)) {
46441269096daf2363b16dcd89627dd674529a26601Saurabh Shah            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
46541269096daf2363b16dcd89627dd674529a26601Saurabh Shah                __FUNCTION__);
466c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
467c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
4682902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula
4692902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp
4702902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        // may not need it if Gfx pre-rotation can handle all flips & rotations
4712902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        if(qdutils::MDPVersion::getInstance().is8x26() &&
4722902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (ctx->dpyAttr[mDpy].xres > 1024) &&
4732902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (layer->transform & HWC_TRANSFORM_FLIP_H) &&
4742902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (!isYuvBuffer(hnd)))
4752902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                   return false;
476c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
478f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    if(ctx->mAD->isDoable()) {
479f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        return false;
480f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    }
481f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
486e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    } else if(partialMDPComp(ctx, list)) {
487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
494af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
496af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
497af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
498af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
499af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5051a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
5108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
5118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
5128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
5138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
5148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
515af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
516af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
517af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
518af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
519af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
520af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
521e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
522e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if(!sEnableMixedMode) {
523e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        //Mixed mode is disabled. No need to even try caching.
524e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        return false;
525e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
526e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
530af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
531af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    batchLayers(); //sets up fbZ also
532af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
533af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
534af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
535af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
536af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
537af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
538af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
540af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
542af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
5448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
5458eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
5468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
5478eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
5488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hwc_display_contents_1_t* list){
554af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
555af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
556af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
55741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
558af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
559af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
560af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
561af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
562af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
563af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
56441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
56541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
56641269096daf2363b16dcd89627dd674529a26601Saurabh Shah
567af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
568af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
569af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
570af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
571af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
573af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
574af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
575af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5768eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
5778eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
5788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
5798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
5808eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
5818eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
582c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
583c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
584c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
587e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating;
588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
589e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    if(isSkipLayer(layer) && !extAnimBlockFeature) {
590e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
592c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
593c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
59486adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) {
59586adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
59686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        return false;
59786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    }
59886adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
60441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
60541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
60641269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
60741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
608c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
60941269096daf2363b16dcd89627dd674529a26601Saurabh Shah
610a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    if(layer->planeAlpha < 0xFF) {
611a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\
612a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 in video only mode",
613a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 __FUNCTION__);
614a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        return false;
615a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    }
616a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed
617c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
618c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
619c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
629af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
630af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
632af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
633af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
634af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
635af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return;
636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
648af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
651f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
654f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
656f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
663af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
664af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
66911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
684c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
687af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
691c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
693c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
695a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
696a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
697a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
698a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
699a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
700a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
701a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
702a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
703a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
707f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
709f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
711f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
713c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
718c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
727af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
728f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
729f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
731f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
732f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
734f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
737f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
738f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
739f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
744f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
745f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
746af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
747f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
748af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        } else if(fbBatch == false) {
749af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
750af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
751af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
752f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
753f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
754af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
755af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
757af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
759af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
760af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
761af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
763af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
765af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
766af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
767af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
768af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
769af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
770af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
771af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
772af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
773af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
774af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
775af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
776af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
777af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
778af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
779af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
780af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
7838eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx,
7848eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_display_contents_1_t* list) {
7858eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = 0;
7868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
7878eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    for (uint32_t i = 0; i < list->numHwLayers - 1; i++) {
7888eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
7898eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
7908eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
7918eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            hwc_rect_t crop = layer->sourceCrop;
7928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            float bpp = ((float)hnd->size) / (hnd->width * hnd->height);
7938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            size += bpp * ((crop.right - crop.left) *
7948eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                    (crop.bottom - crop.top));
7958eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
7968eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
7978eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
7988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(mCurrentFrame.fbCount) {
7998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1];
8008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
8018eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        size += hnd->size;
8028eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
8038eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
8048eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return size;
8058eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
8068eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
8078eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) {
8088eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    //Will be added for other targets if we run into bandwidth issues and when
8098eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    //we have profiling data to set an upper limit.
8108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(qdutils::MDPVersion::getInstance().is8x74v2()) {
8118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        const uint32_t ONE_GIG = 1024 * 1024 * 1024;
8128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        double panelRefRate =
8138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
8148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if((size + sCompBytesClaimed) > ((sMaxBw / panelRefRate) * ONE_GIG)) {
8158eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            return false;
8168eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
8178eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
8188eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return true;
8198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
8208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
8228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    int ret = 0;
823af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
824b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
8251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //reset old data
8261a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCurrentFrame.reset(numLayers);
827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
8281a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
8291a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //do not cache the information for next draw cycle.
8301a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(numLayers > MAX_NUM_APP_LAYERS) {
8311a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
8321a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
8331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                __FUNCTION__);
8348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
8358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
8361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
83789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
8381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Hard conditions, if not met, cannot do MDP comp
8391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(!isFrameDoable(ctx)) {
8401a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
8411a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                __FUNCTION__);
8421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
8438eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
8448eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
8451a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
846af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
8471a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Check whether layers marked for MDP Composition is actually doable.
8481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(isFullFrameDoable(ctx, list)) {
8491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
8501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
8511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
8521a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
853699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                        mCurrentFrame.fbZ)) {
8541a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
855699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
856d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
8578eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
8588eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
85989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
8601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
8611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Acquire and Program MDP pipes
8621a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programMDP(ctx, list)) {
8631a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            reset(numLayers, list);
864d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
8658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
8668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
8671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        } else { //Success
8681a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            //Any change in composition types needs an FB refresh
8691a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.needsRedraw = false;
8701a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(mCurrentFrame.fbCount &&
8711a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                    ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
8721a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
8731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
8741a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (!mCurrentFrame.mdpCount) ||
8751a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
8761a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     isSkipPresent(ctx, mDpy) ||
8771a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mDpy > HWC_DISPLAY_PRIMARY))) {
8781a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                mCurrentFrame.needsRedraw = true;
879699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
8801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
8811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    } else if(isOnlyVideoDoable(ctx, list)) {
8821a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //All layers marked for MDP comp cannot be bypassed.
8831a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Try to compose atleast YUV layers through MDP comp and let
8841a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //all the RGB layers compose in FB
8851a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Destination over
8861a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.fbZ = -1;
8871a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbCount)
8881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
8891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
8901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
8911a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
8921a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
8931a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
8941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
8951a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
896699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
897d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
8988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
8998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
90089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
9011a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
9021a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programYUV(ctx, list)) {
903699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            reset(numLayers, list);
904d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
9058eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
9068eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
907f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
9081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    } else {
9091a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
9108eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
9118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
9121a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
913f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
9141a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //UpdateLayerFlags
9151a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    setMDPCompLayerFlags(ctx, list);
9161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
91889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    // unlock it before calling dump function to avoid deadlock
919f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
920af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
923f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
924c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
925c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
9268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit:
9278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    sCompBytesClaimed += calcMDPBytesRead(ctx, list);
9288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return ret;
929c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
930c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
931c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
932c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
933c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
934c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
935c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
936c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
938327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
940327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
941327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
942327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
943327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
944327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
947f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
950c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
951c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
9521a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahbool MDPCompLowRes::arePipesAvailable(hwc_context_t *ctx,
9531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
9541a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
9551a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int numPipesNeeded = mCurrentFrame.mdpCount;
9561a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT);
9571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
9581a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    //Reserve pipe for FB
9591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(mCurrentFrame.fbCount)
9601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        availPipes -= 1;
9611a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
9621a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(numPipesNeeded > availPipes) {
9631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d",
9641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                __FUNCTION__, mDpy, numPipesNeeded, availPipes);
9651a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return false;
9661a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
9671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
9681a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
969c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
97016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
97220242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
97320242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
974c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
975f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
97620242a75d65c410071434d639266311376a5b7f6Saurabh Shah
977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
978c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
979f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
980f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
981c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
982327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
984f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
985f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
98620242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
98720242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
9881ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
98911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
99011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
991f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
992f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
993f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
9941a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
99620242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
99720242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
998c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
999c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1000c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1001c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
1002c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1003c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1004c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1005c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1006f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
1007c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
1008c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
100933650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
101033650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
1011c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
1012c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
1013c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
1014c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1015c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1016ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1017ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1018ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1019ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1020ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
1021c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
102233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
1023c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
10240ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1025c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1027c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1028f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1029f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1030c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
1031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1032f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1033c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
1034327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1035327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1036327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1037327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1038c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
10390ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1040f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1042c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1044c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
1045c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
1046c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
10470ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
1048c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1049c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1050327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1051327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
1052327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1053c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1054327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1055f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
1056f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
1057c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1058327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1059327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
1060f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1061f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        if(ctx->mAD->isModeOn()) {
1062f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            if(ctx->mAD->draw(ctx, fd, offset)) {
1063f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                fd = ctx->mAD->getDstFd(ctx);
1064f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                offset = ctx->mAD->getDstOffset(ctx);
1065f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            }
1066f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        }
1067f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1068f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1069327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1070327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
1071c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
1072327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1075327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1076327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
1077ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula            ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy);
1078327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1080c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1081c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1082c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1083c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1084c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1085c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1086c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
1087c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1088c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
10891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list,
10901a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
1091c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
10922e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
10939640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah
10949640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1095f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1096f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
1097f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
1098f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
1099f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
11001a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) {
1101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
11021a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) {
1103f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
1104f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1106c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1107c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
1108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1109c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
11101a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahbool MDPCompHighRes::arePipesAvailable(hwc_context_t *ctx,
11111a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
11121a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
11131a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11141a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    for(int i = 0; i < Overlay::MIXER_MAX; i++) {
11151a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int numPipesNeeded = pipesNeeded(ctx, list, i);
11161a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int availPipes = ov.availablePipes(mDpy, i);
11171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        //Reserve pipe(s)for FB
11191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(mCurrentFrame.fbCount)
11201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            availPipes -= 1;
11211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(numPipesNeeded > availPipes) {
11231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
11241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     "dpy %d mixer %d needed %d, avail %d",
11251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     __FUNCTION__, mDpy, i, numPipesNeeded, availPipes);
11261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            return false;
11271a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        }
11281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
11291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
11301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah}
11311a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1132c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
11332e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        MdpPipeInfoHighRes& pipe_info,
11342e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        ePipeType type) {
11352e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
11369640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1137f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1138f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
11391a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.lIndex = ovutils::OV_INVALID;
11401a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.rIndex = ovutils::OV_INVALID;
11411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if (dst.left < lSplit) {
11431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT);
1144f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
1145f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
11461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
11471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
11481a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(dst.right > lSplit) {
11491a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT);
11501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID)
1151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1152f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
11531a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
1155c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1156c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1157c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
115820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
115920242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
116020242a75d65c410071434d639266311376a5b7f6Saurabh Shah
116120242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
1162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
11635a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
11645a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
11651bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
11661bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1167c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
11683393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1169c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
1170c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1171c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
117220242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
117320242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
11741ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
117511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
117620242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1177c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
117820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
1179c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1180c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
118120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
118220242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
118316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
118416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1187c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
11881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1189c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1190c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1191c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1192c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
11932e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        PipeLayerPair& PipeLayerPair) {
1194327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
1195f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
1196327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1197327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1198327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1199327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1200327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1201f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1202f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1203f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1204f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1205f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1207c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1208c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1210c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
121216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
121316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1214c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1215c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1216c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1217c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
121816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1219c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1220c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1221ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1222ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1223ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1224ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1225ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
122616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
122733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
122816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
122916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
123016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1232c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1235c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1238660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1239327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1240327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1241327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1242327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1243327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1244c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
124516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1247c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1250f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1251c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
1252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1254327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1255c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1256c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1258327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1259327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1260327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1261f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        if(ctx->mAD->isModeOn()) {
1262f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            if(ctx->mAD->draw(ctx, fd, offset)) {
1263f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                fd = ctx->mAD->getDstFd(ctx);
1264f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                offset = ctx->mAD->getDstOffset(ctx);
1265f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            }
1266f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        }
1267f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1268327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1269327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1270327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1271327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1272327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1273c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1274c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1275c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1276c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1277327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1279327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1280327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1281327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1283c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1284c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1285c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1286c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1287c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1288327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1289f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1290327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1291327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1292327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1293c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1294c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1295327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
129616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1297c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1298327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
129916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1301c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1302c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1303