hwc_mdpcomp.cpp revision 699929775d0f2612670fe7f07ceda438c7f7d502
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"
23591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
248b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
25699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h"
26327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
27c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
298fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
33327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
34327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
35c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
36c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
4016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
41e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true;
42f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
43c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
442e474227e216ee37ab84a3c9a22ea1f650626231Saurabh ShahMDPComp* MDPComp::getObject(const int& width, const int& rightSplit,
452e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        const int& dpy) {
462e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    if(width > MAX_DISPLAY_DIM || rightSplit) {
47f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompHighRes(dpy);
48c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
492e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    return new MDPCompLowRes(dpy);
50c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
5116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
52f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
53f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
54c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
55c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
5652e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula    Locker::Autolock _l(mMdpCompLock);
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\"");
59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
94f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
976387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        if(!setupBasePipe(ctx)) {
986387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
996387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            return false;
1006387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        }
101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
103e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    sEnableMixedMode = true;
104e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) &&
105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        sEnableMixedMode = false;
108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
110c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sDebugLogs = false;
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
116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
11711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
11811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
11911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
12011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
121f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
122f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1239336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam    long idle_timeout = DEFAULT_IDLE_TIME;
124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            idle_timeout = atoi(property);
127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
1299336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam    //create Idle Invalidator only when not disabled through property
1309336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam    if(idle_timeout != -1)
1319336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam        idleInvalidator = IdleInvalidator::getInstance();
132c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
133c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(idleInvalidator == NULL) {
134f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__);
135c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
136c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        idleInvalidator->init(timeout_handler, ctx, idle_timeout);
137c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
138c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
141699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) {
142699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCurrentFrame.reset(numLayers);
143699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.cacheAll(list);
144699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
145699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah}
146699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah
147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
148c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
149c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
151c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
152c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
155359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
156c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
157c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
161359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
164c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
165f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
166f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
168f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
170f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
171f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
172f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
173f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
174f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[index] = NULL;
175f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
176f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw)
177f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
18116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/*
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_stride = ctx->dpyAttr[dpy].stride;
189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
192c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mdp_overlay ovInfo;
194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    msmfb_overlay_data ovData;
195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.width  = fb_width;
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.height = fb_height;
201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.w = fb_width;
202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.h = fb_height;
203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.w = fb_width;
204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.h = fb_height;
205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
208c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
210c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
211c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
212c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
213c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovData.id = ovInfo.id;
214c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
217c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
218c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
219c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
220c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
221f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
224c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
225af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
226af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
229f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
230f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
232c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
233c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
235f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
242ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
257f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
259f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
260f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
261f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
263f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
264f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    cacheCount = 0;
265f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = -1;
267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
270af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
271af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
272af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
273af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
274af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
275af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
276af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
277af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mdpCount = curFrame.mdpCount;
278af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    cacheCount = curFrame.fbCount;
279af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
280af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = curFrame.fbZ;
281c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
282c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
2831b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
28441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2900ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2910ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
292f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
2940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
29541269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
29641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
29741269096daf2363b16dcd89627dd674529a26601Saurabh Shah
29841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
29941269096daf2363b16dcd89627dd674529a26601Saurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
30041269096daf2363b16dcd89627dd674529a26601Saurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
30141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
3020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
3060ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
3090ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
312f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
3131b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
3141b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
3151b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3170ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3180ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const uint32_t downscale =
32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
32141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
32241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        /* Workaround for downscales larger than 4x.
32341269096daf2363b16dcd89627dd674529a26601Saurabh Shah         * Will be removed once decimator block is enabled for MDSS
32441269096daf2363b16dcd89627dd674529a26601Saurabh Shah         */
32541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
32641269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
32741269096daf2363b16dcd89627dd674529a26601Saurabh Shah                    h_dscale > downscale)
32841269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
32941269096daf2363b16dcd89627dd674529a26601Saurabh Shah        } else {
33041269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(w_dscale > 64 || h_dscale > 64)
33141269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
33241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
33341269096daf2363b16dcd89627dd674529a26601Saurabh Shah    } else { //A-family
33441269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(w_dscale > downscale || h_dscale > downscale)
33541269096daf2363b16dcd89627dd674529a26601Saurabh Shah            return false;
33641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
33741269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3380ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3390ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3400ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
341c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
342c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
343c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
344c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
345c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy);
348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
351f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
352f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
357c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
360f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
361f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
362f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy);
364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
366f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
367c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
368c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
369c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
370c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
372af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
373e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
374f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
377af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
37856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    } else if(qdutils::MDPVersion::getInstance().is8x26() &&
37956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah            ctx->mVideoTransFlag &&
38056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah            ctx->mExtDisplay->isExternalConnected()) {
38156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        //1 Padding round to shift pipes across mixers
38256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round",
38356d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah                __FUNCTION__);
38456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah        ret = false;
385af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->mExtDispConfiguring) {
386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
388af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
389af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
390586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
391586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
393586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
394af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
401f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
402af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
403f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
40433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(sIdleFallBack) {
40533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
40633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
40733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
40833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
410f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
412c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
413c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
414c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
415f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
416af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
417af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
418af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
419c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
420c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
421c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
422ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
423ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
424ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
425ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        return false;
426ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    }
427ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah
428c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
430c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
433c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
434f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
43541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) {
436c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
437c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
438c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
439c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
44041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!isValidDimension(ctx,layer)) {
44141269096daf2363b16dcd89627dd674529a26601Saurabh Shah            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
44241269096daf2363b16dcd89627dd674529a26601Saurabh Shah                __FUNCTION__);
443c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
444c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
4452902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula
4462902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp
4472902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        // may not need it if Gfx pre-rotation can handle all flips & rotations
4482902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula        if(qdutils::MDPVersion::getInstance().is8x26() &&
4492902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (ctx->dpyAttr[mDpy].xres > 1024) &&
4502902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (layer->transform & HWC_TRANSFORM_FLIP_H) &&
4512902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                                (!isYuvBuffer(hnd)))
4522902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula                   return false;
453c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
459e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    } else if(partialMDPComp(ctx, list)) {
460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
493e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
494e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    if(!sEnableMixedMode) {
495e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        //Mixed mode is disabled. No need to even try caching.
496e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran        return false;
497e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran    }
498e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran
499af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    batchLayers(); //sets up fbZ also
504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
511af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
512af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
513af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
514af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
515af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
516af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
517af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
518af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
519af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
520af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
521af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
522af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
523af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
524af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hwc_display_contents_1_t* list){
525af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
526af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
52841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
530af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
531af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
532af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
533af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
534af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
53541269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
53641269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
53741269096daf2363b16dcd89627dd674529a26601Saurabh Shah
538af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
539af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
540af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
542af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
543af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
544af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
545af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
546af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
547af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
548af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
551c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
552c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
553c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
556e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating;
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
558e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    if(isSkipLayer(layer) && !extAnimBlockFeature) {
559e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
561c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
562c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
56841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
56941269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
57041269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
57141269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
572c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
57341269096daf2363b16dcd89627dd674529a26601Saurabh Shah
574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
575c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
576c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
586af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
587af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
589af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
590af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
591af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
592af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return;
593af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
620af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
621af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
62611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
636f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
641c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
642af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
644af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
645af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
648c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
651c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
652c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAvailable = ov.availablePipes(mDpy);
654f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve DMA for rotator
65611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE)
657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= numDMAPipes;
658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve pipe(s)for FB
660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount)
661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= pipesForFB();
662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return numAvailable;
664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
667c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
669a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
670a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
671a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
672a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
673a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
674a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
675a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
676a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
677a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
685f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
687c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
691f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
692c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
693f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
699f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
700f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
702f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
703f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
711f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
721f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        } else if(fbBatch == false) {
723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
724af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
727f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
728af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
740af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
741af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
742af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
743af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
744af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
745af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
746af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
747af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
748af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
749af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
750af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
751af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
752af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
753af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
754af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
755f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
759b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
76089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    { //LOCK SCOPE BEGIN
76189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        Locker::Autolock _l(mMdpCompLock);
76252e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula
76389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        //reset old data
764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
76689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
76789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        //do not cache the information for next draw cycle.
76889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        if(numLayers > MAX_NUM_APP_LAYERS) {
76989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            mCachedFrame.updateCounts(mCurrentFrame);
77089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
77189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                                    __FUNCTION__);
772699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            return -1;
77389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        }
77489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
77589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        //Hard conditions, if not met, cannot do MDP comp
77689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        if(!isFrameDoable(ctx)) {
77789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
77889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                                    __FUNCTION__);
779699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            reset(numLayers, list);
780699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            return -1;
781af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
782af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
78389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        //Check whether layers marked for MDP Composition is actually doable.
78489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        if(isFullFrameDoable(ctx, list)){
78589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            mCurrentFrame.map();
786699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            //Configure framebuffer first if applicable
787699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            if(mCurrentFrame.fbZ >= 0) {
788699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list,
789699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                        mCurrentFrame.fbZ)) {
790699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    ALOGE("%s configure framebuffer failed", __func__);
791699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    reset(numLayers, list);
792699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    return -1;
793699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                }
794699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
79589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            //Acquire and Program MDP pipes
79689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            if(!programMDP(ctx, list)) {
797699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
798699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                return -1;
79989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            } else { //Success
80089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                //Any change in composition types needs an FB refresh
80189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                mCurrentFrame.needsRedraw = false;
80289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                if(mCurrentFrame.fbCount &&
80389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
80489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
80589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
80689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        (!mCurrentFrame.mdpCount) ||
80789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        (list->flags & HWC_GEOMETRY_CHANGED) ||
80889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        isSkipPresent(ctx, mDpy) ||
80989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                        (mDpy > HWC_DISPLAY_PRIMARY))) {
81089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                    mCurrentFrame.needsRedraw = true;
81189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                }
81289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
81389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        } else if(isOnlyVideoDoable(ctx, list)) {
81489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            //All layers marked for MDP comp cannot be bypassed.
81589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            //Try to compose atleast YUV layers through MDP comp and let
81689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            //all the RGB layers compose in FB
81789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            //Destination over
81889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            mCurrentFrame.fbZ = -1;
81989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            if(mCurrentFrame.fbCount)
82089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula                mCurrentFrame.fbZ = mCurrentFrame.mdpCount;
82189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula
82289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            mCurrentFrame.map();
823699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah
824699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            //Configure framebuffer first if applicable
825699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            if(mCurrentFrame.fbZ >= 0) {
826699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) {
827699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    ALOGE("%s configure framebuffer failed", __func__);
828699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    reset(numLayers, list);
829699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    return -1;
830699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                }
831699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
83289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            if(!programYUV(ctx, list)) {
833699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                reset(numLayers, list);
834699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                return -1;
83589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula            }
83689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        } else {
837699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            reset(numLayers, list);
838699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            return -1;
839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
84189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        //UpdateLayerFlags
84289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        setMDPCompLayerFlags(ctx, list);
84389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula        mCachedFrame.updateCounts(mCurrentFrame);
844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
84589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    } //LOCK SCOPE END. dump also need this lock.
84689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula    // unlock it before calling dump function to avoid deadlock
847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
848af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
852c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
854699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah    return 0;
855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
859c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
860c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
861c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
862c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
864327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
865f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
866327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
867327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
868327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
869327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
870327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
871f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
872f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
873f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
875f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
876c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
877c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
878c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
879f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.mdpCount;
881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
88216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
883c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
88420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
88520242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
886c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
887f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
88820242a75d65c410071434d639266311376a5b7f6Saurabh Shah
889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
891f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
892f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
894327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
896f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
897f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
89820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
89920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
9001ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
90111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
90211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
903f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
904f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
905f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
906f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
907c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
90820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
90920242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
911c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
912c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
913c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
914c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
915c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
916c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
917c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
918f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
920c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
92133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
92233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
923c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
924c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
925c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
927c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
928ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
929ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
930ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
931ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
932ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
93352e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula    Locker::Autolock _l(mMdpCompLock);
93452e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula
935c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
93633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
937c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
9380ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
939c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
941c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
944c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
947c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
948327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
949327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
950327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
951327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
952c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
9530ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
956c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
958c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
959c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
960c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
9610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
962c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
963c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
964327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
965327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
966327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
967c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
968327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
969f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
972327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
973327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
974f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
975327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
976327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
978327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
979327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
980327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
981327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
982327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
983ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula            ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy);
984327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
985c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
986c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
988c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
989c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
990c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
991c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
992c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
9952e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        hwc_display_contents_1_t* list) {
996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
9972e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
9982e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    //Default even split for all displays with high res
9992e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    int lSplit = xres / 2;
10002e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    if(mDpy == HWC_DISPLAY_PRIMARY &&
10012e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah            qdutils::MDPVersion::getInstance().getLeftSplit()) {
10022e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        //Override if split published by driver for primary
10032e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        lSplit = qdutils::MDPVersion::getInstance().getLeftSplit();
10042e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    }
1005f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1006f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
1007f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
1008f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
1009f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
10102e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah            if(dst.left > lSplit) {
1011f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
10122e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah            } else if(dst.right <= lSplit) {
1013f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
1014f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else {
1015f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded += 2;
1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
1017f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
1018c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
1019c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
1020c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1021c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1022c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
10232e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        MdpPipeInfoHighRes& pipe_info,
10242e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        ePipeType type) {
10252e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    const int xres = ctx->dpyAttr[mDpy].xres;
10262e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    //Default even split for all displays with high res
10272e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    int lSplit = xres / 2;
10282e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    if(mDpy == HWC_DISPLAY_PRIMARY &&
10292e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah            qdutils::MDPVersion::getInstance().getLeftSplit()) {
10302e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        //Override if split published by driver for primary
10312e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        lSplit = qdutils::MDPVersion::getInstance().getLeftSplit();
10322e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    }
1033f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
10352e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    if(dst.left > lSplit) {
1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = ovutils::OV_INVALID;
1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
1038f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID)
1039f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
10402e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah    } else if (dst.right <= lSplit) {
1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = ovutils::OV_INVALID;
1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1045f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else {
1046f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
1047f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
1048f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID ||
1049f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           pipe_info.lIndex == ovutils::OV_INVALID)
1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
1052f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
1053c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
1054c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1055c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
105620242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
105720242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
105820242a75d65c410071434d639266311376a5b7f6Saurabh Shah
105920242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
1060c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
10615a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
10625a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
10631bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
10641bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
1065c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
10663393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1067c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1069c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
107020242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
107120242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
10721ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
107311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
107420242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
1075c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
107620242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
1077c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1078c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
107920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
108020242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
108116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
108216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1083c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1084c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1085c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1086c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1087c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1088c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1089c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
10902e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah        PipeLayerPair& PipeLayerPair) {
1091327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
1093327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1094327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1096327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1097327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1098f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1099f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1103f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1106c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
110916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
111016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1112c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1113c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1114c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
111516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1116c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1117c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1118ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) {
1119ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__);
1120ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula        return true;
1121ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula    }
1122ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula
112352e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula    Locker::Autolock _l(mMdpCompLock);
112452e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula
112516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
112633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
112716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
112816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
112916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1132f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1133f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1135f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1136f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1137660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1138327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1139327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1140327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1141327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1142327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
114416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1146c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1148f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1150c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
1151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1152f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1153327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1154c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1155c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1157327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1158327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1159327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1160327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1161327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1162327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1163327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1164327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1165c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1166c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1167c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1168c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1169327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1170f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1171327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1172327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1173327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1175c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1177c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1178c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1179c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1180327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1182327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1183327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1184327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1187327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
118816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1189c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1190327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
119116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1193c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1194c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1195