hwc_mdpcomp.cpp revision 1b9b395878eee6052ce3c382c4a3067b5adb13c4
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
19c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
21bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
22591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
238b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
24327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
278fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
2916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
30c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
31327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
33c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
34c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
3816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
39f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
41f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) {
42c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(width <= MAX_DISPLAY_DIM) {
43f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompLowRes(dpy);
44c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    } else {
45f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompHighRes(dpy);
46c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
47c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
4816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
49f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
50f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
51c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
53f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\"");
55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
77c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!setupBasePipe(ctx)) {
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
96f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
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;
225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    needsRedraw = false;
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) {
2670ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
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
2780ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t sourceCrop = layer->sourceCrop;
2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t displayFrame = layer->displayFrame;
2800ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2810ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t crop =  sourceCrop;
2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
2830ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
2840ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t dst = displayFrame;
2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
290f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_rect_t scissor = {0, 0, hw_w, hw_h };
291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
292f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        crop_w = crop.right - crop.left;
293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        crop_h = crop.bottom - crop.top;
2940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
296f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
297f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
298f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
2991b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
3001b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
3011b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
302f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3060ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3070ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
308c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
309c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
310c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
311c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
312c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
313f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
314f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy);
315f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
317f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
319f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
321f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
323f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
327f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy);
331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
334c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
335c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
336c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
337c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
340af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
341f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
344af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
345af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->mExtDispConfiguring) {
346c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
348af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
349af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->listStats[mDpy].needsAlphaScale
350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       && ctx->mMDP.version < qdutils::MDSS_V5) {
351f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
352af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
353af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
354586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
355586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
356af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
357af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(sIdleFallBack) {
358af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        sIdleFallBack = false;
359af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
360af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
361586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
362586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah
363af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
366f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
367f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
368f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
371af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
377c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
378c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
380af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
381af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
382af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
383c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
384c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
385c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
391c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
392f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
393f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        if(layer->transform & HWC_TRANSFORM_ROT_90 && !isYuvBuffer(hnd)) {
394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
396c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
397c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
3981b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N        if(!isYuvBuffer(hnd) && !isValidDimension(ctx,layer)) {
399c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",__FUNCTION__);
400c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
401c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
403af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
404af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
405af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
406af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
407af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
408af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if (partialMDPComp(ctx, list)) {
409af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
410af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
411af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
412af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
414af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
415af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
416af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
417af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
418af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
419af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
420af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
422af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
423af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
427af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
429af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
431af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
433af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
434af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
441af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    batchLayers(); //sets up fbZ also
447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hwc_display_contents_1_t* list){
468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount;
472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
491c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
492c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
493c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
494f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
495f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
496f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
497f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipLayer(layer)) {
498f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__);
499f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
500c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
501c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
502f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
503f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
504f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
505f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
506f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
5078fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah    if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
5088fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        const uint32_t downscale =
5098fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah                qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
510f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_rect_t crop = layer->sourceCrop;
511f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_rect_t dst = layer->displayFrame;
512f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int cWidth = crop.right - crop.left;
513f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int cHeight = crop.bottom - crop.top;
514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int dWidth = dst.right - dst.left;
515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int dHeight = dst.bottom - dst.top;
516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
517b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar        if(layer->transform & HAL_TRANSFORM_ROT_90) {
518b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar            swap(cWidth, cHeight);
519b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar        }
520b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar
5218fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        if(cWidth > MAX_DISPLAY_DIM || (cWidth/dWidth) > downscale ||
5228fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah                    (cHeight/dHeight) > downscale)
523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
524c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
525c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
526c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
527c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
530f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
534f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
537af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
538af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
540af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
542af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
543af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return;
544af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
551f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
552f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
553f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
556af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
571af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
572af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
57711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
589af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
592c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
593af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
595af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
596af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
599c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
602c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
603c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAvailable = ov.availablePipes(mDpy);
605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve DMA for rotator
60711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE)
608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= numDMAPipes;
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve pipe(s)for FB
611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount)
612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= pipesForFB();
613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return numAvailable;
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
618c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
629c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
634c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
637af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
643af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
646af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
648f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
649af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
651af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
654f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
656f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
662af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
664af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        } else if(fbBatch == false) {
665af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
666af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
667af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
670af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
671af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
673af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
674af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
675af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
676af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
677af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
678af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
679af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
680af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
684af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
686af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
687af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
689af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
690af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
692af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
699f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
700f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
701f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //reset old data
702af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
703af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numLayers);
704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
705af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Hard conditions, if not met, cannot do MDP comp
706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFrameDoable(ctx)) {
707f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
710af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.cacheAll(list);
711af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Check whether layers marked for MDP Composition is actually doable.
716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(isFullFrameDoable(ctx, list)){
717af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(mCurrentFrame.mdpCount) {
718af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.map();
719af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            //Acquire and Program MDP pipes
720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(!programMDP(ctx, list)) {
721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mCurrentFrame.reset(numLayers);
722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mCachedFrame.cacheAll(list);
723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
724af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(isOnlyVideoDoable(ctx, list)) {
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //All layers marked for MDP comp cannot be bypassed.
727f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Try to compose atleast YUV layers through MDP comp and let
728f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //all the RGB layers compose in FB
729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        //Destination over
730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(mCurrentFrame.fbCount)
732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount;
733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.map();
735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!programYUV(ctx, list)) {
736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.reset(numLayers);
737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCachedFrame.cacheAll(list);
738f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else {
740af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
741af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.cacheAll(list);
742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
744f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Any change in composition types needs an FB refresh*/
745f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount &&
746af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
747af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
748af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
749af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            (!mCurrentFrame.mdpCount) ||
750af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            (list->flags & HWC_GEOMETRY_CHANGED) ||
751af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            isSkipPresent(ctx, mDpy) ||
752af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            (mDpy > HWC_DISPLAY_PRIMARY))) {
753f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCurrentFrame.needsRedraw = true;
754c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
755c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //UpdateLayerFlags
757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    setMDPCompLayerFlags(ctx, list);
758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
759f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
760f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
761af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
762f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
763f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
764f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
765c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
766c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.fbZ;
768c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
769c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
770c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
771c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
772c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
773c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
774c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
775c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
776f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
777327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
778f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
779327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
780327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
781327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
782327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
783327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
787f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
788f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
789c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
790c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
791c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
792f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
793f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.mdpCount;
794c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
79516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
796c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
797f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                    hwc_display_contents_1_t* list) {
798f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isYuvPresent(ctx, mDpy)) {
799f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvCount = ctx->listStats[mDpy].yuvCount;
800c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
801f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        for(int index = 0; index < nYuvCount ; index ++) {
802f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
803c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
804f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex])
805f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                continue;
806413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar
807c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
808f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex];
810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
812c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            info.pipeInfo = new MdpPipeInfoLowRes;
813327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            info.rot = NULL;
814c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
816c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG);
817c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            if(pipe_info.index == ovutils::OV_INVALID) {
818c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos",
819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         __FUNCTION__);
820c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
821c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            }
822c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
82316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
82416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) {
826f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
827c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
828c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
8290114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed
830c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(isYuvBuffer(hnd))
831c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            continue;
832c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
835f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
836c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
837327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
838c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
839c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
840f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
841f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
84211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(!qhwc::needsScaling(layer)
84311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
84411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
845f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
846f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
847f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
848f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
849c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
850c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
851c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
852c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
853c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
854c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
856c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
859f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
860c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
861c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
86233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
86333650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
866c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
867c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
868c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
870f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
8720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
873c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
875c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
876f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
877f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
878c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
879f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
882327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
883327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
884327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
885327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
886c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
8870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
888f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
889f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
891f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
8950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
897c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
898327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
899327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
900327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
901c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
902327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
903f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
904f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
905c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
907327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
908f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
909327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
910327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
911c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
912327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
913327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
915327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
917327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
918327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
920c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
921c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
922c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
925c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
926c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
927c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
928c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
929f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list) {
930c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
932f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
933f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
934f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
935f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
936f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(dst.left > hw_w/2) {
938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else if(dst.right <= hw_w/2) {
940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
941f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else {
942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded += 2;
943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
944f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
945c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
946c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
947c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
948c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
949c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
950f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     MdpPipeInfoHighRes& pipe_info,
951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     ePipeType type) {
952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
953f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(dst.left > hw_w/2) {
956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = ovutils::OV_INVALID;
957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
958f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID)
959f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else if (dst.right <= hw_w/2) {
961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = ovutils::OV_INVALID;
962f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
963f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
965f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else {
966f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID ||
969f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           pipe_info.lIndex == ovutils::OV_INVALID)
970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
971f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
972f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
974c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
975c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
976f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     hwc_display_contents_1_t* list) {
97716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
978f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int layer_count = ctx->listStats[mDpy].numAppLayers;
979c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
980f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isYuvPresent(ctx, mDpy)) {
981f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvCount = ctx->listStats[mDpy].yuvCount;
9825a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran
9835a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        for(int index = 0; index < nYuvCount; index ++) {
984f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
9855a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
986f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex];
987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            info.pipeInfo = new MdpPipeInfoHighRes;
9883393d793e88663ee9147b04e11289020be3721c9Saurabh Shah            info.rot = NULL;
989c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) {
991c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos",
992f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         __FUNCTION__);
993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                //TODO: windback pipebook data on fail
9945a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran                return false;
9955a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            }
9965a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            pipe_info.zOrder = nYuvIndex;
997c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
998c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
999c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
100016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
10015a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
10025a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
10035a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran
10045a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        if(isYuvBuffer(hnd))
100516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            continue;
1006c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1007f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[index];
1008c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
10093393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
1010c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
1011c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1012c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
1013c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
101411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(!qhwc::needsScaling(layer)
101511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
101611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5)
1017c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
1018c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1019c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
102016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
1021c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            //TODO: windback pipebook data on fail
102216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
102316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
102416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = index;
1025c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1026c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1027c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1028c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1029c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1030c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1031c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
1032f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              PipeLayerPair& PipeLayerPair) {
1033327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
1035327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1036327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1037327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1038327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1039327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1040f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1045f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1047c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1048c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1049c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
105116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
105216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1053c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1054c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1055c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1056c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
105716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1058c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1059c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
106016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
1061f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
106216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
106316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
106416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1065f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1066c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1068f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1069c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1070f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1072660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1075327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1076327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1077327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1078c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
107916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1080c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1081c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1082c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1085c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1088327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1089c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1090c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1092327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1093327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1094327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1096327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1097327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1098327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1099327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1100c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1101c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1102c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1103c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1104327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1106327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1107327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1108327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1109c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1110c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1111c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1112c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1113c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1114c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1115327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1117327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1118327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1119327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1122327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
112316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1125327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
112616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1130