hwc_mdpcomp.cpp revision f9572cdbe3541d85522adea584f925671b375300
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
424f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if((cWidth/dWidth) > 4 || (cHeight/dHeight) > 4)
425c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
426c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
427c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
428c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
430f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid  MDPComp::batchLayers() {
431f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
432f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * send rest of them through MDP. NEVER mark an updating layer for caching.
433f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran     * But cached ones can be marked for MDP*/
434f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
435f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchStart = -1;
436f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int maxBatchCount = 0;
437f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
438f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* All or Nothing is cached. No batching needed */
439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!mCurrentFrame.fbCount ||
440f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (mCurrentFrame.fbCount ==  mCurrentFrame.layerCount))
441f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
442f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
443f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Search for max number of contiguous (cached) layers */
444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int i = 0;
445f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    while (i < mCurrentFrame.layerCount) {
446f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int count = 0;
447f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
448f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            count++; i++;
449f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(count > maxBatchCount) {
451f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchCount = count;
452f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            maxBatchStart = i - count;
453f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
454f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i < mCurrentFrame.layerCount) i++;
455f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
456f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
457f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* reset rest of the layers for MDP comp */
458f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
459f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(i != maxBatchStart){
460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = false;
461f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
462f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            i += maxBatchCount;
463f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
464f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
465f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
466f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = maxBatchCount;
467f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
468f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
469f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
470f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
472f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
474f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
475f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numCacheableLayers = 0;
476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if((list->flags & HWC_GEOMETRY_CHANGED) || (isSkipPresent(ctx, mDpy))) {
478f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: No Caching: \
479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 GEOMETRY change: %d SKIP present: %d", __FUNCTION__,
480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 (list->flags & HWC_GEOMETRY_CHANGED),isSkipPresent(ctx, mDpy));
481f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCachedFrame.reset();
482f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return;
483f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
484f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
485f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numAppLayers; i++) {
486f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
487f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            numCacheableLayers++;
488f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCurrentFrame.isFBComposed[i] = true;
489f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else {
490f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
491f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
492c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
493f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = numCacheableLayers;
494f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
495f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
496c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
497f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
498f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
499c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
500c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
501f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numAvailable = ov.availablePipes(mDpy);
502f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
503f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve DMA for rotator
504f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(ctx->mNeedsRotator)
505f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= numDMAPipes;
506f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
507f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Reserve pipe(s)for FB
508f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount)
509f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        numAvailable -= pipesForFB();
510f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
511f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return numAvailable;
512f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
513f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::resetFrameForFB(hwc_context_t* ctx,
515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              hwc_display_contents_1_t* list) {
516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.fbCount = mCurrentFrame.layerCount;
517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    memset(&mCurrentFrame.isFBComposed, 1,
518f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           sizeof(mCurrentFrame.isFBComposed));
519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.needsRedraw = true;
520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
521f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
522f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
524f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int nYuvCount = ctx->listStats[mDpy].yuvCount;
525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0;index < nYuvCount; index++){
526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
527f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!isYUVDoable(ctx, layer)) {
530f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = true;
532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount++;
533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        } else {
535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.isFBComposed[nYuvIndex] = false;
537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.fbCount--;
538f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
539c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             mCurrentFrame.fbCount);
543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int fbZOrder = -1;
547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ctx->mDMAInUse = false;
548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!allocLayerPipes(ctx, list)) {
550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
551f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        goto fn_exit;
552f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
553f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                                                      index++) {
556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[index]) {
557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[index];
559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[index];
560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            cur_pipe->zOrder = mdpNextZOrder++;
563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         layer %d",__FUNCTION__, index);
567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                goto fn_exit;
568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        } else if(fbZOrder < 0) {
570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            fbZOrder = mdpNextZOrder++;
571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        };
572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return fbZOrder;
575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fn_exit:
577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Complete fallback to FB
578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        resetFrameForFB(ctx, list);
579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran}
581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //reset old data
585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.reset();
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFrameDoable(ctx)) {
588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                  __FUNCTION__);
590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        return 0;
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.layerCount = ctx->listStats[mDpy].numAppLayers;
594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Iterate layer list for cached layers
596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    updateLayerCache(ctx, list);
597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Add YUV layers to cached list
599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    updateYUV(ctx, list);
600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Optimze for bypass
602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    batchLayers();
603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //list is already parsed / batched for optimal mixed mode composition.
605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //Check whether layers marked for MDP Composition is actually doable.
606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isFullFrameDoable(ctx, list)){
607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //All layers marked for MDP comp cannot be bypassed.
608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Try to compose atleast YUV layers through MDP comp and let
609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //all the RGB layers compose in FB
610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        resetFrameForFB(ctx, list);
611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        updateYUV(ctx, list);
612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             mCurrentFrame.fbCount;
616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.mdpCount) {
618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        // populate layer and MDP maps
619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        for(int idx = 0, mdpIdx = 0; idx < mCurrentFrame.layerCount; idx++) {
620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(!mCurrentFrame.isFBComposed[idx]) {
621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.mdpToLayer[mdpIdx].listIndex = idx;
622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                mCurrentFrame.layerToMDP[idx] = mdpIdx++;
623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        //Acquire and Program MDP pipes
626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCurrentFrame.fbZ = programMDP(ctx, list);
627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    /* Any change in composition types needs an FB refresh*/
630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(mCurrentFrame.fbCount &&
631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran       !mCurrentFrame.mdpCount)) {
634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        mCurrentFrame.needsRedraw = true;
635c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
636c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    //UpdateLayerFlags
638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    setMDPCompLayerFlags(ctx, list);
639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isDebug()) {
641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        android::String8 sDump("");
642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        dump(sDump);
643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ALOGE("%s",sDump.string());
644c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
645c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.fbZ;
647c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
648c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes===================================================
650c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
651c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
652c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
653c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
654c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                             PipeLayerPair& PipeLayerPair) {
656327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoLowRes& mdp_info =
657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
658327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
659327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
660327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
661327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest dest = mdp_info.index;
662327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             __FUNCTION__, layer, zOrder, dest);
665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                           &PipeLayerPair.rot);
668c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
669c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
670c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                               hwc_display_contents_1_t* list) {
672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return mCurrentFrame.mdpCount;
673c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
67416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
675c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                    hwc_display_contents_1_t* list) {
677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isYuvPresent(ctx, mDpy)) {
678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvCount = ctx->listStats[mDpy].yuvCount;
679c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        for(int index = 0; index < nYuvCount ; index ++) {
681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
682c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(mCurrentFrame.isFBComposed[nYuvIndex])
684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                continue;
685413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar
686c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex];
689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
691c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            info.pipeInfo = new MdpPipeInfoLowRes;
692327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            info.rot = NULL;
693c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
695c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG);
696c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            if(pipe_info.index == ovutils::OV_INVALID) {
697c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos",
698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         __FUNCTION__);
699c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
700c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            }
701c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
70216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
70316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) {
705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[index]) continue;
706c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
707c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
7080114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed
709c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(isYuvBuffer(hnd))
710c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            continue;
711c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[index];
713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
715c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
716327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        info.rot = NULL;
717c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
718c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
719f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
720f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
721f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator
722f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           && ctx->mMDP.version >= qdutils::MDSS_V5) {
723f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
724f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        }
725f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran
726f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
727c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
728c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
729c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            return false;
730c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
731c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
732c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return true;
733c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
734c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
735c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
736c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
737f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
738c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
739c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        return true;
74033650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
74133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
742c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    if(!ctx || !list) {
743c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
744c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
745c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
746c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
747c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    /* reset Invalidator */
748f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
749c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        idleInvalidator->markForSleep();
7500ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
751c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
752f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
753c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
754f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
755f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
756c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    {
757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
758f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
759c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
760327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
761327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
762327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
763327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
764c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
7650ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran
766f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
768c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
769f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
770c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
771c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
772c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
7730ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran            return false;
774c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
775c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
776327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
777327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            continue;
778327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
779c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
780327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 using  pipe: %d", __FUNCTION__, layer,
782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                 hnd, dest );
783c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
784327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
785327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        uint32_t offset = hnd->offset;
786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
787327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
788327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if(!rot->queueBuffer(fd, offset))
789c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                return false;
790327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
791327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
792327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
793327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
794327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
795327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
796327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
797c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
798c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
799c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
800c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
801c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
802c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
803c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
804c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes===================================================
805c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
806c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
807f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                hwc_display_contents_1_t* list) {
808c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    int pipesNeeded = 0;
809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(!mCurrentFrame.isFBComposed[i]) {
813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[i];
814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            hwc_rect_t dst = layer->displayFrame;
815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(dst.left > hw_w/2) {
816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else if(dst.right <= hw_w/2) {
818f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded++;
819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            } else {
820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                pipesNeeded += 2;
821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            }
822f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        }
823c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
824c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    return pipesNeeded;
825c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
826c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
827c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
828f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     MdpPipeInfoHighRes& pipe_info,
829f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     ePipeType type) {
830f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int hw_w = ctx->dpyAttr[mDpy].xres;
831f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    hwc_rect_t dst = layer->displayFrame;
833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(dst.left > hw_w/2) {
834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = ovutils::OV_INVALID;
835f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
836f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID)
837f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
838f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else if (dst.right <= hw_w/2) {
839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = ovutils::OV_INVALID;
840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
841f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.lIndex == ovutils::OV_INVALID)
842f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
843f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    } else {
844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.rIndex = getMdpPipe(ctx, type);
845f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        pipe_info.lIndex = getMdpPipe(ctx, type);
846f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(pipe_info.rIndex == ovutils::OV_INVALID ||
847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           pipe_info.lIndex == ovutils::OV_INVALID)
848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            return false;
849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return true;
851c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran}
852c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
854f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                                     hwc_display_contents_1_t* list) {
85516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
856f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int layer_count = ctx->listStats[mDpy].numAppLayers;
857c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
858f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(isYuvPresent(ctx, mDpy)) {
859f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int nYuvCount = ctx->listStats[mDpy].yuvCount;
8605a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran
8615a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        for(int index = 0; index < nYuvCount; index ++) {
862f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
8635a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex];
865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            info.pipeInfo = new MdpPipeInfoHighRes;
8663393d793e88663ee9147b04e11289020be3721c9Saurabh Shah            info.rot = NULL;
867c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
868c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) {
869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos",
870f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                         __FUNCTION__);
871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran                //TODO: windback pipebook data on fail
8725a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran                return false;
8735a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            }
8745a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran            pipe_info.zOrder = nYuvIndex;
875c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
876c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
877c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
87816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
8795a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
8805a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
8815a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran
8825a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran        if(isYuvBuffer(hnd))
88316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            continue;
884c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
885f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        PipeLayerPair& info = mCurrentFrame.mdpToLayer[index];
886c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
8873393d793e88663ee9147b04e11289020be3721c9Saurabh Shah        info.rot = NULL;
888c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
891c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
892f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran        if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator
893f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran           && ctx->mMDP.version >= qdutils::MDSS_V5)
894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            type = MDPCOMP_OV_DMA;
895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
89716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
898c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            //TODO: windback pipebook data on fail
89916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
90016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
90116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = index;
902c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
903c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
904c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
905c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/*
906c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition
907c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */
908c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
909f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                              PipeLayerPair& PipeLayerPair) {
910327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    MdpPipeInfoHighRes& mdp_info =
911f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
912327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
913327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eIsFg isFg = IS_FG_OFF;
914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
915327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest lDest = mdp_info.lIndex;
916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    eDest rDest = mdp_info.rIndex;
917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
918f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
919f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
920f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                            rDest, &PipeLayerPair.rot);
923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
925c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
927f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(!isEnabled()) {
92816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
92916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
930c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
931c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
932c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
933c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
93416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
935c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
936c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
93716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(idleInvalidator && mCurrentFrame.mdpCount)
93916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
94016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
94116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    LayerProp *layerProp = ctx->layerProp[mDpy];
943c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
944f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
946c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
947f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(mCurrentFrame.isFBComposed[i]) continue;
948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
949660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
950327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
951327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(!hnd) {
952327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s handle null", __FUNCTION__);
953327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            return false;
954327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
955c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
95616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
957c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
958c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
959c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        int mdpIndex = mCurrentFrame.layerToMDP[i];
961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
962c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
963f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
965327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
966c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
967c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
969327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int fd = hnd->fd;
970327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        int offset = hnd->offset;
971327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
972327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(rot) {
973327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            rot->queueBuffer(fd, offset);
974327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            fd = rot->getDstMemId();
975327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            offset = rot->getDstOffset();
976327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        }
977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
978c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play left mixer **********
979c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
980c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
981327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
982f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
983327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
984327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
985327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
986c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        }
988c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
989c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        //************* play right mixer **********
990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
991c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
992327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
993f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
994327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
995327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
996327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                return false;
997c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
998c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
999327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
100016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
1001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
1002327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
100316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
1004c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1005c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
1006c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1007