hwc_mdpcomp.cpp revision 0114e85754fb37f4f0eb042fb682b41fd74aa4b5
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only.
5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License.
8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at
9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *
12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and
16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License.
17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
19c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
2016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h>
21bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
22c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
23c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmednamespace qhwc {
24c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/****** Class MDPComp ***********/
27c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2816791f95b2570b9d48fa360875676e9c8559c0a1Naseer AhmedMDPComp::eState MDPComp::sMDPCompState = MDPCOMP_OFF;
2916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedstruct MDPComp::FrameInfo MDPComp::sCurrentFrame;
30c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
3416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedint MDPComp::sActiveMax = 0;
3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sSecuredVid = false;
36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::deinit() {
38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //XXX: Tear down MDP comp state
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
4116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::isSkipPresent (hwc_context_t *ctx) {
4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return  ctx->listStats[HWC_DISPLAY_PRIMARY].skipCount;
4316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed};
4416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
4516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::isYuvPresent (hwc_context_t *ctx) {
4616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return  ctx->listStats[HWC_DISPLAY_PRIMARY].yuvCount;
4716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed};
48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
50c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
51c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
52c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
53c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
56c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
57359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
58c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
59c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
60c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
61c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
62c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
63359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
64c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
65c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
661409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmedvoid MDPComp::reset(hwc_context_t *ctx, hwc_display_contents_1_t* list ) {
671409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed    //Reset flags and states
681409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed    unsetMDPCompLayerFlags(ctx, list);
69c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sCurrentFrame.count = 0;
7016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(sCurrentFrame.pipeLayer) {
7116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        free(sCurrentFrame.pipeLayer);
7216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        sCurrentFrame.pipeLayer = NULL;
73b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed    }
74c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
75c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
76660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::print_info(hwc_layer_1_t* layer)
77c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
78c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     hwc_rect_t sourceCrop = layer->sourceCrop;
79c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     hwc_rect_t displayFrame = layer->displayFrame;
80c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
81c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_l = sourceCrop.left;
82c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_t = sourceCrop.top;
83c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_r = sourceCrop.right;
84c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_b = sourceCrop.bottom;
85c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
86c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_l = displayFrame.left;
87c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_t = displayFrame.top;
88c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_r = displayFrame.right;
89c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_b = displayFrame.bottom;
90c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
91c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     ALOGD_IF(isDebug(), "src:[%d,%d,%d,%d] (%d x %d) \
92c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                             dst:[%d,%d,%d,%d] (%d x %d)",
93c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                             s_l, s_t, s_r, s_b, (s_r - s_l), (s_b - s_t),
94c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                             d_l, d_t, d_r, d_b, (d_r - d_l), (d_b - d_t));
95c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
9616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
9716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedvoid MDPComp::setVidInfo(hwc_layer_1_t *layer, ovutils::eMdpFlags &mdpFlags) {
9816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    private_handle_t *hnd = (private_handle_t *)layer->handle;
9916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
10016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(isSecureBuffer(hnd)) {
10116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
10216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        sSecuredVid = true;
10316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
10416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
10516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
106c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
109660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::prepare(hwc_context_t *ctx, hwc_layer_1_t *layer,
11016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                                            MdpPipeInfo& mdp_info) {
111c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
112c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int nPipeIndex = mdp_info.index;
113c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
114c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if (ctx) {
115c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
116c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        private_handle_t *hnd = (private_handle_t *)layer->handle;
117c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
11816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        overlay::Overlay& ov = *ctx->mOverlay;
119c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(!hnd) {
121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: layer handle is NULL", __FUNCTION__);
122c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
123c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
12516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        int hw_w = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
12616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        int hw_h = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t sourceCrop = layer->sourceCrop;
129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t displayFrame = layer->displayFrame;
130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        const int src_w = sourceCrop.right - sourceCrop.left;
132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        const int src_h = sourceCrop.bottom - sourceCrop.top;
133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t crop = sourceCrop;
135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int crop_w = crop.right - crop.left;
136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int crop_h = crop.bottom - crop.top;
137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t dst = displayFrame;
139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int dst_w = dst.right - dst.left;
140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int dst_h = dst.bottom - dst.top;
141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(dst.left < 0 || dst.top < 0 ||
143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               dst.right > hw_w || dst.bottom > hw_h) {
144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: Destination has negative coordinates",
145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                                  __FUNCTION__);
1469a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah            qhwc::calculate_crop_rects(crop, dst, hw_w, hw_h, 0);
147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
148c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            //Update calulated width and height
149c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            crop_w = crop.right - crop.left;
150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            crop_h = crop.bottom - crop.top;
151c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
152c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_w = dst.right - dst.left;
153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_h = dst.bottom - dst.top;
154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
155c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
156c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if( (dst_w > hw_w)|| (dst_h > hw_h)) {
157c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: Dest rect exceeds FB", __FUNCTION__);
158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            print_info(layer);
159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_w = hw_w;
160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_h = hw_h;
161c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // Determine pipe to set based on pipe index
16416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::eDest dest = (ovutils::eDest)mdp_info.index;
165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eZorder zOrder = ovutils::ZORDER_0;
167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
16816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(mdp_info.zOrder == 0 ) {
169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            zOrder = ovutils::ZORDER_0;
17016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        } else if(mdp_info.zOrder == 1 ) {
171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            zOrder = ovutils::ZORDER_1;
17216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        } else if(mdp_info.zOrder == 2 ) {
173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            zOrder = ovutils::ZORDER_2;
17416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        } else if(mdp_info.zOrder == 3) {
17516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            zOrder = ovutils::ZORDER_3;
176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // Order order order
179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setSource - just setting source
180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setParameter - changes src w/h/f accordingly
181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setCrop - ROI - src_rect
182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setPosition - dst_rect
183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // commit - commit changes to mdp driver
184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // queueBuffer - not here, happens when draw is called
185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
18716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
18816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
18916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
19016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(isYuvBuffer(hnd))
19116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            setVidInfo(layer, mdpFlags);
19216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
193a79e534d42353d8e75b668f5e77b6f6357a08e07Saurabh Shah        ovutils::setMdpFlags(mdpFlags,ovutils::OV_MDP_BACKEND_COMPOSITION);
194b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah
195b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah        if(layer->blending == HWC_BLENDING_PREMULT) {
196b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah            ovutils::setMdpFlags(mdpFlags,
197b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah                    ovutils::OV_MDP_BLEND_FG_PREMULT);
198b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah        }
199b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah
20016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::eTransform orient = overlay::utils::OVERLAY_TRANSFORM_0 ;
201d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah
20216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layer->transform & HWC_TRANSFORM_ROT_90)) {
20316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            if(layer->transform & HWC_TRANSFORM_FLIP_H) {
20416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H);
20516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
206d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah
20716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            if(layer->transform & HWC_TRANSFORM_FLIP_V) {
20816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ovutils::setMdpFlags(mdpFlags,  ovutils::OV_MDP_FLIP_V);
20916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
21016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        } else {
21116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            orient = static_cast<ovutils::eTransform>(layer->transform);
21216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
213d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah
214c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::PipeArgs parg(mdpFlags,
215c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               info,
216c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               zOrder,
21716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                               ovutils::IS_FG_OFF,
218c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               ovutils::ROT_FLAG_DISABLED);
219c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
22016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ov.setSource(parg, dest);
22116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
22216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ov.setTransform(orient, dest);
223c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
224c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::Dim dcrop(crop.left, crop.top, crop_w, crop_h);
22516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ov.setCrop(dcrop, dest);
226c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::Dim dim(dst.left, dst.top, dst_w, dst_h);
22816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ov.setPosition(dim, dest);
229c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP set: crop[%d,%d,%d,%d] dst[%d,%d,%d,%d] \
23116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                       nPipe: %d zorder: %d",__FUNCTION__, dcrop.x,
232c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                       dcrop.y,dcrop.w, dcrop.h, dim.x, dim.y, dim.w, dim.h,
23316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                       mdp_info.index, mdp_info.zOrder);
234c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
235c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (!ov.commit(dest)) {
236c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: commit failed", __FUNCTION__);
237c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
238c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
239c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
240c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return 0;
241c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
242c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
243c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
244c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * MDPComp not possible when
245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 1. We have more than sMaxLayers
246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 2. External display connected
247c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 3. Composition is triggered by
248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *    Idle timer expiry
249c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 4. Rotation is  needed
250c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 5. Overlay in use
251c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
252c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
25316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::isDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //Number of layers
2552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int numAppLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers;
25616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
25716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(numAppLayers < 1 || numAppLayers > (uint32_t)sActiveMax) {
258c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: Unsupported number of layers",__FUNCTION__);
259c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
260c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
261c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
26216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(isSecuring(ctx)) {
26316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
26416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
26516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
26616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
2670114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed    if(ctx->mSecureMode)
2680114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed        return false;
2690114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed
27016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    //Check for skip layers
27116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(isSkipPresent(ctx)) {
27216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Skip layers are present",__FUNCTION__);
2736d41cb36a5f965bb6e5d6e0a6391f97ded56d39dSaurabh Shah        return false;
274c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
275c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
276c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //FB composition on idle timeout
277c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(sIdleFallBack) {
27816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        sIdleFallBack = false;
279c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
280c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
281c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
283d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah    //MDP composition is not efficient if layer needs rotator.
2842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for(int i = 0; i < numAppLayers; ++i) {
285d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah        // As MDP h/w supports flip operation, use MDP comp only for
286d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah        // 180 transforms. Fail for any transform involving 90 (90, 270).
28716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[i];
28816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        private_handle_t *hnd = (private_handle_t *)layer->handle;
28916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if((layer->transform & HWC_TRANSFORM_ROT_90)  && !isYuvBuffer(hnd)) {
29016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
29116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
292c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
293c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
294c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
295c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
296c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
29716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
29816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                                hwc_display_contents_1_t* list) {
29916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    LayerProp *layerProp = ctx->layerProp[HWC_DISPLAY_PRIMARY];
300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
30116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for(int index = 0 ; index < sCurrentFrame.count; index++ ) {
30216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &(list->hwLayers[index]);
30316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[index].mFlags |= HWC_MDPCOMP;
30416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layer->compositionType = HWC_OVERLAY;
30516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layer->hints |= HWC_HINT_CLEAR_FB;
306c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
307c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
308c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
30916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedint MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type){
31016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
31116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    int mdp_pipe = -1;
312c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
31316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    switch(type) {
31416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    case MDPCOMP_OV_ANY:
31516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    case MDPCOMP_OV_RGB:
31616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, HWC_DISPLAY_PRIMARY);
31716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(mdp_pipe != ovutils::OV_INVALID) {
31816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return mdp_pipe;
319c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
320c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
32116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(type == MDPCOMP_OV_RGB) {
32216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            //Requested only for RGB pipe
32316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return -1;
324c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
32516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    case  MDPCOMP_OV_VG:
32616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_VG, HWC_DISPLAY_PRIMARY);
32716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(mdp_pipe != ovutils::OV_INVALID) {
32816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return mdp_pipe;
329c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
33016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return -1;
33116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    default:
33216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE("%s: Invalid pipe type",__FUNCTION__);
33316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return -1;
33416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    };
335c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
336c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
33716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::allocLayerPipes(hwc_context_t *ctx,
3382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t* list,
33916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        FrameInfo& currentFrame) {
34016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
34116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
342c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
3432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int layer_count = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers;
344c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
34516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    currentFrame.count = layer_count;
346c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
34716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    currentFrame.pipeLayer = (PipeLayerPair*)
34816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                          malloc(sizeof(PipeLayerPair) * currentFrame.count);
349c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
35016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(isYuvPresent(ctx)) {
35116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        int nYuvIndex = ctx->listStats[HWC_DISPLAY_PRIMARY].yuvIndex;
35216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
35316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        PipeLayerPair& info = currentFrame.pipeLayer[nYuvIndex];
35416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& pipe_info = info.pipeIndex;
35516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG);
35616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(pipe_info.index < 0) {
35716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos",
35816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                                                          __FUNCTION__);
35916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
360c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
36116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = nYuvIndex;
362c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
363c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
36416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
36516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(index  == ctx->listStats[HWC_DISPLAY_PRIMARY].yuvIndex )
36616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            continue;
367c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
36816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[index];
36916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        PipeLayerPair& info = currentFrame.pipeLayer[index];
37016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& pipe_info = info.pipeIndex;
37116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_ANY);
37216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(pipe_info.index < 0) {
37316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
37416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
37516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
37616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = index;
377c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
378c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
379c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
380c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
381660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::setup(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
382c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int nPipeIndex, vsync_wait, isFG;
3832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int numHwLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers;
384c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
38516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    FrameInfo &currentFrame = sCurrentFrame;
38616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    currentFrame.count = 0;
387c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
38816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(currentFrame.pipeLayer) {
38916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        free(currentFrame.pipeLayer);
39016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        currentFrame.pipeLayer = NULL;
391b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed    }
392b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed
393c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
394c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       ALOGE("%s: invalid context", __FUNCTION__);
395c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       return -1;
396c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
397c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
39816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(!allocLayerPipes(ctx, list, currentFrame)) {
39916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        //clean current frame data
40016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        currentFrame.count = 0;
401c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
40216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(currentFrame.pipeLayer) {
40316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            free(currentFrame.pipeLayer);
40416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            currentFrame.pipeLayer = NULL;
40516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
406c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
40716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Falling back to FB", __FUNCTION__);
40816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
40916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
410c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
41116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for (int index = 0 ; index < currentFrame.count; index++) {
41216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[index];
41316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& cur_pipe = currentFrame.pipeLayer[index].pipeIndex;
414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if( prepare(ctx, layer, cur_pipe) != 0 ) {
416c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           ALOGD_IF(isDebug(), "%s: MDPComp failed to configure overlay for \
417c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                    layer %d with pipe index:%d",__FUNCTION__,
418c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                    index, cur_pipe.index);
419c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           return false;
420c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         }
421c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
422c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
423c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
424c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
42516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedvoid MDPComp::unsetMDPCompLayerFlags(hwc_context_t* ctx,
42616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                                     hwc_display_contents_1_t* list)
427c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
42816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    LayerProp *layerProp = ctx->layerProp[HWC_DISPLAY_PRIMARY];
42916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for (int index = 0 ; index < sCurrentFrame.count; index++) {
43116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(layerProp[index].mFlags & HWC_MDPCOMP) {
43216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            layerProp[index].mFlags &= ~HWC_MDPCOMP;
433c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
4341409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed
43516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(list->hwLayers[index].compositionType == HWC_OVERLAY) {
43616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            list->hwLayers[index].compositionType = HWC_FRAMEBUFFER;
4371409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed        }
438c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
439c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
440c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
44116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
442c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
44316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(!isEnabled() || !isUsed()) {
44416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
44516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
446c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     }
447c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
448c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
449c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
45016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
451c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
452c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
45316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
45416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(idleInvalidator)
45516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
45616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
45716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
45816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    LayerProp *layerProp = ctx->layerProp[HWC_DISPLAY_PRIMARY];
459c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
4602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int numHwLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers;
4612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for(int i = 0; i < numHwLayers; i++ )
462c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
463660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
464c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
46516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
466c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
467c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
468c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
46916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& pipe_info =
47016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                        sCurrentFrame.pipeLayer[i].pipeIndex;
471c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int index = pipe_info.index;
472c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
473c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(index < 0) {
474c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, index);
47516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
476c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
477c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
47816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::eDest dest = (ovutils::eDest)index;
479c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
480c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (ctx ) {
481c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            private_handle_t *hnd = (private_handle_t *)layer->handle;
482c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(!hnd) {
483c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGE("%s handle null", __FUNCTION__);
48416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                return false;
485c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
486c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
487c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                 using  pipe: %d", __FUNCTION__, layer,
489c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                 hnd, index );
490c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
491c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
492c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
49316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                return false;
494c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
495c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
49616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
49716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
498c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
49916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
500c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
501c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
50216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed/*
50316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed * Sets up BORDERFILL as default base pipe and detaches RGB0.
50416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed * Framebuffer is always updated using PLAY ioctl.
50516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed */
506c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
50716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
50816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
50916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    int fb_stride = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride;
51016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    int fb_width = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
51116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    int fb_height = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
51216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    int fb_fd = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd;
51316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
51416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    mdp_overlay ovInfo;
51516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    msmfb_overlay_data ovData;
51616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    memset(&ovInfo, 0, sizeof(mdp_overlay));
51716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    memset(&ovData, 0, sizeof(msmfb_overlay_data));
51816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
51916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.src.format = MDP_RGB_BORDERFILL;
52016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.src.width  = fb_width;
52116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.src.height = fb_height;
52216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.src_rect.w = fb_width;
52316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.src_rect.h = fb_height;
52416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.dst_rect.w = fb_width;
52516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.dst_rect.h = fb_height;
52616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovInfo.id = MSMFB_NEW_REQUEST;
52716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
52816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
52916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
53016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                  strerror(errno));
531c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
532c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
533c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
53416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    ovData.id = ovInfo.id;
53516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
53616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
53716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                   strerror(errno));
53816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
53916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
54016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
54116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
542c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
54316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::init(hwc_context_t *ctx) {
544c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
54516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(!ctx) {
54616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
54716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
548c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
54916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
55016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(!setupBasePipe(ctx)) {
55116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
55216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
55316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
55416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    char property[PROPERTY_VALUE_MAX];
556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
55716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    sEnabled = false;
55816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
55916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                      (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
56016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                      (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
56116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed           sEnabled = true;
562c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
563c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
564c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sDebugLogs = false;
565c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
566c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(atoi(property) != 0)
567c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           sDebugLogs = true;
568c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
569c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
570c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    unsigned long idle_timeout = DEFAULT_IDLE_TIME;
571c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
572c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(atoi(property) != 0)
573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           idle_timeout = atoi(property);
574c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
575c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
576c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //create Idle Invalidator
577c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    idleInvalidator = IdleInvalidator::getInstance();
578c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
579c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(idleInvalidator == NULL) {
580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       ALOGE("%s: failed to instantiate idleInvalidator  object", __FUNCTION__);
581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    } else {
58216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       idleInvalidator->init(timeout_handler, ctx, idle_timeout);
583c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
584c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
585c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
586c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
58716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::configure(hwc_context_t *ctx,
58816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                        hwc_display_contents_1_t* list) {
589c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
590c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!isEnabled()) {
59116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
592c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
593c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
594c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
59516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
59616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
59716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    sActiveMax = ov.availablePipes();
59816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
599c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    bool isMDPCompUsed = true;
60016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    bool doable = isDoable(ctx, list);
601c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
602c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(doable) {
603c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(setup(ctx, list)) {
60416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            setMDPCompLayerFlags(ctx, list);
605c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else {
606c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: MDP Comp Failed",__FUNCTION__);
607c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            isMDPCompUsed = false;
608c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     } else {
610c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF( isDebug(),"%s: MDP Comp not possible[%d]",__FUNCTION__,
611c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                   doable);
612c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        isMDPCompUsed = false;
613c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     }
614c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
615c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     //Reset states
616c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     if(!isMDPCompUsed) {
617c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //Reset current frame
618c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         reset(ctx, list);
619c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     }
620c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
62116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed     sMDPCompState = isMDPCompUsed ? MDPCOMP_ON : MDPCOMP_OFF;
622c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
623c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     return isMDPCompUsed;
624c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
625c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
626c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
627