hwc_mdpcomp.cpp revision a0e87cbc523323604e8fb7cb5526f410a1ed26df
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"
25327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
288fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
29327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
33327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
34c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
35c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
3916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
40f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
42f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) {
43c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(width <= MAX_DISPLAY_DIM) {
44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompLowRes(dpy);
45c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    } else {
46f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompHighRes(dpy);
47c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
4916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
50f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
51f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
53c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\"");
56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
91f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
92f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
946387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        if(!setupBasePipe(ctx)) {
956387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
966387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            return false;
976387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        }
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sDebugLogs = false;
101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
105c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
10711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
10811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
10911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
11011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
111f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
112f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    unsigned long idle_timeout = DEFAULT_IDLE_TIME;
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            idle_timeout = atoi(property);
117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //create Idle Invalidator
120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    idleInvalidator = IdleInvalidator::getInstance();
121c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(idleInvalidator == NULL) {
123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__);
124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        idleInvalidator->init(timeout_handler, ctx, idle_timeout);
126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
138359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
144359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
146c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
147c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
148f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
153f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[index] = NULL;
158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
159f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw)
160f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
161c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
162c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
16416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
165c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/*
166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */
169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_stride = ctx->dpyAttr[dpy].stride;
172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mdp_overlay ovInfo;
177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    msmfb_overlay_data ovData;
178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.width  = fb_width;
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.height = fb_height;
184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.w = fb_width;
185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.h = fb_height;
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.w = fb_width;
187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.h = fb_height;
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovData.id = ovInfo.id;
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
199f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
204f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
205af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
208af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
209af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
215c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
216c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
219f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
220af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
225ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
238af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
240f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    cacheCount = 0;
248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = -1;
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
260af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mdpCount = curFrame.mdpCount;
261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    cacheCount = curFrame.fbCount;
262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = curFrame.fbZ;
264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
265c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
2661b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
26741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
2680ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2700ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
2710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
2720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2730ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2740ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
27841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
27941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
28041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
28141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
28241269096daf2363b16dcd89627dd674529a26601Saurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
28341269096daf2363b16dcd89627dd674529a26601Saurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
28441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
29041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
29141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
2920ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
294f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
2961b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
2971b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
2981b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
299f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3000ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3010ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const uint32_t downscale =
30341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
30441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
30541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        /* Workaround for downscales larger than 4x.
30641269096daf2363b16dcd89627dd674529a26601Saurabh Shah         * Will be removed once decimator block is enabled for MDSS
30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah         */
30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
30941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
31041269096daf2363b16dcd89627dd674529a26601Saurabh Shah                    h_dscale > downscale)
31141269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        } else {
31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(w_dscale > 64 || h_dscale > 64)
31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    } else { //A-family
31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(w_dscale > downscale || h_dscale > downscale)
31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah            return false;
31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3230ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
325c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
326c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
327c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
328c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy);
331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
340c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
341f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy);
347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
352c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
353c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
356af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
357f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
360af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
361af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->mExtDispConfiguring) {
362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
364af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
365af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
366586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
367586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
368af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
369af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(sIdleFallBack) {
370af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
371af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
372586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
373586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah
374af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
378f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
380f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
382af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
390f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
391af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
393af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
396c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
397ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
398ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
399ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
400ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        return false;
401ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    }
402ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah
403c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
408c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
409f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
41041269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) {
411c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
412c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
413c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
414c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
41541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!isValidDimension(ctx,layer)) {
41641269096daf2363b16dcd89627dd674529a26601Saurabh Shah            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
41741269096daf2363b16dcd89627dd674529a26601Saurabh Shah                __FUNCTION__);
418c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
419c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
420c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
422af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
423af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if (partialMDPComp(ctx, list)) {
427af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
429af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
431af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
433af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
434af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
441af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    batchLayers(); //sets up fbZ also
465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hwc_display_contents_1_t* list){
486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
48941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
494af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
49641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
49741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
49841269096daf2363b16dcd89627dd674529a26601Saurabh Shah
499af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
511af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
512c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
513c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
514c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
518a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(isSkipLayer(layer) && mDpy == HWC_DISPLAY_PRIMARY) {
519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__);
520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
521c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
522c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
523f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
524f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
527f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
52841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
52941269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
53041269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
53141269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
532c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
53341269096daf2363b16dcd89627dd674529a26601Saurabh Shah
534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
535c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
536c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
538f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
546af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
547af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return;
553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
565af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
580af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
581af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
58611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
598af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
601c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
602af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
608c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
611c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
612c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAvailable = ov.availablePipes(mDpy);
614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve DMA for rotator
61611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE)
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= numDMAPipes;
618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve pipe(s)for FB
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount)
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= pipesForFB();
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return numAvailable;
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
627c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
629a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
630a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
631a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
632a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
633a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
634a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
635a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
636a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
637a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
647c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
648f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
651f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
652c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
654af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
655af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
661af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
664af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
667af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
669af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
680af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        } else if(fbBatch == false) {
683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
684af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
689af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
692af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
697af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
698af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
699af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
702af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
703af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
705af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
706af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
708af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
710af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
711af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
712af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
713af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
714af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //reset old data
720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numLayers);
722f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Hard conditions, if not met, cannot do MDP comp
724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFrameDoable(ctx)) {
725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
727af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
728af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.cacheAll(list);
729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
731f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
732f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
733f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Check whether layers marked for MDP Composition is actually doable.
734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(isFullFrameDoable(ctx, list)){
735ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        mCurrentFrame.map();
736ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        //Acquire and Program MDP pipes
737ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        if(!programMDP(ctx, list)) {
738ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            mCurrentFrame.reset(numLayers);
739ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            mCachedFrame.cacheAll(list);
740ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        } else { //Success
741ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            //Any change in composition types needs an FB refresh
742ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            mCurrentFrame.needsRedraw = false;
743ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            if(mCurrentFrame.fbCount &&
744ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                    ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
745ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
746ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
747ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (!mCurrentFrame.mdpCount) ||
748ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
749ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     isSkipPresent(ctx, mDpy) ||
750ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (mDpy > HWC_DISPLAY_PRIMARY))) {
751ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                mCurrentFrame.needsRedraw = true;
752af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
753af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
754af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(isOnlyVideoDoable(ctx, list)) {
755f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //All layers marked for MDP comp cannot be bypassed.
756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Try to compose atleast YUV layers through MDP comp and let
757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //all the RGB layers compose in FB
758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        //Destination over
759af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
760af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(mCurrentFrame.fbCount)
761af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount;
762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
763af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.map();
764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!programYUV(ctx, list)) {
765af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.reset(numLayers);
766af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCachedFrame.cacheAll(list);
767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
768af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else {
769af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
770af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.cacheAll(list);
771f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
772f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
773f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //UpdateLayerFlags
774f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    setMDPCompLayerFlags(ctx, list);
775af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
776f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
777f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
778af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
779f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
780f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
782c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
783c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.fbZ;
785c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
786c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
787c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
788c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
789c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
790c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
791c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
792c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
793f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
794327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
795f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
796327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
797327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
798327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
799327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
800327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
801f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
802f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
803f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
804f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
805f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
806c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
807c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
808c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.mdpCount;
811c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
81216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
813c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
81420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
81520242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
816c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
81820242a75d65c410071434d639266311376a5b7f6Saurabh Shah
819c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
820c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
822f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
823c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
824327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
825c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
826f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
827f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
82820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
82920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
83020242a75d65c410071434d639266311376a5b7f6Saurabh Shah        } else if(!qhwc::needsScaling(layer)
83111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
83211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
833f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
834f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
835f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
836f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
837c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
83820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
83920242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
840c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
841c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
842c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
843c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
844c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
845c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
846c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
847c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
849c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
850c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
85133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
85233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
854c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
855c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
856c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
857c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
859f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
860c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
8610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
862c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
865f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
866f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
867c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
868f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
869f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
870c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
871327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
872327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
873327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
874327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
875c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
8760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
877f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
878f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
879c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
882c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
883c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
8840ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
885c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
886c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
887327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
888327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
889327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
891327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
892f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
893f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
895327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
896327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
897f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
898327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
899327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
900c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
901327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
902327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
903327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
904327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
907327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
908c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
909c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
911c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
912c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
913c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
914c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
915c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
916c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
917c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
918f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list) {
919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
920f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
923f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
924f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
925f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
926f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(dst.left > hw_w/2) {
927f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
928f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else if(dst.right <= hw_w/2) {
929f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
930f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else {
931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded += 2;
932f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
933f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
934c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
935c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
936c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
937c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
938c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     MdpPipeInfoHighRes& pipe_info,
940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     ePipeType type) {
941f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
944f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(dst.left > hw_w/2) {
945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = ovutils::OV_INVALID;
946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
947f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID)
948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else if (dst.right <= hw_w/2) {
950f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = ovutils::OV_INVALID;
951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
953f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else {
955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID ||
958f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           pipe_info.lIndex == ovutils::OV_INVALID)
959f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
962c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
963c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
964c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
96520242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
96620242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
96720242a75d65c410071434d639266311376a5b7f6Saurabh Shah
96820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
969c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
9705a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
9715a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
972f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[index];
973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
9743393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
975c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
976c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
97820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
97920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
98020242a75d65c410071434d639266311376a5b7f6Saurabh Shah        } else if(!qhwc::needsScaling(layer)
98111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
98220242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
98420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
985c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
986c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
98720242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
98820242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
98916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
99016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
991c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
992c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
993c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
997c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
998f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              PipeLayerPair& PipeLayerPair) {
999327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
1000f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
1001327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1002327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1003327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1004327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1005327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1006f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1007f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1008f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1009f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1010f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1011f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1012c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1013c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1014c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1015c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
101716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
101816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1019c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1020c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1021c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1022c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
102316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1024c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1025c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
102616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
1027f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
102816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
102916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
103016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1032c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1033f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1035c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1038660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1039327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1040327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1041327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1042327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1043327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1044c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
104516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1047c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1048c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1049f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1051c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
1052f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1053f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1054327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1055c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1056c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1057f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1058327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1059327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1060327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1061327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1062327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1063327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1065327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1066c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1067c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1069c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1070327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1072327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1075c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1076c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1077c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1078c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1080c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1081327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1082f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1083327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1084327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1085327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1086c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1087c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1088327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
108916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1090c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1091327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
109216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1093c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1094c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1095c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1096