hwc_mdpcomp.cpp revision b393a0202cdfde0099530add9671277aeb018e89
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
19c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
21bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
22591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
238b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
24327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
26327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing overlay::Rotator;
27327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils;
2816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc {
31327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
32c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
33c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
3716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
38f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
40f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) {
41c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(width <= MAX_DISPLAY_DIM) {
42f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompLowRes(dpy);
43c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    } else {
44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return new MDPCompHighRes(dpy);
45c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
46c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
4716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
48f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){};
49f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
50c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
51c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
52f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
53f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\"");
54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                cacheCount:%2d \n", mCachedFrame.layerCount,
56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                fbCount:%2d \n", mCurrentFrame.layerCount,
59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                (mCurrentFrame.needsRedraw? "YES" : "NO"),
62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf," ---------------------------------------------  \n");
66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    index,
69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    mCurrentFrame.layerToMDP[index],
71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ?
72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    dumpsys_log(buf,"\n");
76c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
77c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!setupBasePipe(ctx)) {
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
94f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sDebugLogs = false;
100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(property_get("debug.mdpcomp.maxpermixer", property, NULL) > 0) {
107f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(atoi(property) != 0)
108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            sMaxPipesPerMixer = true;
109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
110f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    unsigned long idle_timeout = DEFAULT_IDLE_TIME;
112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            idle_timeout = atoi(property);
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //create Idle Invalidator
118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    idleInvalidator = IdleInvalidator::getInstance();
119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(idleInvalidator == NULL) {
121f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__);
122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
123c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        idleInvalidator->init(timeout_handler, ctx, idle_timeout);
124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
136359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
142359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
145c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
146f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                   hwc_display_contents_1_t* list) {
147f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
152f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layerProp[index].mFlags |= HWC_MDPCOMP;
153f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->compositionType = HWC_OVERLAY;
154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            layer->hints |= HWC_HINT_CLEAR_FB;
155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[index] = NULL;
156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.needsRedraw)
158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                layer->compositionType = HWC_OVERLAY;
159c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
160c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
161f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCachedFrame.mdpCount = mCurrentFrame.mdpCount;
162f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCachedFrame.cacheCount = mCurrentFrame.fbCount;
163f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCachedFrame.layerCount = ctx->listStats[mDpy].numAppLayers;
164c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
16516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/*
167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */
170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_stride = ctx->dpyAttr[dpy].stride;
173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mdp_overlay ovInfo;
178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    msmfb_overlay_data ovData;
179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.width  = fb_width;
184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.height = fb_height;
185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.w = fb_width;
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.h = fb_height;
187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.w = fb_width;
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.h = fb_height;
189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
192c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovData.id = ovInfo.id;
198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
200f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran              strerror(errno));
201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
205f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() {
206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
209c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::FrameInfo::reset() {
211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0 ; i < MAX_PIPES_PER_MIXER && layerCount; i++ ) {
213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdpToLayer[i].pipeInfo) {
214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            delete mdpToLayer[i].pipeInfo;
215f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].pipeInfo = NULL;
216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //We dont own the rotator
217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mdpToLayer[i].rot = NULL;
218c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
219c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
222f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&layerToMDP, -1, sizeof(layerToMDP));
223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&isFBComposed, 0, sizeof(isFBComposed));
224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbCount = 0;
228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    needsRedraw = false;
229f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    fbZ = 0;
230f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
232f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() {
233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    reset();
234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
235f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() {
237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&hnd, 0, sizeof(buffer_handle_t));
238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mdpCount = 0;
239f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    cacheCount = 0;
240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    layerCount = 0;
241c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
242c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
243c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPComp::isWidthValid(hwc_context_t *ctx, hwc_layer_1_t *layer) {
2440ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2450ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    private_handle_t *hnd = (private_handle_t *)layer->handle;
2460ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2470ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(!hnd) {
2480ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        ALOGE("%s: layer handle is NULL", __FUNCTION__);
2490ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2500ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2510ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_h = ctx->dpyAttr[mDpy].yres;
2540ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2550ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t sourceCrop = layer->sourceCrop;
2560ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t displayFrame = layer->displayFrame;
2570ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2580ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t crop =  sourceCrop;
2590ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_w = crop.right - crop.left;
2600ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int crop_h = crop.bottom - crop.top;
2610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2620ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    hwc_rect_t dst = displayFrame;
2630ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_w = dst.right - dst.left;
2640ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    int dst_h = dst.bottom - dst.top;
2650ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2660ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
267f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_rect_t scissor = {0, 0, hw_w, hw_h };
268f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
269f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        crop_w = crop.right - crop.left;
270f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        crop_h = crop.bottom - crop.top;
2710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    }
2720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
273f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for MDP HW limitation in DSI command mode panels where
274f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * FPS will not go beyond 30 if buffers on RGB pipes are of width or height
275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * less than 5 pixels
276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * */
2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((crop_w < 5)||(crop_h < 5))
2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran        return false;
2800ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
2810ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran    return true;
2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran}
2830ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
284c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
285c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
286c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
287c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
288c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    switch(type) {
289f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_DMA:
290f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy);
291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
292f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mDMAInUse = true;
293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
294f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_ANY:
296f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case MDPCOMP_OV_RGB:
297f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
298f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mdp_pipe != ovutils::OV_INVALID) {
299f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return mdp_pipe;
300f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
301c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
302f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(type == MDPCOMP_OV_RGB) {
303f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            //Requested only for RGB pipe
304f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            break;
305f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
306f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    case  MDPCOMP_OV_VG:
307f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy);
308f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    default:
309f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Invalid pipe type",__FUNCTION__);
310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return ovutils::OV_INVALID;
311c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    };
312c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return ovutils::OV_INVALID;
313c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
314c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
315f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
317f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
319f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
320c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
321c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
322c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
323c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(ctx->mExtDispConfiguring) {
324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
326c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
327c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
328c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(ctx->listStats[mDpy].needsAlphaScale
330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       && ctx->mMDP.version < qdutils::MDSS_V5) {
331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be
339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */
340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
341f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list){
342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount;
345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int fbNeeded = int(mCurrentFrame.fbCount != 0);
346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mDpy > HWC_DISPLAY_PRIMARY){
348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 __FUNCTION__);
350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
352c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mdpCount > (sMaxPipesPerMixer-fbNeeded)) {
354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
355c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
357c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(pipesNeeded(ctx, list) > getAvailablePipes(ctx)) {
359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes",__FUNCTION__);
360c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipPresent(ctx, mDpy)) {
364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Skip layers present",__FUNCTION__);
365c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
366c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
367c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
368c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //FB composition on idle timeout
369c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(sIdleFallBack) {
370c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        sIdleFallBack = false;
371c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
372c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
373c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
374c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
375c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
377c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
378c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
379c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
381f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
382f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        if(layer->transform & HWC_TRANSFORM_ROT_90 && !isYuvBuffer(hnd)) {
383c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
384c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
385c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!isYuvBuffer(hnd) && !isWidthValid(ctx,layer)) {
388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",__FUNCTION__);
389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
391c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
392c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
393c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */
396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSkipLayer(layer)) {
399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__);
400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
401c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
403f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(ctx->mNeedsRotator && ctx->mDMAInUse) {
404f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s: No DMA for Rotator",__FUNCTION__);
405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return false;
406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isSecuring(ctx, layer)) {
409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
410f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return false;
411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
412f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
413f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Workaround for downscales larger than 4x. Will be removed once decimator
414f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * block is enabled for MDSS*/
415f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(ctx->mMDP.version == qdutils::MDSS_V5) {
416f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_rect_t crop = layer->sourceCrop;
417f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_rect_t dst = layer->displayFrame;
418f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
419f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int cWidth = crop.right - crop.left;
420f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int cHeight = crop.bottom - crop.top;
421f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int dWidth = dst.right - dst.left;
422f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int dHeight = dst.bottom - dst.top;
423f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
424b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar        if(layer->transform & HAL_TRANSFORM_ROT_90) {
425b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar            swap(cWidth, cHeight);
426b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar        }
427b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar
428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if((cWidth/dWidth) > 4 || (cHeight/dHeight) > 4)
429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
430c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
433c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
434f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
435f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
436f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
437f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
438f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
440f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
441f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
442f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
443f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!mCurrentFrame.fbCount ||
444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (mCurrentFrame.fbCount ==  mCurrentFrame.layerCount))
445f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
446f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
447f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
448f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
449f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
451f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
452f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
453f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
454f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
455f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
456f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
457f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
458f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
459f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
461f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
462f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
463f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
464f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
465f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
466f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
467f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
468f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
469f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
470f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
472f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
474f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
475f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
478f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
481f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((list->flags & HWC_GEOMETRY_CHANGED) || (isSkipPresent(ctx, mDpy))) {
482f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: No Caching: \
483f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 GEOMETRY change: %d SKIP present: %d", __FUNCTION__,
484f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 (list->flags & HWC_GEOMETRY_CHANGED),isSkipPresent(ctx, mDpy));
485f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCachedFrame.reset();
486f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
487f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
488f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
489f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
490f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
491f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
492f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
493f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
494f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
495f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
496c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
497f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
498f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
499f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
500c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
501f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
502f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
503c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
504c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
505f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAvailable = ov.availablePipes(mDpy);
506f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
507f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve DMA for rotator
508f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(ctx->mNeedsRotator)
509f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= numDMAPipes;
510f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
511f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve pipe(s)for FB
512f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount)
513f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= pipesForFB();
514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return numAvailable;
516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
518f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::resetFrameForFB(hwc_context_t* ctx,
519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              hwc_display_contents_1_t* list) {
520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = mCurrentFrame.layerCount;
521f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mCurrentFrame.isFBComposed, 1,
522f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           sizeof(mCurrentFrame.isFBComposed));
523f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.needsRedraw = true;
524f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
527c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
530f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
534f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
538c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
543c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int fbZOrder = -1;
551f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ctx->mDMAInUse = false;
552f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
553f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        goto fn_exit;
556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                                                      index++) {
560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                goto fn_exit;
572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else if(fbZOrder < 0) {
574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            fbZOrder = mdpNextZOrder++;
575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        };
576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return fbZOrder;
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fn_exit:
581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Complete fallback to FB
582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        resetFrameForFB(ctx, list);
583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //reset old data
589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.reset();
590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFrameDoable(ctx)) {
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.layerCount = ctx->listStats[mDpy].numAppLayers;
598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Iterate layer list for cached layers
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    updateLayerCache(ctx, list);
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Add YUV layers to cached list
603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    updateYUV(ctx, list);
604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Optimze for bypass
606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    batchLayers();
607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //list is already parsed / batched for optimal mixed mode composition.
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Check whether layers marked for MDP Composition is actually doable.
610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFullFrameDoable(ctx, list)){
611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //All layers marked for MDP comp cannot be bypassed.
612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Try to compose atleast YUV layers through MDP comp and let
613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //all the RGB layers compose in FB
614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        resetFrameForFB(ctx, list);
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        updateYUV(ctx, list);
616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             mCurrentFrame.fbCount;
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.mdpCount) {
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        // populate layer and MDP maps
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        for(int idx = 0, mdpIdx = 0; idx < mCurrentFrame.layerCount; idx++) {
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[idx]) {
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpToLayer[mdpIdx].listIndex = idx;
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.layerToMDP[idx] = mdpIdx++;
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Acquire and Program MDP pipes
630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCurrentFrame.fbZ = programMDP(ctx, list);
631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Any change in composition types needs an FB refresh*/
634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount &&
635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
636f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       !mCurrentFrame.mdpCount)) {
638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCurrentFrame.needsRedraw = true;
639c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
640c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //UpdateLayerFlags
642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    setMDPCompLayerFlags(ctx, list);
643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
648c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.fbZ;
651c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
652c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
653c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
654c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
655c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
656c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
657c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
658c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
660327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
662327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
663327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
664327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
665327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
666327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
672c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
673c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
674c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.mdpCount;
677c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
67816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
679c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                    hwc_display_contents_1_t* list) {
681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isYuvPresent(ctx, mDpy)) {
682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvCount = ctx->listStats[mDpy].yuvCount;
683c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        for(int index = 0; index < nYuvCount ; index ++) {
685f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
686c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex])
688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                continue;
689413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar
690c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
691f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex];
693f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
695c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            info.pipeInfo = new MdpPipeInfoLowRes;
696327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            info.rot = NULL;
697c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
699c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG);
700c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            if(pipe_info.index == ovutils::OV_INVALID) {
701c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos",
702f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         __FUNCTION__);
703c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
704c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            }
705c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
70616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
70716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) {
709f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
710c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
711c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
7120114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed
713c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(isYuvBuffer(hnd))
714c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            continue;
715c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
719c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
720327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
721c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
722c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
723f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
724f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
725f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           && ctx->mMDP.version >= qdutils::MDSS_V5) {
727f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
728f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
729f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
730f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
731c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
732c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
733c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
734c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
735c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
736c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
737c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
738c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
739c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
740c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
742c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
743c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
74433650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
74533650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
746c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
747c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
748c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
749c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
750c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
751c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
752f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
753c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
7540ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
755c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
757c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
758f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
759f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
760c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
761f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
762f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
763c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
764327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
765327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
766327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
767327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
768c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
7690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
770f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
771f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
772c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
773f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
774c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
775c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
776c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
7770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
778c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
779c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
780327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
781327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
782327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
783c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
784327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
787c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
788327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
789327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
790f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
791327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
792327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
793c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
794327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
795327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
796327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
797327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
798327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
799327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
800327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
801c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
802c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
803c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
804c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
805c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
806c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
807c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
808c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
809c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
810c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list) {
812c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
818f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(dst.left > hw_w/2) {
820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else if(dst.right <= hw_w/2) {
822f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
823f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else {
824f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded += 2;
825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
826f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
827c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
828c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
829c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
830c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
831c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     MdpPipeInfoHighRes& pipe_info,
833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     ePipeType type) {
834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
835f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
836f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
837f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(dst.left > hw_w/2) {
838f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = ovutils::OV_INVALID;
839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID)
841f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
842f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else if (dst.right <= hw_w/2) {
843f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = ovutils::OV_INVALID;
844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
845f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
846f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else {
848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID ||
851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           pipe_info.lIndex == ovutils::OV_INVALID)
852f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
853f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
854f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
858f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     hwc_display_contents_1_t* list) {
85916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
860f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int layer_count = ctx->listStats[mDpy].numAppLayers;
861c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
862f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isYuvPresent(ctx, mDpy)) {
863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvCount = ctx->listStats[mDpy].yuvCount;
8645a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran
8655a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        for(int index = 0; index < nYuvCount; index ++) {
866f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
8675a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
868f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex];
869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            info.pipeInfo = new MdpPipeInfoHighRes;
8703393d793e88663ee9147b04e11289020be3721c9Saurabh Shah            info.rot = NULL;
871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
872c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) {
873c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos",
874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         __FUNCTION__);
875c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                //TODO: windback pipebook data on fail
8765a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran                return false;
8775a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            }
8785a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            pipe_info.zOrder = nYuvIndex;
879c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
880c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
881c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
88216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
8835a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
8845a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
8855a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran
8865a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        if(isYuvBuffer(hnd))
88716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            continue;
888c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
889f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[index];
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
8913393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
896f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator
897f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           && ctx->mMDP.version >= qdutils::MDSS_V5)
898c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
899c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
900c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
90116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
902c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            //TODO: windback pipebook data on fail
90316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
90416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
90516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = index;
906c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
907c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
908c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
909c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
911c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
912c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
913f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              PipeLayerPair& PipeLayerPair) {
914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
915f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
917327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
918327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
919327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
920327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
923f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
924f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
925f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
926f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
927c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
928c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
929c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
930c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
93216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
93316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
934c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
935c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
936c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
937c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
93816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
939c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
940c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
94116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
94316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
94416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
94516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
947c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
950c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
953660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
954327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
955327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
956327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
957327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
958327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
959c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
96016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
961c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
962c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
963c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
965f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
966c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
969327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
970c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
972f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
973327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
974327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
975327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
976327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
977327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
978327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
979327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
980327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
981c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
982c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
984c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
985327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
986f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
987327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
988327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
989327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
990c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
991c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
992c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
996327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
997f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
998327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
999327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
1000327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
1001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
1002c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
1003327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
100416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1005c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1006327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
100716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1008c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1009c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1010c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1011