17c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed/*
26371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
37c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Not a Contribution, Apache license notifications and license are retained
47c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * for attribution purposes only.
57c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed *
67c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
77c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * you may not use this file except in compliance with the License.
87c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * You may obtain a copy of the License at
97c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed *
107c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
117c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed *
127c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
137c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
147c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
157c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * See the License for the specific language governing permissions and
167c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * limitations under the License.
177c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed */
187c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
19c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah#include <math.h>
207c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed#include "hwc_mdpcomp.h"
2165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed#include <sys/ioctl.h>
2256f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "external.h"
23c0945d8a389f71cdf8432947a6911838d1219c4bRamkumar Radhakrishnan#include "qdMetaData.h"
24d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan#include "mdp_version.h"
2536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include <overlayRotator.h>
267c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
2736963690317abceae79621f14ba41ff62b3ff489Saurabh Shahusing overlay::Rotator;
2836963690317abceae79621f14ba41ff62b3ff489Saurabh Shahusing namespace overlay::utils;
2965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmednamespace ovutils = overlay::utils;
307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
3136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace qhwc {
3236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
33bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah//==============MDPComp========================================================
34bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
357c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
367c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedbool MDPComp::sIdleFallBack = false;
377c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedbool MDPComp::sDebugLogs = false;
3865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedbool MDPComp::sEnabled = false;
3985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
407c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
4185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp* MDPComp::getObject(const int& width, int dpy) {
426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(width <= MAX_DISPLAY_DIM) {
4385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return new MDPCompLowRes(dpy);
446371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    } else {
4585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return new MDPCompHighRes(dpy);
466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
477c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
4865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
4985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp::MDPComp(int dpy):mDpy(dpy){};
5085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
51bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahvoid MDPComp::dump(android::String8& buf)
52bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah{
5385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf,"HWC Map for Dpy: %s \n",
5485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\"");
5585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf,"PREV_FRAME: layerCount:%2d    mdpCount:%2d \
5685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                cacheCount:%2d \n", mCachedFrame.layerCount,
5785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCachedFrame.mdpCount, mCachedFrame.cacheCount);
5885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf,"CURR_FRAME: layerCount:%2d    mdpCount:%2d \
5985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                fbCount:%2d \n", mCurrentFrame.layerCount,
6085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCurrentFrame.mdpCount, mCurrentFrame.fbCount);
6185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf,"needsFBRedraw:%3s  pipesUsed:%2d  MaxPipesPerMixer: %d \n",
6285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                (mCurrentFrame.needsRedraw? "YES" : "NO"),
6385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCurrentFrame.mdpCount, sMaxPipesPerMixer);
6485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf," ---------------------------------------------  \n");
6585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype  |  Z  \n");
6685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf," ---------------------------------------------  \n");
6785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int index = 0; index < mCurrentFrame.layerCount; index++ )
6885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n",
6985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                    index,
7085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                    (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"),
7185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                    mCurrentFrame.layerToMDP[index],
7285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                    (mCurrentFrame.isFBComposed[index] ?
7385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                     (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"),
7485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                    (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ :
7585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder));
7685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    dumpsys_log(buf,"\n");
77bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
78bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
79bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
80bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
81bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    if(!ctx) {
82bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
83bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah        return false;
84bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
85bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
86bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    char property[PROPERTY_VALUE_MAX];
87bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
88bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    sEnabled = false;
89bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
9085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
9185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
92bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah        sEnabled = true;
93bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
94bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
95bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    sDebugLogs = false;
96bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
97bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah        if(atoi(property) != 0)
98bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah            sDebugLogs = true;
99bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
100bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
10185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    sMaxPipesPerMixer = MAX_PIPES_PER_MIXER;
10285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(property_get("debug.mdpcomp.maxpermixer", property, NULL) > 0) {
10385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(atoi(property) != 0)
10485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            sMaxPipesPerMixer = true;
10585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
10685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
107ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed    if(ctx->mMDP.panel != MIPI_CMD_PANEL) {
108ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        // Idle invalidation is not necessary on command mode panels
109ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        long idle_timeout = DEFAULT_IDLE_TIME;
110ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
111ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed            if(atoi(property) != 0)
112ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed                idle_timeout = atoi(property);
113ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        }
114ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed
115ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        //create Idle Invalidator only when not disabled through property
116ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        if(idle_timeout != -1)
117ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed            idleInvalidator = IdleInvalidator::getInstance();
118ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed
119ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        if(idleInvalidator == NULL) {
120ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed            ALOGE("%s: failed to instantiate idleInvalidator object",
121ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed                  __FUNCTION__);
122ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        } else {
123ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed            idleInvalidator->init(timeout_handler, ctx, idle_timeout);
124ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed        }
125bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
126bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return true;
127bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
1287c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
1297c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
1307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
1317c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
1327c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    if(!ctx) {
1337c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
1347c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        return;
1357c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
1367c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
1373be78d9816da84e48a40232165189f9deb16808fJesse Hall    if(!ctx->proc) {
1387c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
1397c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        return;
1407c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
1417c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    sIdleFallBack = true;
1427c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    /* Trigger SF to redraw the current frame */
1433be78d9816da84e48a40232165189f9deb16808fJesse Hall    ctx->proc->invalidate(ctx->proc);
1447c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
1457c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
146bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
14785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                   hwc_display_contents_1_t* list) {
14885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    LayerProp *layerProp = ctx->layerProp[mDpy];
149bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
15085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) {
151bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
15285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
15385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            layerProp[index].mFlags |= HWC_MDPCOMP;
15485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            layer->compositionType = HWC_OVERLAY;
15585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            layer->hints |= HWC_HINT_CLEAR_FB;
15685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            mCachedFrame.hnd[index] = NULL;
15785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        } else {
15885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            if(!mCurrentFrame.needsRedraw)
15985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                layer->compositionType = HWC_OVERLAY;
16085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
16152ca6d2747ec9b46f7fff666f3b35ec1d3f1ce13Naseer Ahmed    }
1627c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
1637c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
16485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah/*
16585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
16685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
16785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah */
16885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
169bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
17085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
17185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
17285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
17385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
17485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mdp_overlay ovInfo;
17585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    msmfb_overlay_data ovData;
17685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
17785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
17885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
17985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
18085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.src.width  = fb_width;
18185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.src.height = fb_height;
18285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.src_rect.w = fb_width;
18385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.src_rect.h = fb_height;
18485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.dst_rect.w = fb_width;
18585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.dst_rect.h = fb_height;
18685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
18785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
18885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
18985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
19085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah              strerror(errno));
19185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
19285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
193bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
19485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ovData.id = ovInfo.id;
19585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
19685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
19785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah              strerror(errno));
19885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
199bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
20085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return true;
2017c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
20265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
20385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp::FrameInfo::FrameInfo() {
20480c2b7d36c8a088e7672aed237966986bf99fa29Jesse Hall    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
2055d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    reset(0);
20685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
20785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
2085d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) {
20980c2b7d36c8a088e7672aed237966986bf99fa29Jesse Hall    for(int i = 0 ; i < MAX_PIPES_PER_MIXER; i++ ) {
21085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(mdpToLayer[i].pipeInfo) {
21185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            delete mdpToLayer[i].pipeInfo;
21285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            mdpToLayer[i].pipeInfo = NULL;
21385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            //We dont own the rotator
21485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            mdpToLayer[i].rot = NULL;
2156371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
216bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
21785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
21885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    memset(&mdpToLayer, 0, sizeof(mdpToLayer));
21985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    memset(&layerToMDP, -1, sizeof(layerToMDP));
2205d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    memset(&isFBComposed, 1, sizeof(isFBComposed));
22185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
2225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    layerCount = numLayers;
2235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    fbCount = numLayers;
22485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mdpCount = 0;
2250b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah    needsRedraw = true;
22685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    fbZ = 0;
22785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
22885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
2295d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::FrameInfo::map() {
2305d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    // populate layer and MDP maps
2315d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int mdpIdx = 0;
2325d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    for(int idx = 0; idx < layerCount; idx++) {
2335d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        if(!isFBComposed[idx]) {
2345d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mdpToLayer[mdpIdx].listIndex = idx;
2355d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            layerToMDP[idx] = mdpIdx++;
2365d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        }
2375d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
2385d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
2395d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
24085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp::LayerCache::LayerCache() {
24185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    reset();
24285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
24385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
24485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::LayerCache::reset() {
2455d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    memset(&hnd, 0, sizeof(hnd));
24685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mdpCount = 0;
24785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    cacheCount = 0;
24885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    layerCount = 0;
2495d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    fbZ = -1;
2505d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
2515d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
2525d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) {
2535d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    const int numAppLayers = list->numHwLayers - 1;
2545d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
2555d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        hnd[i] = list->hwLayers[i].handle;
2565d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
2575d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
2585d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
2595d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) {
2605d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mdpCount = curFrame.mdpCount;
2615d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    cacheCount = curFrame.fbCount;
2625d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    layerCount = curFrame.layerCount;
2635d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    fbZ = curFrame.fbZ;
264bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
265bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
266ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchevbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) {
267ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    private_handle_t *hnd = (private_handle_t *)layer->handle;
268ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
269ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    if(!hnd) {
270ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev        ALOGE("%s: layer handle is NULL", __FUNCTION__);
271ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev        return false;
272ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    }
273ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
27485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int hw_w = ctx->dpyAttr[mDpy].xres;
27585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int hw_h = ctx->dpyAttr[mDpy].yres;
276ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
277c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    hwc_rect_t crop = layer->sourceCrop;
278c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    hwc_rect_t dst = layer->displayFrame;
279c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah
280c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) {
281c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah       hwc_rect_t scissor = {0, 0, hw_w, hw_h };
282c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah       qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform);
283c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    }
284ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
285ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    int crop_w = crop.right - crop.left;
286ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    int crop_h = crop.bottom - crop.top;
287ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    int dst_w = dst.right - dst.left;
288ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    int dst_h = dst.bottom - dst.top;
289c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    float w_dscale = ceilf((float)crop_w / (float)dst_w);
290c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    float h_dscale = ceilf((float)crop_h / (float)dst_h);
291ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
292c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    //Workaround for MDP HW limitation in DSI command mode panels where
293c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    //FPS will not go beyond 30 if buffers on RGB pipes are of width < 5
294ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
29585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if((crop_w < 5)||(crop_h < 5))
296ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev        return false;
297ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
298c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    if(ctx->mMDP.version >= qdutils::MDSS_V5) {
299c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        /* Workaround for downscales larger than 4x.
300c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah         * Will be removed once decimator block is enabled for MDSS
301c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah         */
302c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        if(w_dscale > 4.0f || h_dscale > 4.0f)
303c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            return false;
304c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    } else {
305c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        if(w_dscale > 8.0f || h_dscale > 8.0f)
306c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            // MDP 4 supports 1/8 downscale
307c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            return false;
308c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    }
309ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
310ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev    return true;
311ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev}
312ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev
3136371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
3146371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
3156371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
3166371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
3176371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    switch(type) {
31885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    case MDPCOMP_OV_DMA:
31985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy);
32085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(mdp_pipe != ovutils::OV_INVALID) {
32185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            ctx->mDMAInUse = true;
32285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            return mdp_pipe;
32385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
32485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    case MDPCOMP_OV_ANY:
32585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    case MDPCOMP_OV_RGB:
32685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
32785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(mdp_pipe != ovutils::OV_INVALID) {
32885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            return mdp_pipe;
32985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
3306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
33185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(type == MDPCOMP_OV_RGB) {
33285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            //Requested only for RGB pipe
33385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            break;
33485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
33585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    case  MDPCOMP_OV_VG:
33685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy);
33785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    default:
33885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGE("%s: Invalid pipe type",__FUNCTION__);
33985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return ovutils::OV_INVALID;
3406371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    };
3416371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    return ovutils::OV_INVALID;
3426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
3436371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
34485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::isFrameDoable(hwc_context_t *ctx) {
3455d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    bool ret = true;
34645660529af1f4063a00e84aa2361649e6a9a878cArun Kumar K.R    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
3476371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
34885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(!isEnabled()) {
34985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
3505d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ret = false;
3515d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    } else if(ctx->mExtDispConfiguring) {
3526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
35385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                  __FUNCTION__);
3545d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ret = false;
3554693292411622c9be2d23b9904c88907be629625Naseer Ahmed    } else if(ctx->mVideoTransFlag) {
3564693292411622c9be2d23b9904c88907be629625Naseer Ahmed        ALOGD_IF(isDebug(), "%s: MDP Comp. video transition padding round",
3574693292411622c9be2d23b9904c88907be629625Naseer Ahmed                __FUNCTION__);
3586371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
3595d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    return ret;
36085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
36185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
36285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah/* Checks for conditions where all the layers marked for MDP comp cannot be
36385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * bypassed. On such conditions we try to bypass atleast YUV layers */
36485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::isFullFrameDoable(hwc_context_t *ctx,
36585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                hwc_display_contents_1_t* list){
36685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
3675d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    const int numAppLayers = ctx->listStats[mDpy].numAppLayers;
36885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
3694e9a6fcae996778da1343e41693788f27af450faSaurabh Shah    if(sIdleFallBack) {
3704e9a6fcae996778da1343e41693788f27af450faSaurabh Shah        ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy);
3714e9a6fcae996778da1343e41693788f27af450faSaurabh Shah        return false;
3724e9a6fcae996778da1343e41693788f27af450faSaurabh Shah    }
3734e9a6fcae996778da1343e41693788f27af450faSaurabh Shah
37485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(mDpy > HWC_DISPLAY_PRIMARY){
37585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGD_IF(isDebug(), "%s: Cannot support External display(s)",
37685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 __FUNCTION__);
37785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
37885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
37985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
38085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(isSkipPresent(ctx, mDpy)) {
3815d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(),"%s: SKIP present: %d",
3825d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__,
3835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                isSkipPresent(ctx, mDpy));
3846371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        return false;
3856371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
3866371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
38785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(ctx->listStats[mDpy].planeAlpha
388ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed                     && ctx->mMDP.version >= qdutils::MDSS_V5) {
389ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed        ALOGD_IF(isDebug(), "%s: plane alpha not implemented on MDSS",
390ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed                 __FUNCTION__);
391ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed        return false;
392ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed    }
393ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed
394215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah    if(ctx->listStats[mDpy].needsAlphaScale
395215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah       && ctx->mMDP.version < qdutils::MDSS_V5) {
396215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
397215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah        return false;
398215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah    }
399215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah
4006371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    //MDP composition is not efficient if layer needs rotator.
4016371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    for(int i = 0; i < numAppLayers; ++i) {
4026371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        // As MDP h/w supports flip operation, use MDP comp only for
4036371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        // 180 transforms. Fail for any transform involving 90 (90, 270).
4046371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[i];
4056371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
406b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar        if(isYuvBuffer(hnd) ) {
407b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar            if(isSecuring(ctx, layer)) {
408b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
409b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                return false;
410b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar            }
411c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        } else if(layer->transform & HWC_TRANSFORM_ROT_90) {
412c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
413c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            return false;
414c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        }
415c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah
416c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        if(!isValidDimension(ctx,layer)) {
417c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
418c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah                __FUNCTION__);
419c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            return false;
4206371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
4216371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
4225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    //If all above hard conditions are met we can do full or partial MDP comp.
4245d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    bool ret = false;
4255d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(fullMDPComp(ctx, list)) {
4265d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ret = true;
4275d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    } else if (partialMDPComp(ctx, list)) {
4285d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ret = true;
4295d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
4305d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    return ret;
4315d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
4325d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4335d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
4345d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    //Setup mCurrentFrame
4355d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount;
4365d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.fbCount = 0;
4375d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.fbZ = -1;
4385d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed));
4395d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4405d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
4415d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(mdpCount > sMaxPipesPerMixer) {
4425d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
4435d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
4445d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
4455d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4465d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
4475d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int availPipes = getAvailablePipes(ctx);
4485d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4495d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(numPipesNeeded > availPipes) {
4505d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
4515d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
4525d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
4535d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
4545d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4555d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    return true;
4565d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
4575d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4585d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list)
4595d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah{
4605d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
4615d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    //Setup mCurrentFrame
4625d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.reset(numAppLayers);
4635d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    updateLayerCache(ctx, list);
4645d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    updateYUV(ctx, list);
4655d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    batchLayers(); //sets up fbZ also
4665d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4675d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
4685d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used
4695d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
4705d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
4715d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
4725d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4735d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
4745d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int availPipes = getAvailablePipes(ctx);
4755d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4765d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(numPipesNeeded > availPipes) {
4775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
4785d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
4795d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
4805d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
4815d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4825d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    return true;
4835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
4845d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4855d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx,
4865d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        hwc_display_contents_1_t* list){
4875d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
4885d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.reset(numAppLayers);
4895d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    updateYUV(ctx, list);
490c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    int mdpCount = mCurrentFrame.mdpCount;
4915d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int fbNeeded = int(mCurrentFrame.fbCount != 0);
4925d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
4935d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(!isYuvPresent(ctx, mDpy)) {
4945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
4955d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
4965d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
497c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    if(!mdpCount)
498c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        return false;
499c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah
5005d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) {
5015d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__);
5025d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
5035d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
5045d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
5055d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int numPipesNeeded = pipesNeeded(ctx, list);
5065d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int availPipes = getAvailablePipes(ctx);
5075d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(numPipesNeeded > availPipes) {
5085d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d",
5095d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__, numPipesNeeded, availPipes);
5105d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
5115d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
5125d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
51361b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed    int nYuvCount = ctx->listStats[mDpy].yuvCount;
51461b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed    for(int index = 0; index < nYuvCount ; index ++) {
51561b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
51661b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
51761b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed        if(layer->planeAlpha < 0xFF) {
51861b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\
51961b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed                    when sandwiched",
52061b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed                    __FUNCTION__);
52161b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed            return false;
52261b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed        }
52361b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed    }
52461b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed
5256371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    return true;
5266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
5276371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
52885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah/* Checks for conditions where YUV layers cannot be bypassed */
52985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) {
53085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
53185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(isSkipLayer(layer)) {
53285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__);
53385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
5346371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
5356371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
53685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(ctx->mNeedsRotator && ctx->mDMAInUse) {
53785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGE("%s: No DMA for Rotator",__FUNCTION__);
5386371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        return false;
5396371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
5406371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
54185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(isSecuring(ctx, layer)) {
54285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
54385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
54485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
54585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
546c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah    if(!isValidDimension(ctx, layer)) {
547c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",
548c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah            __FUNCTION__);
549c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah        return false;
5506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
551c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah
5526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    return true;
5536371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
5546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
55585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid  MDPComp::batchLayers() {
55685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    /* Idea is to keep as many contiguous non-updating(cached) layers in FB and
55785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah     * send rest of them through MDP. NEVER mark an updating layer for caching.
55885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah     * But cached ones can be marked for MDP*/
55985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
56085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int maxBatchStart = -1;
56185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int maxBatchCount = 0;
56285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
56385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    /* All or Nothing is cached. No batching needed */
5645d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(!mCurrentFrame.fbCount) {
5655d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCurrentFrame.fbZ = -1;
5665d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return;
5675d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
5685d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(!mCurrentFrame.mdpCount) {
5695d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCurrentFrame.fbZ = 0;
57085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return;
5715d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
57285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
57385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    /* Search for max number of contiguous (cached) layers */
57485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int i = 0;
57585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    while (i < mCurrentFrame.layerCount) {
57685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int count = 0;
57785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) {
57885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            count++; i++;
57985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
58085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(count > maxBatchCount) {
58185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            maxBatchCount = count;
58285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            maxBatchStart = i - count;
5835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.fbZ = maxBatchStart;
58485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
58585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(i < mCurrentFrame.layerCount) i++;
58685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
58785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
58885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    /* reset rest of the layers for MDP comp */
58985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; i++) {
59085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(i != maxBatchStart){
59185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
59285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        } else {
59385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            i += maxBatchCount;
59485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
59585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
59685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
59785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mCurrentFrame.fbCount = maxBatchCount;
5985d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
5995d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.fbCount;
60085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
60185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
60285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah             mCurrentFrame.fbCount);
60385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
6045d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
60585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::updateLayerCache(hwc_context_t* ctx,
60685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                               hwc_display_contents_1_t* list) {
60785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
60885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int numAppLayers = ctx->listStats[mDpy].numAppLayers;
60985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int numCacheableLayers = 0;
61085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
61185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int i = 0; i < numAppLayers; i++) {
61285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) {
61385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            numCacheableLayers++;
61485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            mCurrentFrame.isFBComposed[i] = true;
61585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        } else {
6165d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.isFBComposed[i] = false;
61785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            mCachedFrame.hnd[i] = list->hwLayers[i].handle;
61885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
6196371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
6205d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
62185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mCurrentFrame.fbCount = numCacheableLayers;
6225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
6235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.fbCount;
62485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers);
62585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
6266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
62785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahint MDPComp::getAvailablePipes(hwc_context_t* ctx) {
62885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes();
6296371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
6306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
63185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int numAvailable = ov.availablePipes(mDpy);
63285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
63385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    //Reserve DMA for rotator
63485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(ctx->mNeedsRotator)
63585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        numAvailable -= numDMAPipes;
63685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
63785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    //Reserve pipe(s)for FB
63885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(mCurrentFrame.fbCount)
63985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        numAvailable -= pipesForFB();
64085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
64185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return numAvailable;
64285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
64385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
64485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
64585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
64685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int nYuvCount = ctx->listStats[mDpy].yuvCount;
64785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int index = 0;index < nYuvCount; index++){
64885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
64985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
65085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
65185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(!isYUVDoable(ctx, layer)) {
65285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            if(!mCurrentFrame.isFBComposed[nYuvIndex]) {
65385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCurrentFrame.isFBComposed[nYuvIndex] = true;
65485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCurrentFrame.fbCount++;
65585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            }
6566371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        } else {
65785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            if(mCurrentFrame.isFBComposed[nYuvIndex]) {
65885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCurrentFrame.isFBComposed[nYuvIndex] = false;
65985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                mCurrentFrame.fbCount--;
66085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            }
6616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
6626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
6635d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
6645d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.mdpCount = mCurrentFrame.layerCount -
6655d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.fbCount;
66685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__,
66785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah             mCurrentFrame.fbCount);
66885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
66985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
6705d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
67185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ctx->mDMAInUse = false;
67285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
67385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
6745d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
67585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
67685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
6775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    bool fbBatch = false;
67885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount;
6795d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            index++) {
68085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
68185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
68285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
68385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
68485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
68585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            cur_pipe->zOrder = mdpNextZOrder++;
68685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
68785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
68885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
68985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                         layer %d",__FUNCTION__, index);
6905d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                return false;
69185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            }
6925d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        } else if(fbBatch == false) {
6935d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                mdpNextZOrder++;
6945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                fbBatch = true;
6955d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        }
69685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
69785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
6985d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    return true;
6995d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah}
70085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
7015d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
7025d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(!allocLayerPipes(ctx, list)) {
7035d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__);
7045d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        return false;
7055d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
7065d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    //If we are in this block, it means we have yuv + rgb layers both
7075d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    int mdpIdx = 0;
7085d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    for (int index = 0; index < mCurrentFrame.layerCount; index++) {
7095d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        if(!mCurrentFrame.isFBComposed[index]) {
7105d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[index];
7115d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[index];
7125d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            MdpPipeInfo* cur_pipe =
7135d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                    mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
7145d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            cur_pipe->zOrder = mdpIdx++;
7155d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
7165d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            if(configure(ctx, layer,
7175d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                        mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){
7185d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \
7195d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                        layer %d",__FUNCTION__, index);
7205d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                return false;
7215d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            }
7225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        }
7235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    }
7245d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    return true;
72585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah}
72685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
72785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
72885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
7295d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    const int numLayers = ctx->listStats[mDpy].numAppLayers;
7300787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R
7310787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R    //reset old data
7325d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCurrentFrame.reset(numLayers);
73385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
7340787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R    //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU
7350787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R    //do not cache the information for next draw cycle.
7360787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R    if(numLayers > MAX_NUM_APP_LAYERS) {
7370787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R        ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ",
7380787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R                 __FUNCTION__);
7390787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R        return 0;
7400787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R    }
7410787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R
7425d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    //Hard conditions, if not met, cannot do MDP comp
74385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(!isFrameDoable(ctx)) {
74485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame",
74585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                  __FUNCTION__);
7465d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCurrentFrame.reset(numLayers);
7475d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCachedFrame.cacheAll(list);
7485d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCachedFrame.updateCounts(mCurrentFrame);
74985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return 0;
75085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
75185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
75285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    //Check whether layers marked for MDP Composition is actually doable.
7535d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    if(isFullFrameDoable(ctx, list)){
7540b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah        mCurrentFrame.map();
7550b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah        //Acquire and Program MDP pipes
7560b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah        if(!programMDP(ctx, list)) {
7570b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah            mCurrentFrame.reset(numLayers);
7580b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah            mCachedFrame.cacheAll(list);
7590b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah        } else { //Success
7600b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah            //Any change in composition types needs an FB refresh
7610b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah            mCurrentFrame.needsRedraw = false;
7620b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah            if(mCurrentFrame.fbCount &&
7630b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                    ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) ||
7640b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                     (mCurrentFrame.fbCount != mCachedFrame.cacheCount) ||
7650b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                     (mCurrentFrame.fbZ != mCachedFrame.fbZ) ||
7660b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                     (!mCurrentFrame.mdpCount) ||
7670b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                     (list->flags & HWC_GEOMETRY_CHANGED) ||
7680b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                     isSkipPresent(ctx, mDpy) ||
7690b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                     (mDpy > HWC_DISPLAY_PRIMARY))) {
7700b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah                mCurrentFrame.needsRedraw = true;
7715d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            }
7725d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        }
7735d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    } else if(isOnlyVideoDoable(ctx, list)) {
77485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        //All layers marked for MDP comp cannot be bypassed.
77585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        //Try to compose atleast YUV layers through MDP comp and let
77685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        //all the RGB layers compose in FB
7775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        //Destination over
7785d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCurrentFrame.fbZ = -1;
7795d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        if(mCurrentFrame.fbCount)
7805d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount;
7815d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah
7825d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCurrentFrame.map();
7835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        if(!programYUV(ctx, list)) {
7845d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCurrentFrame.reset(numLayers);
7855d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            mCachedFrame.cacheAll(list);
78685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
7875d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    } else {
7885d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCurrentFrame.reset(numLayers);
7895d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        mCachedFrame.cacheAll(list);
79085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
79185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
79285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    //UpdateLayerFlags
79385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    setMDPCompLayerFlags(ctx, list);
7945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah    mCachedFrame.updateCounts(mCurrentFrame);
7956371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
79685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(isDebug()) {
7975d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah        ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED));
79885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        android::String8 sDump("");
79985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        dump(sDump);
80085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ALOGE("%s",sDump.string());
8016371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
8026371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
80385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return mCurrentFrame.fbZ;
8046371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
8056371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
8066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran//=============MDPCompLowRes===================================================
8076371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
8087c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed/*
8097c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Configures pipe(s) for MDP composition
8107c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed */
811bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
81285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                             PipeLayerPair& PipeLayerPair) {
81336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    MdpPipeInfoLowRes& mdp_info =
81485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo));
81536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
81636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
81736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eIsFg isFg = IS_FG_OFF;
81836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eDest dest = mdp_info.index;
81936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
82085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d",
82185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah             __FUNCTION__, layer, zOrder, dest);
82285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
82385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest,
82485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           &PipeLayerPair.rot);
8257c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
8267c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
8276371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx,
82885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                               hwc_display_contents_1_t* list) {
82985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return mCurrentFrame.mdpCount;
8306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
83165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
8326371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
83385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                    hwc_display_contents_1_t* list) {
83485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(isYuvPresent(ctx, mDpy)) {
83585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int nYuvCount = ctx->listStats[mDpy].yuvCount;
836bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
83785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        for(int index = 0; index < nYuvCount ; index ++) {
83885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
8397c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
84085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            if(mCurrentFrame.isFBComposed[nYuvIndex])
84185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                continue;
842f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar
84385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex];
84485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
84585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
8466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            info.pipeInfo = new MdpPipeInfoLowRes;
84736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            info.rot = NULL;
8486371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
84985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
8506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG);
8516371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            if(pipe_info.index == ovutils::OV_INVALID) {
8526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos",
85385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                         __FUNCTION__);
8546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                return false;
8556371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            }
8566371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
85765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    }
85865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
85985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) {
86085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(mCurrentFrame.isFBComposed[index]) continue;
8616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
8626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
86352a135bafb05fabbe5d3281dcc4c9aad98103cbcNaseer Ahmed
8646371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        if(isYuvBuffer(hnd))
8656371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            continue;
8666371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
86785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[index];
86885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
86985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
8706371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        info.pipeInfo = new MdpPipeInfoLowRes;
87136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        info.rot = NULL;
8726371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo;
8736371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
874f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
875f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran
876f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran        if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator
87785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah           && ctx->mMDP.version >= qdutils::MDSS_V5) {
878f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran            type = MDPCOMP_OV_DMA;
879f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran        }
880f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran
881f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran        pipe_info.index = getMdpPipe(ctx, type);
8826371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        if(pipe_info.index == ovutils::OV_INVALID) {
8836371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
8846371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            return false;
8856371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
8867c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
8876371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    return true;
8886371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
8897c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
8906371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
8916371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
89285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(!isEnabled()) {
8936371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
8946371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        return true;
89553bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    }
89653bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
8976371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(!ctx || !list) {
8986371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ALOGE("%s: invalid contxt or list",__FUNCTION__);
8997c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        return false;
9007c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
9017c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
9026371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    /* reset Invalidator */
9034e9a6fcae996778da1343e41693788f27af450faSaurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
9046371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        idleInvalidator->markForSleep();
9054ed83de9e5eba8193a50dab50155014b7d3c7f04Jeykumar Sankaran
9066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    overlay::Overlay& ov = *ctx->mOverlay;
90785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    LayerProp *layerProp = ctx->layerProp[mDpy];
9086371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
90985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
91085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
9116371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    {
91285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(mCurrentFrame.isFBComposed[i]) continue;
91385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
9146371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        hwc_layer_1_t *layer = &list->hwLayers[i];
91536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
91636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(!hnd) {
91736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGE("%s handle null", __FUNCTION__);
91836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return false;
9197c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        }
9204ed83de9e5eba8193a50dab50155014b7d3c7f04Jeykumar Sankaran
92185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[i];
92285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
9236371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        MdpPipeInfoLowRes& pipe_info =
92485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
9256371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ovutils::eDest dest = pipe_info.index;
9266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        if(dest == ovutils::OV_INVALID) {
9276371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest);
9284ed83de9e5eba8193a50dab50155014b7d3c7f04Jeykumar Sankaran            return false;
9296371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
9306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
93136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
93236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            continue;
93336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
9346371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
93536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
93685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 using  pipe: %d", __FUNCTION__, layer,
93785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 hnd, dest );
9386371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
93936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        int fd = hnd->fd;
94036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        uint32_t offset = hnd->offset;
94185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
94236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(rot) {
94336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            if(!rot->queueBuffer(fd, offset))
9446371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                return false;
94536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            fd = rot->getDstMemId();
94636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            offset = rot->getDstOffset();
94736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
94836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
94936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if (!ov.queueBuffer(fd, offset, dest)) {
95036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
95136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return false;
9526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
9536371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
9546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        layerProp[i].mFlags &= ~HWC_MDPCOMP;
9557c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
9567c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    return true;
9577c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
9587c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
9596371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran//=============MDPCompHighRes===================================================
9606371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
9616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx,
96285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                hwc_display_contents_1_t* list) {
9636371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    int pipesNeeded = 0;
96485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int hw_w = ctx->dpyAttr[mDpy].xres;
96585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
96685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int i = 0; i < mCurrentFrame.layerCount; ++i) {
96785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(!mCurrentFrame.isFBComposed[i]) {
96885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            hwc_layer_1_t* layer = &list->hwLayers[i];
96985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            hwc_rect_t dst = layer->displayFrame;
97085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            if(dst.left > hw_w/2) {
97185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                pipesNeeded++;
97285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            } else if(dst.right <= hw_w/2) {
97385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                pipesNeeded++;
97485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            } else {
97585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                pipesNeeded += 2;
97685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            }
97785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        }
9786371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    }
9796371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    return pipesNeeded;
9807c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
9817c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
9826371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
98385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                     MdpPipeInfoHighRes& pipe_info,
98485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                     ePipeType type) {
98585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int hw_w = ctx->dpyAttr[mDpy].xres;
98685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
98785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
98885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(dst.left > hw_w/2) {
98985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        pipe_info.lIndex = ovutils::OV_INVALID;
99085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type);
99185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID)
99285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            return false;
99385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    } else if (dst.right <= hw_w/2) {
99485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        pipe_info.rIndex = ovutils::OV_INVALID;
99585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type);
99685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(pipe_info.lIndex == ovutils::OV_INVALID)
99785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            return false;
99885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    } else {
99985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        pipe_info.rIndex = getMdpPipe(ctx, type);
100085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        pipe_info.lIndex = getMdpPipe(ctx, type);
100185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(pipe_info.rIndex == ovutils::OV_INVALID ||
100285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah           pipe_info.lIndex == ovutils::OV_INVALID)
100385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            return false;
100485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
100585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return true;
10066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
10076371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
10086371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx,
100985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                     hwc_display_contents_1_t* list) {
101065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
101185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int layer_count = ctx->listStats[mDpy].numAppLayers;
10127c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
101385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(isYuvPresent(ctx, mDpy)) {
101485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int nYuvCount = ctx->listStats[mDpy].yuvCount;
101543d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran
101643d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran        for(int index = 0; index < nYuvCount; index ++) {
101785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index];
101843d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran            hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
101985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex];
10206371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            info.pipeInfo = new MdpPipeInfoHighRes;
10217fd7ee4a0e438f613fc072089c1c02fcf115bb24Saurabh Shah            info.rot = NULL;
10226371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
10236371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) {
10246371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos",
102585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                         __FUNCTION__);
10266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                //TODO: windback pipebook data on fail
102743d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran                return false;
102843d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran            }
102943d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran            pipe_info.zOrder = nYuvIndex;
10307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        }
10317c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
10327c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
103365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
103443d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran        hwc_layer_1_t* layer = &list->hwLayers[index];
103543d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran        private_handle_t *hnd = (private_handle_t *)layer->handle;
103643d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran
103743d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran        if(isYuvBuffer(hnd))
103865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            continue;
10397c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
104095c2601aab7f27505e8b086fdd1f1dce31091e5dArun Kumar K.R        int mdpIndex = mCurrentFrame.layerToMDP[index];
104195c2601aab7f27505e8b086fdd1f1dce31091e5dArun Kumar K.R        PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex];
10426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        info.pipeInfo = new MdpPipeInfoHighRes;
10437fd7ee4a0e438f613fc072089c1c02fcf115bb24Saurabh Shah        info.rot = NULL;
10446371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo;
10456371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
10466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ePipeType type = MDPCOMP_OV_ANY;
10476371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
1048f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran        if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator
104985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah           && ctx->mMDP.version >= qdutils::MDSS_V5)
10506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            type = MDPCOMP_OV_DMA;
10516371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
10526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
105365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
10546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            //TODO: windback pipebook data on fail
105565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            return false;
105665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        }
105765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        pipe_info.zOrder = index;
10587c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
10597c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    return true;
10607c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
10616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran/*
10626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran * Configures pipe(s) for MDP composition
10636371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran */
10646371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
106585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                              PipeLayerPair& PipeLayerPair) {
106636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    MdpPipeInfoHighRes& mdp_info =
106785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo));
106836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder);
106936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eIsFg isFg = IS_FG_OFF;
107036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
107136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eDest lDest = mdp_info.lIndex;
107236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eDest rDest = mdp_info.rIndex;
107385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
107485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d"
107585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah             "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest);
107685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
107785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest,
107885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                            rDest, &PipeLayerPair.rot);
10797c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
10807c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
10816371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
10827c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
108385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    if(!isEnabled()) {
108465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
108565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        return true;
1086bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    }
10877c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
10887c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    if(!ctx || !list) {
10897c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
109065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        return false;
10917c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
10927c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
109365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    /* reset Invalidator */
10944e9a6fcae996778da1343e41693788f27af450faSaurabh Shah    if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount)
109565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        idleInvalidator->markForSleep();
109665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
109765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
109885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    LayerProp *layerProp = ctx->layerProp[mDpy];
10997c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
110085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    int numHwLayers = ctx->listStats[mDpy].numAppLayers;
110185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ )
11027c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    {
110385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(mCurrentFrame.isFBComposed[i]) continue;
110485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
11055b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
110636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
110736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(!hnd) {
110836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGE("%s handle null", __FUNCTION__);
110936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return false;
111036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
11117c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
111265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
11137c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed            continue;
11147c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        }
11157c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
111685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        int mdpIndex = mCurrentFrame.layerToMDP[i];
111785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
11186371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        MdpPipeInfoHighRes& pipe_info =
111985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo;
112085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot;
112136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
11226371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ovutils::eDest indexL = pipe_info.lIndex;
11236371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        ovutils::eDest indexR = pipe_info.rIndex;
112485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
112536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        int fd = hnd->fd;
112636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        int offset = hnd->offset;
112736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
112836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(rot) {
112936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            rot->queueBuffer(fd, offset);
113036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            fd = rot->getDstMemId();
113136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            offset = rot->getDstOffset();
113236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
11336371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
11346371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        //************* play left mixer **********
11356371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        if(indexL != ovutils::OV_INVALID) {
11366371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            ovutils::eDest destL = (ovutils::eDest)indexL;
113736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
113885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                     using  pipe: %d", __FUNCTION__, layer, hnd, indexL );
113936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            if (!ov.queueBuffer(fd, offset, destL)) {
114036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__);
114136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                return false;
11427c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed            }
11436371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        }
11447c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
11456371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        //************* play right mixer **********
11466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        if(indexR != ovutils::OV_INVALID) {
11476371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran            ovutils::eDest destR = (ovutils::eDest)indexR;
114836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
114985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                     using  pipe: %d", __FUNCTION__, layer, hnd, indexR );
115036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            if (!ov.queueBuffer(fd, offset, destR)) {
115136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__);
115236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                return false;
11537c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed            }
11547c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed        }
115536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
115665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
11577c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    }
115836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
115965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    return true;
11607c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
11617c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}; //namespace
11627c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
1163