hwc_mdpcomp.cpp revision 1b28b60e15c27fee703a16fbd1e42e3b41b031fd
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h>
20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
23361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h"
24591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
26699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h"
27f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h"
28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
3011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
35327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
36327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
43e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true;
44bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::sEnablePartialFrameUpdate = false;
45f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
468eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahfloat MDPComp::sMaxBw = 2.3f;
478eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::sCompBytesClaimed = 0;
48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
49f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahMDPComp* MDPComp::getObject(hwc_context_t *ctx, const int& dpy) {
50f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    if(isDisplaySplit(ctx, dpy)) {
51f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        return new MDPCompSplit(dpy);
52c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
53f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return new MDPCompNonSplit(dpy);
54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
5516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
56f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
60bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran    if(mCurrentFrame.layerCount > MAX_NUM_APP_LAYERS)
61bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran        return;
62bae2ff236d510b0ffad6d5caf3b90bef794ce66fJeykumar Sankaran
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 0) ? "\"PRIMARY\"" :
65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                (mDpy == 1) ? "\"EXTERNAL\"" : "\"VIRTUAL\"");
66efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d "
67efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                "fbCount:%2d \n", mCurrentFrame.layerCount,
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
79bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                     mCurrentFrame.layerToMDP[index],
80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
81bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (mCurrentFrame.drop[index] ? "DROP" :
82bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (mCurrentFrame.needsRedraw ? "GLES" : "CACHE")) : "MDP"),
83f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
84f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
85f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
95c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
99f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
104e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    sEnableMixedMode = true;
105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) &&
106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        sEnableMixedMode = false;
109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
110e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
116bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(property_get("persist.hwc.partialupdate.enable", property, NULL) > 0) {
117bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if((atoi(property) != 0) && ctx->mMDP.panel == MIPI_CMD_PANEL &&
118bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran           qdutils::MDPVersion::getInstance().is8x74v2())
119bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            sEnablePartialFrameUpdate = true;
120bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGE_IF(isDebug(), "%s: Partial Update applicable?: %d",__FUNCTION__,
122bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                                    sEnablePartialFrameUpdate);
123bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
124f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
12511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
12611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
12711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
12811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
129f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(property_get("debug.mdpcomp.bw", property, "0") > 0) {
1328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        float val = atof(property);
1338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(val > 0.0f) {
1348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            sMaxBw = val;
1358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
1368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
1378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
1386bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed    if(ctx->mMDP.panel != MIPI_CMD_PANEL) {
1396bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        // Idle invalidation is not necessary on command mode panels
1406bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        long idle_timeout = DEFAULT_IDLE_TIME;
1416bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
1426bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            if(atoi(property) != 0)
1436bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                idle_timeout = atoi(property);
1446bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
145c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1466bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        //create Idle Invalidator only when not disabled through property
1476bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idle_timeout != -1)
1486bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator = IdleInvalidator::getInstance();
149c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1506bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        if(idleInvalidator == NULL) {
1516bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            ALOGE("%s: failed to instantiate idleInvalidator object",
1526bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed                  __FUNCTION__);
1536bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        } else {
1546bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed            idleInvalidator->init(timeout_handler, ctx, idle_timeout);
1556bdc0c9dd2e7dbd8b6fafc7a94f05889a3abf5f1Naseer Ahmed        }
156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
158c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
160699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
161699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCurrentFrame.reset(numLayers);
162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.cacheAll(list);
163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah}
165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah
166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
174359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
180359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
187f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
189f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
190f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
191f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
194bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Drop the layer when its already present in FB OR when it lies
195bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             * outside frame's ROI */
196bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw || mCurrentFrame.drop[index]) {
197f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
198bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            }
199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
201c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
20216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
203f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
204af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
205f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
207af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
208af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
214c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
219af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
221af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
224ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
228af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
238af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
239f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
244af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
246efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    fbCount = 0;
247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = -1;
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mdpCount = curFrame.mdpCount;
260efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    fbCount = curFrame.fbCount;
261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = curFrame.fbZ;
263c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
265efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer) {
266efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
267efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((not isYuvBuffer(hnd) and has90Transform(layer)) or
268efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        (not isValidDimension(ctx,layer))
269efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        //More conditions here, SKIP, sRGB+Blend etc
270efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ) {
271efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
272efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
273efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    return true;
274efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah}
275efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
2761b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
27741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
2780ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2800ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
2810ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2830ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2840ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
285f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
286f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
28841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
28941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
29041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
29141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
29241269096daf2363b16dcd89627dd674529a26601Saurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
29341269096daf2363b16dcd89627dd674529a26601Saurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
29441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
2950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2960ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
2970ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
2980ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
2990ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
30041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
30141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
3020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
303f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
304f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
305f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
3061b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
3071b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
3081b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
309f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3100ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3110ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const uint32_t downscale =
31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        /* Workaround for downscales larger than 4x.
31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah         * Will be removed once decimator block is enabled for MDSS
31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah         */
31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah                    h_dscale > downscale)
32141269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
32241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        } else {
32341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(w_dscale > 64 || h_dscale > 64)
32441269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
32541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
32641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    } else { //A-family
32741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(w_dscale > downscale || h_dscale > downscale)
32841269096daf2363b16dcd89627dd674529a26601Saurabh Shah            return false;
32941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
33041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3310ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3320ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3330ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type,
3351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
336c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
337c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
338c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
339c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
3411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer);
342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
3471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer);
348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
352f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
3571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer);
358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
360f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
363c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
364c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
366af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
367e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
368f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
371af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
37256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    } else if(qdutils::MDPVersion::getInstance().is8x26() &&
373361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mVideoTransFlag && ctx->mVirtualDisplay->isConnected()) {
37456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        //1 Padding round to shift pipes across mixers
37556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
37656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah                __FUNCTION__);
37756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ret = false;
378361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    } else if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring ||
379361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran              ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring) {
380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
382af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
383af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
384586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
385586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
386af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
387586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
388af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
389f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
390f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
391bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranbool MDPComp::validateAndApplyROI(hwc_context_t *ctx,
392bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                               hwc_display_contents_1_t* list, hwc_rect_t roi) {
393bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
394bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
395bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!isValidRect(roi))
396bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return false;
397bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
398bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++){
399bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        const hwc_layer_1_t* layer =  &list->hwLayers[i];
400bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
401bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        hwc_rect_t dstRect = layer->displayFrame;
402bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        hwc_rect_t srcRect = layer->sourceCrop;
403bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int transform = layer->transform;
404bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        trimLayer(ctx, mDpy, transform, srcRect, dstRect);
405bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
406bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        hwc_rect_t res  = getIntersection(roi, dstRect);
407bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
408bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int res_w = res.right - res.left;
409bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int res_h = res.bottom - res.top;
410bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int dst_w = dstRect.right - dstRect.left;
411bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int dst_h = dstRect.bottom - dstRect.top;
412bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
413bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!isValidRect(res)) {
414bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.drop[i] = true;
415bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.dropCount++;
416bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }else {
417bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Reset frame ROI when any layer which needs scaling also needs ROI
418bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             * cropping */
419bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if((res_w != dst_w || res_h != dst_h) &&
420bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran               needsScaling (ctx, layer, mDpy)) {
421bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                ALOGE("%s: Resetting ROI due to scaling", __FUNCTION__);
422bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
423bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                mCurrentFrame.dropCount = 0;
424bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                return false;
425bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            }
426bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }
427bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
428bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    return true;
429bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
430bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
431bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaranvoid MDPComp::generateROI(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
432bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
433bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
434bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!sEnablePartialFrameUpdate) {
435bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
436bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
437bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
438bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(mDpy || isDisplaySplit(ctx, mDpy)){
439bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        ALOGE_IF(isDebug(), "%s: ROI not supported for"
440bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                 "the (1) external / virtual display's (2) dual DSI displays",
441bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                 __FUNCTION__);
442bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
443bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
444bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
445bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(list->flags & HWC_GEOMETRY_CHANGED)
446bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return;
447bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
448bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    struct hwc_rect roi = (struct hwc_rect){0, 0, 0, 0};
449bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    for(int index = 0; index < numAppLayers; index++ ) {
450bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if ((mCachedFrame.hnd[index] != list->hwLayers[index].handle) ||
451bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            isYuvBuffer((private_handle_t *)list->hwLayers[index].handle)) {
452bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            hwc_rect_t dstRect = list->hwLayers[index].displayFrame;
453bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            hwc_rect_t srcRect = list->hwLayers[index].sourceCrop;
454bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            int transform = list->hwLayers[index].transform;
455bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
456bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            /* Intersect against display boundaries */
457bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            trimLayer(ctx, mDpy, transform, srcRect, dstRect);
458bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            roi = getUnion(roi, dstRect);
459bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        }
460bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
461bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
462bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(!validateAndApplyROI(ctx, list, roi)){
463bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        roi = (struct hwc_rect) {0, 0,
464bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    (int)ctx->dpyAttr[mDpy].xres, (int)ctx->dpyAttr[mDpy].yres};
465bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    }
466bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
467bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.x = roi.left;
468bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.y = roi.top;
469bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.w = roi.right - roi.left;
470bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ctx->listStats[mDpy].roi.h = roi.bottom - roi.top;
471bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
472bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: generated ROI: [%d, %d, %d, %d]", __FUNCTION__,
473bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                               roi.left, roi.top, roi.right, roi.bottom);
474bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
478f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
482f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
4831b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan    if(sIdleFallBack && !ctx->listStats[mDpy].secureUI) {
48433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
48533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
48633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
48733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
488f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
492c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
493c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
494c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
495ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
496ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
497ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
498ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        return false;
499ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    }
500ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah
501c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
502c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
503c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
504f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
505efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(isYuvBuffer(hnd) && has90Transform(layer)) {
506efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            if(!canUseRotator(ctx, mDpy)) {
507efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                ALOGD_IF(isDebug(), "%s: Can't use rotator for dpy %d",
508efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                        __FUNCTION__, mDpy);
50986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar                return false;
51086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar            }
511c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
5122902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula
5132902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp
5142902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        // may not need it if Gfx pre-rotation can handle all flips & rotations
5152902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        if(qdutils::MDPVersion::getInstance().is8x26() &&
5162902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (ctx->dpyAttr[mDpy].xres > 1024) &&
5172902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (layer->transform & HWC_TRANSFORM_FLIP_H) &&
5182902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (!isYuvBuffer(hnd)))
5192902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                   return false;
520c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
521af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
522f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    if(ctx->mAD->isDoable()) {
523f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        return false;
524f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    }
525f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
526af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
528af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
530e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    } else if(partialMDPComp(ctx, list)) {
531af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
532af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
533af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
534af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
535af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
536af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
537efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //Will benefit presentation / secondary-only layer.
538efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((mDpy > HWC_DISPLAY_PRIMARY) &&
539efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            (list->numHwLayers - 1) > MAX_SEC_LAYERS) {
540efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__);
541efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
542efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
543efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
544efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
545efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
546efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
547efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(not isSupportedForMDPComp(ctx, layer)) {
548efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unsupported layer in list",__FUNCTION__);
549efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            return false;
550efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        }
551efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
554bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    memcpy(&mCurrentFrame.isFBComposed, &mCurrentFrame.drop,
555bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran           sizeof(mCurrentFrame.isFBComposed));
556bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount -
557bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        mCurrentFrame.dropCount;
558af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
559bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    if(mCurrentFrame.mdpCount > sMaxPipesPerMixer) {
560af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
561af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
562af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
563af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
565af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
566af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
567af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
5688eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
5698eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
5708eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
5718eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
5728eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
5738eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
574af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
575af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
576af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
577af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
578af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
579af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
580e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
581e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if(!sEnableMixedMode) {
582e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        //Mixed mode is disabled. No need to even try caching.
583e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        return false;
584e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
585e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
586af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
587af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
588af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
589efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
590efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //If an MDP marked layer is unsupported cannot do partial MDP Comp
591efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
592efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
593efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
594efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            if(not isSupportedForMDPComp(ctx, layer)) {
595efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                ALOGD_IF(isDebug(), "%s: Unsupported layer in list",
596efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                        __FUNCTION__);
597efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                return false;
598efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            }
599efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        }
600efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
601efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
60211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, false /*secure only*/);
603efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    bool ret = batchLayers(ctx, list); //sets up fbZ also
604efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if(!ret) {
605efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(),"%s: batching failed, dpy %d",__FUNCTION__, mDpy);
606efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
607efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
608af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
609af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
610efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
611efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    //Will benefit cases where a video has non-updating background.
612efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    if((mDpy > HWC_DISPLAY_PRIMARY) and
613efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            (mdpCount > MAX_SEC_LAYERS)) {
614efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds max secondary pipes",__FUNCTION__);
615efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return false;
616efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    }
617efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
618af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
619af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
620af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
621af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
622af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
6231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
624af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
625af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
626af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
6278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
6288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
6298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
6308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
6318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
6328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
633af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
634af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
635af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
63711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list, bool secureOnly) {
638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
639bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
640af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
64111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    updateYUV(ctx, list, secureOnly);
64241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
643bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int fbNeeded = (mCurrentFrame.fbCount != 0);
644af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
645af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
646af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
647af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
648af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
64941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
65041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
65141269096daf2363b16dcd89627dd674529a26601Saurabh Shah
652af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
653af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
654af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
655af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
6571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(!arePipesAvailable(ctx, list)) {
658af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
659af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
660af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
6618eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = calcMDPBytesRead(ctx, list);
6628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(!bandwidthCheck(ctx, size)) {
6638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds bandwidth",__FUNCTION__);
6648eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        return false;
6658eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
6668eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
667c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
668c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
669c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
672e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating;
673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
674e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    if(isSkipLayer(layer) && !extAnimBlockFeature) {
675e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
677c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
678c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
67986adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    if(layer->transform & HWC_TRANSFORM_ROT_90 && !canUseRotator(ctx,mDpy)) {
68086adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        ALOGD_IF(isDebug(), "%s: no free DMA pipe",__FUNCTION__);
68186adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar        return false;
68286adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar    }
68386adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumar
684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
685f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
68941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
69041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
69141269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
69241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
693c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
69441269096daf2363b16dcd89627dd674529a26601Saurabh Shah
695a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    if(layer->planeAlpha < 0xFF) {
696a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\
697a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 in video only mode",
698a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed                 __FUNCTION__);
699a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed        return false;
700a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed    }
701a8a36dd4c76206acaa0c2a2a9647965c294308c5Naseer Ahmed
702c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
703c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
704c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
705efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahbool MDPComp::batchLayers(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
707f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
709f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
711bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    int maxBatchEnd = -1;
712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
715af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
717efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return true;
718af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
719af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
721efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        return true;
722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
723f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
724bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers excluding dropped
725bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran     * layers */
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
727f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
728f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
729bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        int start = i;
730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
731bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i])
732bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                count++;
733bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            i++;
734f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
735f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
737bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            maxBatchStart = start;
738bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            maxBatchEnd = i - 1;
739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
744bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
745bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
746bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    /* reset rest of the layers lying inside ROI for MDP comp  */
747f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
748efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
749bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if((i < maxBatchStart || i > maxBatchEnd) &&
750bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                    mCurrentFrame.isFBComposed[i]){
751bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i]){
752bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                //If an unsupported layer is being attempted to
753bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                //be pulled out we should fail
754bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                if(not isSupportedForMDPComp(ctx, layer)) {
755bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                    return false;
756bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                }
757bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                mCurrentFrame.isFBComposed[i] = false;
758efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah            }
759f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
760f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
761f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
763bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.fbCount - mCurrentFrame.dropCount;
764f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
766f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
767efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
768efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    return true;
769f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
77011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
771f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
772efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_display_contents_1_t* list) {
773f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
774efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    int fbCount = 0;
775f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
776f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
777efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[i];
778f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
779bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            if(!mCurrentFrame.drop[i])
780bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                fbCount++;
781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
783af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
786c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
787af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
788efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah    mCurrentFrame.fbCount = fbCount;
789bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount
790bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                                    - mCurrentFrame.dropCount;
791efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah
792bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: MDP count: %d FB count %d drop count: %d"
793bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran             ,__FUNCTION__, mCurrentFrame.mdpCount, mCurrentFrame.fbCount,
794bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.dropCount);
795f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
796c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
79711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
79811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        bool secureOnly) {
799f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
800a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
801a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
802a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
803a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
804a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
805a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
806a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
807a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
808a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
818c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
82011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                private_handle_t *hnd = (private_handle_t *)layer->handle;
82111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(!secureOnly || isSecureBuffer(hnd)) {
82211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.isFBComposed[nYuvIndex] = false;
82311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    mCurrentFrame.fbCount--;
82411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
826c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
828af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
829af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
830bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran            mCurrentFrame.fbCount - mCurrentFrame.dropCount;
831bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: fb count: %d",__FUNCTION__,
832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
835af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
836f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
837f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
838af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
841af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
842f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
843af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
845f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
846f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
852f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
853f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
854af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
855f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
856bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        } else if(fbBatch == false && !mCurrentFrame.drop[index]) {
857af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
858af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
859af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
860f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
861f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
862af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
863af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
865af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
866af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
867af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
868af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
869af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
870af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
871af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
872af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
873af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
874af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
875af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
876af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
877af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
878af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
879af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
880af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
881af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
882af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
883af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
884af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
885af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
886af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
887af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
888af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
889f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
890f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
8918eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahuint32_t MDPComp::calcMDPBytesRead(hwc_context_t *ctx,
8928eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_display_contents_1_t* list) {
8938eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    uint32_t size = 0;
8948eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
8954b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson    if(!qdutils::MDPVersion::getInstance().is8x74v2())
8964b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson        return 0;
8974b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson
8988eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    for (uint32_t i = 0; i < list->numHwLayers - 1; i++) {
8998eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
9008eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
9018eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
9024b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            if (hnd) {
9034b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson                hwc_rect_t crop = layer->sourceCrop;
9043d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah                hwc_rect_t dst = layer->displayFrame;
9053d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah                trimLayer(ctx, mDpy, layer->transform, crop, dst);
9064b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson                float bpp = ((float)hnd->size) / (hnd->width * hnd->height);
9073d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah                size += bpp * (crop.right - crop.left) *
9083d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah                    (crop.bottom - crop.top) *
9093d1e5dd4ea42f32fcf7827adfd8a300836289d24Saurabh Shah                    ctx->dpyAttr[mDpy].yres / (dst.bottom - dst.top);
9104b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            }
9118eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
9128eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
9138eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
9148eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(mCurrentFrame.fbCount) {
9158eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[list->numHwLayers - 1];
9168eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
9174b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson        if (hnd)
9184b8c8974e8159e694558db3c8fe2f5c01bd1beefTerence Hampson            size += hnd->size;
9198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
9208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
9218eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return size;
9228eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
9238eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
9248eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahbool MDPComp::bandwidthCheck(hwc_context_t *ctx, const uint32_t& size) {
9258eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    //Will be added for other targets if we run into bandwidth issues and when
9268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    //we have profiling data to set an upper limit.
9278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    if(qdutils::MDPVersion::getInstance().is8x74v2()) {
9288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        const uint32_t ONE_GIG = 1024 * 1024 * 1024;
9298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        double panelRefRate =
9308eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                1000000000.0 / ctx->dpyAttr[mDpy].vsync_period;
9318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        if((size + sCompBytesClaimed) > ((sMaxBw / panelRefRate) * ONE_GIG)) {
9328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            return false;
9338eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        }
9348eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    }
9358eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return true;
9368eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah}
9378eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah
938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
9398eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    int ret = 0;
940af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
941b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
9421a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //reset old data
9431a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCurrentFrame.reset(numLayers);
944bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    memset(&mCurrentFrame.drop, 0, sizeof(mCurrentFrame.drop));
945bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCurrentFrame.dropCount = 0;
946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
9471a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
9481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //do not cache the information for next draw cycle.
9491a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(numLayers > MAX_NUM_APP_LAYERS) {
9501a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
95165cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa        ALOGE("%s: Number of App layers exceeded the limit ",
95265cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa        __FUNCTION__);
9538eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
95465cb14cb14da60eb81fc7a10edfb2edafc0b39f1Tatenda Chipeperekwa        return ret;
9551a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
95689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
9571a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Hard conditions, if not met, cannot do MDP comp
9581a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(!isFrameDoable(ctx)) {
9591a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
9601a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                __FUNCTION__);
9611a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
9628eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
9638eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
9641a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
965af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
966bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    generateROI(ctx, list);
967bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
9681a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //Check whether layers marked for MDP Composition is actually doable.
9691a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    if(isFullFrameDoable(ctx, list)) {
9701a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
9711a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
9721a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
9731a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
974699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                        mCurrentFrame.fbZ)) {
9751a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
976699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
977d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
9788eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
9798eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
98089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
9811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
9821a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Acquire and Program MDP pipes
9831a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programMDP(ctx, list)) {
9841a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            reset(numLayers, list);
985d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
9868eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
9878eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
9881a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        } else { //Success
9891a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            //Any change in composition types needs an FB refresh
9901a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.needsRedraw = false;
9911a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(mCurrentFrame.fbCount &&
9921a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                    ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
993efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                     (mCurrentFrame.fbCount != mCachedFrame.fbCount) ||
9941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
9951a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (!mCurrentFrame.mdpCount) ||
9961a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
997efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah                     isSkipPresent(ctx, mDpy))) {
9981a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                mCurrentFrame.needsRedraw = true;
999699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
10001a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
100111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    } else if(isOnlyVideoDoable(ctx, list, false /*secure only*/) ||
100211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            isOnlyVideoDoable(ctx, list, true /*secure only*/)) {
10031a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //All layers marked for MDP comp cannot be bypassed.
10041a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Try to compose atleast YUV layers through MDP comp and let
10051a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //all the RGB layers compose in FB
10061a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Destination over
10071a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.fbZ = -1;
10081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbCount)
10091a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
10101a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
10111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        mCurrentFrame.map();
10121a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah
10131a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        //Configure framebuffer first if applicable
10141a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(mCurrentFrame.fbZ >= 0) {
10151a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
10161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                ALOGE("%s configure framebuffer failed", __func__);
1017699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
1018d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah                ctx->mOverlay->clear(mDpy);
10198eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                ret = -1;
10208eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah                goto exit;
102189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
10221a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        }
10231a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        if(!programYUV(ctx, list)) {
1024699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            reset(numLayers, list);
1025d0791c8cd9813ec2333acec55f92cbb589f3f7f1Saurabh Shah            ctx->mOverlay->clear(mDpy);
10268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            ret = -1;
10278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah            goto exit;
1028f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
10291a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    } else {
10301a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah        reset(numLayers, list);
10318eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        ret = -1;
10328eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah        goto exit;
10331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    }
1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
10351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    //UpdateLayerFlags
10361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    setMDPCompLayerFlags(ctx, list);
1037bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran    mCachedFrame.cacheAll(list);
10381a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
1039f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
104089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    // unlock it before calling dump function to avoid deadlock
1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
1042af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
1045f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
1046c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1047c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
10488eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shahexit:
10498eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    sCompBytesClaimed += calcMDPBytesRead(ctx, list);
10508eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    return ret;
1051c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1052c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1053f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompNonSplit===================================================
1054c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1055c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
1056c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
1057c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
1058f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompNonSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
1059f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
1060f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoNonSplit& mdp_info =
1061f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoNonSplit*>(PipeLayerPair.pipeInfo));
1062327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
1063327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1065327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
1066327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
1068f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
1069f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1070f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureNonSplit(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
1072c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1073c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1074f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::arePipesAvailable(hwc_context_t *ctx,
10751a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
10761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
10771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int numPipesNeeded = mCurrentFrame.mdpCount;
10781a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    int availPipes = ov.availablePipes(mDpy, Overlay::MIXER_DEFAULT);
10791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
10801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    //Reserve pipe for FB
10811a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(mCurrentFrame.fbCount)
10821a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        availPipes -= 1;
10831a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
10841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(numPipesNeeded > availPipes) {
10851a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes, dpy %d needed %d, avail %d",
10861a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                __FUNCTION__, mDpy, numPipesNeeded, availPipes);
10871a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        return false;
10881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
10891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
109011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(not areVGPipesAvailable(ctx, list)) {
109111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
109211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
109311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
109411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    return true;
109511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah}
109611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
109711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompNonSplit::areVGPipesAvailable(hwc_context_t *ctx,
109811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list) {
109911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
110011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int pipesNeeded = 0;
110111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
110211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
110311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
110411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_rect_t dst = layer->displayFrame;
110511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
110611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            if(isYuvBuffer(hnd)) {
110711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                pipesNeeded++;
110811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            }
110911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        }
111011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
111111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
111211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
111311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(pipesNeeded > availableVGPipes) {
111411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
111511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                "dpy %d needed %d, avail %d",
111611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
111711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
111811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
111911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
11201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
1121c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
112216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
1123f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::allocLayerPipes(hwc_context_t *ctx,
112420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
112520242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
1126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1127f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
112820242a75d65c410071434d639266311376a5b7f6Saurabh Shah
1129c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
1130c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
1131f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
1132f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1133f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoNonSplit;
1134327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
1135f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo;
1136f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1137f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
113820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
113920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
11401ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
114111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
114211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1143f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
1144f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
1145f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
11461a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
1147c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
114820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
114920242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
1150c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
1151c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1152c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1153c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
1154c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1155c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1156f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompNonSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1157c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
1159c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
1160c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
116133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
116233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
1163c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
1164c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
1165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
1166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1168ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1169ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1170ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1171ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1172ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
1173c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
117433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
1175c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
11760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1177c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
1178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1179c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1180f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1182c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
1183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1184f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1185c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
1186327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1187327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1188327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1189327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1190c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
11910ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
1192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1194f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoNonSplit& pipe_info =
1195f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah            *(MdpPipeInfoNonSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1196c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
1197c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
1198c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
11990ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
1200c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1201c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1202327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1203327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
1204327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1205c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1206327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
1208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
1209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1210327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1211327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
1212f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1214327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1215327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
1216c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
1217327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1218327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1219327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1220327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1221327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
1222ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula            ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy);
1223327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1224c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1225c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1226c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1228c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1229c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1231f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//=============MDPCompSplit===================================================
1232c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1233f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::pipesNeeded(hwc_context_t *ctx,
12341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list,
12351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int mixer) {
1236c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
12372e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
12389640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah
12399640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
1242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
1243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
1244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
12451a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            if(mixer == Overlay::MIXER_LEFT && dst.left < lSplit) {
1246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
12471a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            } else if(mixer == Overlay::MIXER_RIGHT && dst.right > lSplit) {
1248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
1249f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1250f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1251c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1252c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
1253c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1255f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::arePipesAvailable(hwc_context_t *ctx,
12561a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        hwc_display_contents_1_t* list) {
12571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
125801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    int totalPipesNeeded = 0;
12591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
12601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    for(int i = 0; i < Overlay::MIXER_MAX; i++) {
12611a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int numPipesNeeded = pipesNeeded(ctx, list, i);
12621a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        int availPipes = ov.availablePipes(mDpy, i);
12631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
12641a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        //Reserve pipe(s)for FB
12651a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(mCurrentFrame.fbCount)
126601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah            numPipesNeeded += 1;
12671a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
126801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        totalPipesNeeded += numPipesNeeded;
126901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
127001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        //Per mixer check.
12711a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(numPipesNeeded > availPipes) {
12721a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
12731a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     "dpy %d mixer %d needed %d, avail %d",
12741a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     __FUNCTION__, mDpy, i, numPipesNeeded, availPipes);
12751a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            return false;
12761a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        }
12771a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
127801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
127901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    //Per display check, since unused pipes can get counted twice.
128001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    int totalPipesAvailable = ov.availablePipes(mDpy);
128101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    if(totalPipesNeeded > totalPipesAvailable) {
128201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient pipes for "
128301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah                "dpy %d needed %d, avail %d",
128401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah                __FUNCTION__, mDpy, totalPipesNeeded, totalPipesAvailable);
128501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah        return false;
128601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah    }
128701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah
128811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(not areVGPipesAvailable(ctx, list)) {
128911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
129011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
129111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
129211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    return true;
129311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah}
129411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
129511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahbool MDPCompSplit::areVGPipesAvailable(hwc_context_t *ctx,
129611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        hwc_display_contents_1_t* list) {
129711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
129811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int pipesNeeded = 0;
129911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
130011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
130111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
130211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
130311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            hwc_rect_t dst = layer->displayFrame;
130411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            private_handle_t *hnd = (private_handle_t *)layer->handle;
130511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            if(isYuvBuffer(hnd)) {
130611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(dst.left < lSplit) {
130711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    pipesNeeded++;
130811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
130911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                if(dst.right > lSplit) {
131011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                    pipesNeeded++;
131111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                }
131211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah            }
131311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        }
131411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
131511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
131611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    int availableVGPipes = ov.availablePipes(mDpy, ovutils::OV_MDP_PIPE_VG);
131711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    if(pipesNeeded > availableVGPipes) {
131811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient VG pipes for video layers"
131911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                "dpy %d needed %d, avail %d",
132011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah                __FUNCTION__, mDpy, pipesNeeded, availableVGPipes);
132111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah        return false;
132211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah    }
132311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah
13241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    return true;
13251a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah}
13261a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1327f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
1328f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info,
13292e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        ePipeType type) {
13302e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
13319640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah    const int lSplit = getLeftSplit(ctx, mDpy);
1332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
13341a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.lIndex = ovutils::OV_INVALID;
13351a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    pipe_info.rIndex = ovutils::OV_INVALID;
13361a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
13371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if (dst.left < lSplit) {
13381a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT);
1339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
1340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
13411a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    }
13421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
13431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    if(dst.right > lSplit) {
13441a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT);
13451a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID)
1346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
13481a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
1350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1352f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::allocLayerPipes(hwc_context_t *ctx,
135320242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
135420242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
135520242a75d65c410071434d639266311376a5b7f6Saurabh Shah
135620242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
1357c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
13585a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
13595a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
13601bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
13611bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1362f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        info.pipeInfo = new MdpPipeInfoSplit;
13633393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1364f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo;
1365c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1366c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
136720242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
136820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
136944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan        } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy)
137011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
137120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1372c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
137320242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
1374c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1375c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
137620242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
137720242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
137816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
137916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1380c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1381c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1382c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
13831a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah
1384c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1385c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1387f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint MDPCompSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
13882e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        PipeLayerPair& PipeLayerPair) {
1389f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    MdpPipeInfoSplit& mdp_info =
1390f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        *(static_cast<MdpPipeInfoSplit*>(PipeLayerPair.pipeInfo));
1391327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1392327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1393327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1394327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1395327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1400f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    return configureSplit(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1401f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1402c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1403c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1404f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool MDPCompSplit::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1405c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1406f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
140716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
140816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1409c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1410c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1411c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1412c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
141316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1416ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1417ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1418ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1419ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1420ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
142116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
142233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
142316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
142416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
142516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1426f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1427c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1429f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1431f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1432f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1433660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1434327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1435327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1436327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1437327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1438327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1439c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
144016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1441c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1442c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1443c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1445f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1446f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah        MdpPipeInfoSplit& pipe_info =
1447f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah            *(MdpPipeInfoSplit*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1448f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1449327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1450c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1451c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1452f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1453327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1454327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1455327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1456f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        if(ctx->mAD->isModeOn()) {
1457f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            if(ctx->mAD->draw(ctx, fd, offset)) {
1458f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                fd = ctx->mAD->getDstFd(ctx);
1459f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah                offset = ctx->mAD->getDstOffset(ctx);
1460f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah            }
1461f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah        }
1462f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
1463327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1464327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1465327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1466327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1467327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1468c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1469c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1470c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1471c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1472327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1474327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1475327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1476327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1477c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1478c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1479c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1480c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1481c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1482c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1483327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1484f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1485327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1486327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1487327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1489c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1490327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
149116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1492c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1493327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
149416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1495c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1496c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1497c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1498