hwc_mdpcomp.cpp revision b68089410e6856f272c70cc9dbe652e336c82006
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h>
20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
23591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
248b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
25327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
288fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
29327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
3016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
33327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
34c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
35c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
3916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
40f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
42f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) {
43c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(width <= MAX_DISPLAY_DIM) {
44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompLowRes(dpy);
45c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    } else {
46f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompHighRes(dpy);
47c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
4916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
50f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
51f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
53c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\"");
56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
91f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
92f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
946387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        if(!setupBasePipe(ctx)) {
956387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
966387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou            return false;
976387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou        }
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sDebugLogs = false;
101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
105c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
10711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) {
10811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        int val = atoi(property);
10911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah        if(val >= 0)
11011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER);
111f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
112f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    unsigned long idle_timeout = DEFAULT_IDLE_TIME;
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            idle_timeout = atoi(property);
117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //create Idle Invalidator
120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    idleInvalidator = IdleInvalidator::getInstance();
121c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(idleInvalidator == NULL) {
123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__);
124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        idleInvalidator->init(timeout_handler, ctx, idle_timeout);
126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
138359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
144359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
146c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
147c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
148f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
153f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[index] = NULL;
158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
159f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw)
160f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
161c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
162c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
16416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
165c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/*
166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */
169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_stride = ctx->dpyAttr[dpy].stride;
172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mdp_overlay ovInfo;
177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    msmfb_overlay_data ovData;
178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.width  = fb_width;
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.height = fb_height;
184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.w = fb_width;
185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.h = fb_height;
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.w = fb_width;
187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.h = fb_height;
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovData.id = ovInfo.id;
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
199f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
204f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
205af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    reset(0);
206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
208af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
209af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) {
210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
215c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
216c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
219f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
220af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = numLayers;
223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbCount = numLayers;
224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
225ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah    needsRedraw = true;
226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() {
230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    // populate layer and MDP maps
231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!isFBComposed[idx]) {
234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            layerToMDP[idx] = mdpIdx++;
236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
238af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
240f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    cacheCount = 0;
248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = -1;
250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
260af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mdpCount = curFrame.mdpCount;
261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    cacheCount = curFrame.fbCount;
262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    layerCount = curFrame.layerCount;
263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    fbZ = curFrame.fbZ;
264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
265c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
2661b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
26741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
2680ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2700ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
2710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
2720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2730ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2740ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
27841269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
27941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
28041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
28141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
28241269096daf2363b16dcd89627dd674529a26601Saurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
28341269096daf2363b16dcd89627dd674529a26601Saurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
28441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
29041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
29141269096daf2363b16dcd89627dd674529a26601Saurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
2920ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
294f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
2961b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * There also is a HW limilation in MDP, minimum block size is 2x2
2971b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     * Fallback to GPU if height is less than 2.
2981b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N     */
299f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
3000ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
3010ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah    const uint32_t downscale =
30341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            qdutils::MDPVersion::getInstance().getMaxMDPDownscale();
30441269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
30541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        /* Workaround for downscales larger than 4x.
30641269096daf2363b16dcd89627dd674529a26601Saurabh Shah         * Will be removed once decimator block is enabled for MDSS
30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah         */
30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!qdutils::MDPVersion::getInstance().supportsDecimation()) {
30941269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale ||
31041269096daf2363b16dcd89627dd674529a26601Saurabh Shah                    h_dscale > downscale)
31141269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah        } else {
31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah            if(w_dscale > 64 || h_dscale > 64)
31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah                return false;
31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah        }
31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah    } else { //A-family
31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(w_dscale > downscale || h_dscale > downscale)
31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah            return false;
31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah    }
32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah
3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
3230ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
325c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
326c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
327c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
328c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy);
331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
340c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
341f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy);
347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
352c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
353c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
356af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = true;
357f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
360af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
361af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->mExtDispConfiguring) {
362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
364af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
365af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(ctx->isPaddingRound) {
366586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ctx->isPaddingRound = false;
367586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__);
368af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = false;
369586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
370af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
378af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
38033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(sIdleFallBack) {
38133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
38233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah        return false;
38333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    }
38433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah
385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
393af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__,
394af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                isSkipPresent(ctx, mDpy));
395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
396c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
397c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
398ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
399ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
400ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
401ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah        return false;
402ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah    }
403ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah
404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
408c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
409c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
410f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
41141269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) {
412c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
413c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
414c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
415c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
41641269096daf2363b16dcd89627dd674529a26601Saurabh Shah        if(!isValidDimension(ctx,layer)) {
41741269096daf2363b16dcd89627dd674529a26601Saurabh Shah            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
41841269096daf2363b16dcd89627dd674529a26601Saurabh Shah                __FUNCTION__);
419c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
420c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
421c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
422af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
423af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool ret = false;
425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(fullMDPComp(ctx, list)) {
426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
427af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if (partialMDPComp(ctx, list)) {
428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ret = true;
429af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return ret;
431af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
433af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
434af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbCount = 0;
437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.fbZ = -1;
438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
441af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{
460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Setup mCurrentFrame
462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateLayerCache(ctx, list);
464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    batchLayers(); //sets up fbZ also
466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        hwc_display_contents_1_t* list){
487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numAppLayers);
489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    updateYUV(ctx, list);
49041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
494af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
496af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
49741269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!mdpCount)
49841269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
49941269096daf2363b16dcd89627dd674529a26601Saurabh Shah
500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int availPipes = getAvailablePipes(ctx);
507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(numPipesNeeded > availPipes) {
508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
511af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
512af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
513c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
514c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
515c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
518e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating;
519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
520e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah    if(isSkipLayer(layer) && !extAnimBlockFeature) {
521e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah        ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy);
522f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
524c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
527f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
53041269096daf2363b16dcd89627dd674529a26601Saurabh Shah    if(!isValidDimension(ctx, layer)) {
53141269096daf2363b16dcd89627dd674529a26601Saurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
53241269096daf2363b16dcd89627dd674529a26601Saurabh Shah            __FUNCTION__);
53341269096daf2363b16dcd89627dd674529a26601Saurabh Shah        return false;
534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
53541269096daf2363b16dcd89627dd674529a26601Saurabh Shah
536c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
537c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
538c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
548af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.fbCount) {
549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!mCurrentFrame.mdpCount) {
553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = 0;
554af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return;
555af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
567af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
582af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
583af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
58811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
603c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
606af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
607af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
610c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
613c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
614c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAvailable = ov.availablePipes(mDpy);
616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve DMA for rotator
61811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE)
619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= numDMAPipes;
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve pipe(s)for FB
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount)
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= pipesForFB();
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return numAvailable;
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
629c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
631a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan    if(!nYuvCount && mDpy) {
632a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        //Reset "No animation on external display" related  parameters.
633a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top =
634a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0;
635a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top =
636a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0;
637a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        ctx->mPrevTransformVideo = 0;
638a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        return;
639a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan     }
640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
648f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
651f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
654c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
657af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
658af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbCount;
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
663af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
666af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
669af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    bool fbBatch = false;
670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
671af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            index++) {
672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
684af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        } else if(fbBatch == false) {
685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                mdpNextZOrder++;
686af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                fbBatch = true;
687af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
690af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah}
692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        return false;
697af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
698af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
699af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    int mdpIdx = 0;
700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
702af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
703af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            MdpPipeInfo* cur_pipe =
705af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
706af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
708af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            if(configure(ctx, layer,
709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
710af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
711af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                        layer %d",__FUNCTION__, index);
712af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah                return false;
713af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
714af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
715af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    }
716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    return true;
717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
720f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
722b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan
723b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan    //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
724b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan    //do not cache the information for next draw cycle.
725b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan    if(numLayers > MAX_NUM_APP_LAYERS) {
726b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan        ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
727b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan                 __FUNCTION__);
728b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan        return 0;
729b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan    }
730b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan    //reset old data
731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCurrentFrame.reset(numLayers);
732f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    //Hard conditions, if not met, cannot do MDP comp
734f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFrameDoable(ctx)) {
735f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.cacheAll(list);
739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Check whether layers marked for MDP Composition is actually doable.
744af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    if(isFullFrameDoable(ctx, list)){
745ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        mCurrentFrame.map();
746ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        //Acquire and Program MDP pipes
747ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        if(!programMDP(ctx, list)) {
748ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            mCurrentFrame.reset(numLayers);
749ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            mCachedFrame.cacheAll(list);
750ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah        } else { //Success
751ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            //Any change in composition types needs an FB refresh
752ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            mCurrentFrame.needsRedraw = false;
753ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah            if(mCurrentFrame.fbCount &&
754ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                    ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
755ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
756ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
757ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (!mCurrentFrame.mdpCount) ||
758ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
759ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     isSkipPresent(ctx, mDpy) ||
760ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                     (mDpy > HWC_DISPLAY_PRIMARY))) {
761ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah                mCurrentFrame.needsRedraw = true;
762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            }
763af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        }
764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else if(isOnlyVideoDoable(ctx, list)) {
765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //All layers marked for MDP comp cannot be bypassed.
766f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Try to compose atleast YUV layers through MDP comp and let
767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //all the RGB layers compose in FB
768af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        //Destination over
769af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.fbZ = -1;
770af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(mCurrentFrame.fbCount)
771af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount;
772af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah
773af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.map();
774af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        if(!programYUV(ctx, list)) {
775af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCurrentFrame.reset(numLayers);
776af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah            mCachedFrame.cacheAll(list);
777f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
778af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    } else {
779af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCurrentFrame.reset(numLayers);
780af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        mCachedFrame.cacheAll(list);
781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
783f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //UpdateLayerFlags
784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    setMDPCompLayerFlags(ctx, list);
785af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
787f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
788af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
789f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
790f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
791f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
792c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
793c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
794f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.fbZ;
795c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
796c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
797c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
798c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
799c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
800c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
801c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
802c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
803f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
804327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
805f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
806327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
807327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
808327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
809327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
810327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
816c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
817c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
818c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.mdpCount;
821c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
82216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
823c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
82420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
82520242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++) {
826c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
82820242a75d65c410071434d639266311376a5b7f6Saurabh Shah
829c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
830c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
831f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
833c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
834327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
835c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
836f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
837f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
83820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
83920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
8401ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
84111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
84211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
843f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
844f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
845f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
846f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
847c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
84820242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
84920242a75d65c410071434d639266311376a5b7f6Saurabh Shah                __FUNCTION__, (int) type);
850c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
851c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
852c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
854c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
855c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
858f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
859c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
860c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
86133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
86233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
863c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
865c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
866c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
867c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
868c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
86933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
870c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
8710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
872c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
873f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
874c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
875f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
876f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
877c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
878f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
879f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
880c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
881327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
882327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
883327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
884327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
885c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
8860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
887f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
888f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
890f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
891c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
8940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
897327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
898327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
899327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
900c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
901327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
902f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
903f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
904c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
907f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
908327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
909327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
911327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
912327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
913327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
915327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
917327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
918c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
920c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
921c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
922c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
925c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
926c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
927c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
928f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list) {
929c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
930f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
932f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
933f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
934f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
935f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
936f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(dst.left > hw_w/2) {
937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else if(dst.right <= hw_w/2) {
939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else {
941f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded += 2;
942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
944c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
945c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
946c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
947c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
948c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     MdpPipeInfoHighRes& pipe_info,
950f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     ePipeType type) {
951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
953f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(dst.left > hw_w/2) {
955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = ovutils::OV_INVALID;
956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID)
958f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
959f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else if (dst.right <= hw_w/2) {
960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = ovutils::OV_INVALID;
961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
962f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
963f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else {
965f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
966f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID ||
968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           pipe_info.lIndex == ovutils::OV_INVALID)
969f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
971f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
972c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
974c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
97520242a75d65c410071434d639266311376a5b7f6Saurabh Shah        hwc_display_contents_1_t* list) {
97620242a75d65c410071434d639266311376a5b7f6Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++) {
97720242a75d65c410071434d639266311376a5b7f6Saurabh Shah
97820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
979c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
9805a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
9815a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
982f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[index];
983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
9843393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
985c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
986c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
98820242a75d65c410071434d639266311376a5b7f6Saurabh Shah        if(isYuvBuffer(hnd)) {
98920242a75d65c410071434d639266311376a5b7f6Saurabh Shah            type = MDPCOMP_OV_VG;
9901ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah        } else if(!qhwc::needsScaling(ctx, layer, mDpy)
99111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah            && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
99220242a75d65c410071434d639266311376a5b7f6Saurabh Shah            && ctx->mMDP.version >= qdutils::MDSS_V5) {
993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
99420242a75d65c410071434d639266311376a5b7f6Saurabh Shah        }
995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
99720242a75d65c410071434d639266311376a5b7f6Saurabh Shah            ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
99820242a75d65c410071434d639266311376a5b7f6Saurabh Shah                    __FUNCTION__, (int) type);
99916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
100016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
1001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1002c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
1003c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1004c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
1005c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
1006c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
1007c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
1008f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              PipeLayerPair& PipeLayerPair) {
1009327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
1010f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
1011327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
1012327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
1013327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
1014327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
1015327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1017f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
1018f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
1019f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1020f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
1021f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
1022c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1023c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1024c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
1025c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
102716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
102816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
1029c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
1030c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1031c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
1032c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
103316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
1034c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1035c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
103616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
103733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
103816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
103916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
104016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
1042c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
1045c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
1046f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
1047f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1048660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
1049327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1050327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
1051327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
1052327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
1053327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1054c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
105516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
1056c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
1057c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1058c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1059f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
1060f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1061c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
1062f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
1063f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1065c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
1066c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1068327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
1069327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
1070327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
1071327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
1072327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
1075327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
1076c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
1077c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
1078c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
1080327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1081f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
1082327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
1083327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
1084327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1085c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1086c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
1087c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1088c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
1089c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
1090c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
1091327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
1093327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
1094327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1096c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1097c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1098327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
109916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1100c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1101327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
110216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1103c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1106