hwc_mdpcomp.cpp revision 359c544e1ca5ad76be326d9ee809e7bee51f94b4
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
2c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Copyright (C) 2012, Code Aurora Forum. 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"
20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_qbuf.h"
21c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_external.h"
22c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
23c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#define SUPPORT_4LAYER 0
24c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmednamespace qhwc {
26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
27c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/****** Class PipeMgr ***********/
28c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid inline PipeMgr::reset() {
30c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mVGPipes = MAX_VG;
31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mVGUsed = 0;
32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mVGIndex = 0;
33c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mRGBPipes = MAX_RGB;
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mRGBUsed = 0;
35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mRGBIndex = MAX_VG;
36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    mTotalAvail = mVGPipes + mRGBPipes;
37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    memset(&mStatus, 0x0 , sizeof(int)*mTotalAvail);
38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint PipeMgr::req_for_pipe(int pipe_req) {
41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
42c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    switch(pipe_req) {
43c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        case PIPE_REQ_VG: //VG
44c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(mVGPipes){
45c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mVGPipes--;
46c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mVGUsed++;
47c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mTotalAvail--;
48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return PIPE_REQ_VG;
49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
50c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        case PIPE_REQ_RGB: // RGB
51c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(mRGBPipes) {
52c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mRGBPipes--;
53c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mRGBUsed++;
54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mTotalAvail--;
55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return PIPE_REQ_RGB;
56c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
57c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return PIPE_NONE;
58c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        case PIPE_REQ_FB: //FB
59c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(mRGBPipes) {
60c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               mRGBPipes--;
61c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               mRGBUsed++;
62c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               mTotalAvail--;
63c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               mStatus[VAR_INDEX] = PIPE_IN_FB_MODE;
64c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               return PIPE_REQ_FB;
65c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           }
66c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        default:
67c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            break;
68c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    };
69c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return PIPE_NONE;
70c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
71c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
72c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint PipeMgr::assign_pipe(int pipe_pref) {
73c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    switch(pipe_pref) {
74c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        case PIPE_REQ_VG: //VG
75c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(mVGUsed) {
76c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mVGUsed--;
77c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mStatus[mVGIndex] = PIPE_IN_COMP_MODE;
78c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return mVGIndex++;
79c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
80c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        case PIPE_REQ_RGB: //RGB
81c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(mRGBUsed) {
82c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mRGBUsed--;
83c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                mStatus[mRGBIndex] = PIPE_IN_COMP_MODE;
84c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return mRGBIndex++;
85c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
86c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        default:
87c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: PipeMgr:invalid case in pipe_mgr_assign",
88c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                       __FUNCTION__);
89c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
90c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    };
91c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
92c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
93c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/****** Class MDPComp ***********/
94c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
95c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedMDPComp::State MDPComp::sMDPCompState = MDPCOMP_OFF;
96c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedstruct MDPComp::frame_info MDPComp::sCurrentFrame;
97c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedPipeMgr MDPComp::sPipeMgr;
98c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
99c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
100c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
101c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint MDPComp::sSkipCount = 0;
102c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint MDPComp::sMaxLayers = 0;
103c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::deinit() {
105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //XXX: Tear down MDP comp state
106c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
109c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
110c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
111c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
112c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
113c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
114c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
115c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
116c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
117359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
118c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
119c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
122c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
123359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
125c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
1261409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmedvoid MDPComp::reset(hwc_context_t *ctx, hwc_display_contents_1_t* list ) {
1271409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed    //Reset flags and states
1281409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed    unsetMDPCompLayerFlags(ctx, list);
1291409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed    if(sMDPCompState == MDPCOMP_ON) {
1301409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed        sMDPCompState = MDPCOMP_OFF_PENDING;
1311409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed    }
1321409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed
133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sCurrentFrame.count = 0;
134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    free(sCurrentFrame.pipe_layer);
135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sCurrentFrame.pipe_layer = NULL;
136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //Reset MDP pipes
138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sPipeMgr.reset();
139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sPipeMgr.setStatus(VAR_INDEX, PIPE_IN_FB_MODE);
140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER
142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    configure_var_pipe(ctx);
143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif
144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
146660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::setLayerIndex(hwc_layer_1_t* layer, const int pipe_index)
147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
148c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    layer->flags &= ~HWC_MDPCOMP_INDEX_MASK;
149c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    layer->flags |= pipe_index << MDPCOMP_INDEX_OFFSET;
150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
151c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
152660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::getLayerIndex(hwc_layer_1_t* layer)
153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int byp_index = -1;
155c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
156c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(layer->flags & HWC_MDPCOMP) {
157c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        byp_index = ((layer->flags & HWC_MDPCOMP_INDEX_MASK) >>
158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                               MDPCOMP_INDEX_OFFSET);
159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        byp_index = (byp_index < sMaxLayers ? byp_index : -1 );
160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
161c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return byp_index;
162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
163660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::print_info(hwc_layer_1_t* layer)
164c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     hwc_rect_t sourceCrop = layer->sourceCrop;
166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     hwc_rect_t displayFrame = layer->displayFrame;
167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_l = sourceCrop.left;
169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_t = sourceCrop.top;
170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_r = sourceCrop.right;
171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int s_b = sourceCrop.bottom;
172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_l = displayFrame.left;
174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_t = displayFrame.top;
175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_r = displayFrame.right;
176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     int d_b = displayFrame.bottom;
177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     ALOGD_IF(isDebug(), "src:[%d,%d,%d,%d] (%d x %d) \
179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                             dst:[%d,%d,%d,%d] (%d x %d)",
180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                             s_l, s_t, s_r, s_b, (s_r - s_l), (s_b - s_t),
181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                             d_l, d_t, d_r, d_b, (d_r - d_l), (d_b - d_t));
182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
186660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::prepare(hwc_context_t *ctx, hwc_layer_1_t *layer,
187c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                            mdp_pipe_info& mdp_info) {
188c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
189c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int nPipeIndex = mdp_info.index;
190c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
191c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if (ctx) {
192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
193c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        private_handle_t *hnd = (private_handle_t *)layer->handle;
194c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
195c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        overlay::Overlay& ov = *(ctx->mOverlay);
196c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
197c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(!hnd) {
198c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: layer handle is NULL", __FUNCTION__);
199c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
200c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
201c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
202c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
203c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int hw_w = ctx->mFbDev->width;
204c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int hw_h = ctx->mFbDev->height;
205c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
206c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
207c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t sourceCrop = layer->sourceCrop;
208c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t displayFrame = layer->displayFrame;
209c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
210c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        const int src_w = sourceCrop.right - sourceCrop.left;
211c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        const int src_h = sourceCrop.bottom - sourceCrop.top;
212c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
213c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t crop = sourceCrop;
214c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int crop_w = crop.right - crop.left;
215c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int crop_h = crop.bottom - crop.top;
216c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
217c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        hwc_rect_t dst = displayFrame;
218c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int dst_w = dst.right - dst.left;
219c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int dst_h = dst.bottom - dst.top;
220c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
221c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //REDUNDANT ??
222c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(hnd != NULL &&
223c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               (hnd->flags & private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM )) {
224c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: failed due to non-pmem memory",__FUNCTION__);
225c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
226c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
228c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(dst.left < 0 || dst.top < 0 ||
229c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed               dst.right > hw_w || dst.bottom > hw_h) {
230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: Destination has negative coordinates",
231c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                                  __FUNCTION__);
232c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
233c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            qhwc::calculate_crop_rects(crop, dst, hw_w, hw_h);
234c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
235c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            //Update calulated width and height
236c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            crop_w = crop.right - crop.left;
237c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            crop_h = crop.bottom - crop.top;
238c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
239c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_w = dst.right - dst.left;
240c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_h = dst.bottom - dst.top;
241c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
242c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
243c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if( (dst_w > hw_w)|| (dst_h > hw_h)) {
244c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: Dest rect exceeds FB", __FUNCTION__);
245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            print_info(layer);
246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_w = hw_w;
247c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dst_h = hw_h;
248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
249c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
250c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // Determine pipe to set based on pipe index
251c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eDest dest = ovutils::OV_PIPE_ALL;
252c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (nPipeIndex == 0) {
253c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dest = ovutils::OV_PIPE0;
254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else if (nPipeIndex == 1) {
255c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dest = ovutils::OV_PIPE1;
256c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else if (nPipeIndex == 2) {
257c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dest = ovutils::OV_PIPE2;
258c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
259c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
260c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eZorder zOrder = ovutils::ZORDER_0;
261c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
262c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(mdp_info.z_order == 0 ) {
263c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            zOrder = ovutils::ZORDER_0;
264c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else if(mdp_info.z_order == 1 ) {
265c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            zOrder = ovutils::ZORDER_1;
266c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else if(mdp_info.z_order == 2 ) {
267c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            zOrder = ovutils::ZORDER_2;
268c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
269c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
270c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // Order order order
271c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setSource - just setting source
272c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setParameter - changes src w/h/f accordingly
273c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setCrop - ROI - src_rect
274c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // setPosition - dst_rect
275c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // commit - commit changes to mdp driver
276c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        // queueBuffer - not here, happens when draw is called
277c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
278c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eTransform orient =
279c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            static_cast<ovutils::eTransform>(layer->transform);
280c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
281c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ov.setTransform(orient, dest);
282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
283c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eMdpFlags mdpFlags = mdp_info.isVG ? ovutils::OV_MDP_PIPE_SHARE
284c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                   : ovutils::OV_MDP_FLAGS_NONE;
285c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eIsFg isFG = mdp_info.isFG ? ovutils::IS_FG_SET
286c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                           : ovutils::IS_FG_OFF;
287c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::PipeArgs parg(mdpFlags,
288c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               info,
289c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               zOrder,
290c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               isFG,
291c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                               ovutils::ROT_FLAG_DISABLED);
292c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
293c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::PipeArgs pargs[MAX_PIPES] = { parg, parg, parg };
294c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (!ov.setSource(pargs, dest)) {
295c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: setSource failed", __FUNCTION__);
296c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
297c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
298c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
299c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::Dim dcrop(crop.left, crop.top, crop_w, crop_h);
300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (!ov.setCrop(dcrop, dest)) {
301c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: setCrop failed", __FUNCTION__);
302c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
303c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
304c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
305c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::Dim dim(dst.left, dst.top, dst_w, dst_h);
306c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (!ov.setPosition(dim, dest)) {
307c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: setPosition failed", __FUNCTION__);
308c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
309c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
310c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
311c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP set: crop[%d,%d,%d,%d] dst[%d,%d,%d,%d] \
312c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                       nPipe: %d isFG: %d zorder: %d",__FUNCTION__, dcrop.x,
313c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                       dcrop.y,dcrop.w, dcrop.h, dim.x, dim.y, dim.w, dim.h,
314c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                       nPipeIndex,mdp_info.isFG, mdp_info.z_order);
315c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
316c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (!ov.commit(dest)) {
317c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: commit failed", __FUNCTION__);
318c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
319c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
320c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
321c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return 0;
322c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
323c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
324c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
325c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * MDPComp not possible when
326c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 1. We have more than sMaxLayers
327c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 2. External display connected
328c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 3. Composition is triggered by
329c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *    Idle timer expiry
330c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 4. Rotation is  needed
331c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 5. Overlay in use
332c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
333c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
334660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::is_doable(hwc_composer_device_1_t *dev,
3351409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed                        hwc_display_contents_1_t* list) {
336c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
337c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
338c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
339c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: hwc context is NULL", __FUNCTION__);
340c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
341c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
342c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
343c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //Number of layers
3441c51df74d381b330b9675429c93a09cbeb512629Naseer Ahmed    if(list->numHwLayers < 1 || list->numHwLayers > (uint32_t)sMaxLayers) {
345c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: Unsupported number of layers",__FUNCTION__);
346c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
347c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
348c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
349c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //Disable MDPComp when ext display connected
350c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(ctx->mExtDisplay->getExternalDisplay()) {
351c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: External display connected.", __FUNCTION__);
3526d41cb36a5f965bb6e5d6e0a6391f97ded56d39dSaurabh Shah        return false;
353c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
354c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
355c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //FB composition on idle timeout
356c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(sIdleFallBack) {
357c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
358c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
359c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
360c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
361c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //MDP composition is not efficient if rotation is needed.
362c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for(unsigned int i = 0; i < list->numHwLayers; ++i) {
363c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(list->hwLayers[i].transform) {
364c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
365c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return false;
366c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
367c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
368c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
369c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
370c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
371c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
372660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::setMDPCompLayerFlags(hwc_display_contents_1_t* list) {
373c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
374c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for(int index = 0 ; index < sCurrentFrame.count; index++ )
375c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
376c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int layer_index = sCurrentFrame.pipe_layer[index].layer_index;
377c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(layer_index >= 0) {
378660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            hwc_layer_1_t* layer = &(list->hwLayers[layer_index]);
379c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
380c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            layer->flags |= HWC_MDPCOMP;
381c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            layer->compositionType = HWC_OVERLAY;
382c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            layer->hints |= HWC_HINT_CLEAR_FB;
383c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
384c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
385c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
386c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
387660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::get_layer_info(hwc_layer_1_t* layer, int& flags) {
388c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
389c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    private_handle_t* hnd = (private_handle_t*)layer->handle;
390c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
391c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(layer->flags & HWC_SKIP_LAYER) {
392c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        flags |= MDPCOMP_LAYER_SKIP;
393c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    } else if(hnd != NULL &&
394c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        (hnd->flags & private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM )) {
395c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        flags |= MDPCOMP_LAYER_UNSUPPORTED_MEM;
396c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
397c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
398c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(layer->blending != HWC_BLENDING_NONE)
399c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        flags |= MDPCOMP_LAYER_BLEND;
400c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
401c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int dst_w, dst_h;
402c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    getLayerResolution(layer, dst_w, dst_h);
403c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
404c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    hwc_rect_t sourceCrop = layer->sourceCrop;
405c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    const int src_w = sourceCrop.right - sourceCrop.left;
406c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    const int src_h = sourceCrop.bottom - sourceCrop.top;
407c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(((src_w > dst_w) || (src_h > dst_h))) {
408c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        flags |= MDPCOMP_LAYER_DOWNSCALE;
409c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
410c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
411c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
412660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::mark_layers(hwc_display_contents_1_t* list, layer_mdp_info* layer_info,
413c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                    frame_info& current_frame) {
414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int layer_count = list->numHwLayers;
416c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
417c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(layer_count > sMaxLayers) {
418c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(!sPipeMgr.req_for_pipe(PIPE_REQ_FB)) {
419c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: binding var pipe to FB failed!!", __FUNCTION__);
420c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return 0;
421c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
422c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
423c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
424c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //Parse layers from higher z-order
425c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for(int index = layer_count - 1 ; index >= 0; index-- ) {
426660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[index];
427c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
428c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int layer_prop = 0;
429c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        get_layer_info(layer, layer_prop);
430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
431c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(),"%s: prop for layer [%d]: %x", __FUNCTION__,
432c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                             index, layer_prop);
433c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
434c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //Both in cases of NON-CONTIGUOUS memory or SKIP layer,
435c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //current version of mdp composition falls back completely to FB
436c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //composition.
437c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //TO DO: Support dual mode composition
438c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
439c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(layer_prop & MDPCOMP_LAYER_UNSUPPORTED_MEM) {
440c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(), "%s: Non contigous memory",__FUNCTION__);
441c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return MDPCOMP_ABORT;
442c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
443c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
444c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(layer_prop & MDPCOMP_LAYER_SKIP) {
445c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(), "%s:skip layer",__FUNCTION__);
446c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return MDPCOMP_ABORT;
447c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
448c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
449c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //Request for MDP pipes
450c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int pipe_pref = PIPE_REQ_VG;
451c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
452c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if((layer_prop & MDPCOMP_LAYER_DOWNSCALE) &&
453c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                        (layer_prop & MDPCOMP_LAYER_BLEND)) {
454c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            pipe_pref = PIPE_REQ_RGB;
455c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         }
456c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
457c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int allocated_pipe = sPipeMgr.req_for_pipe( pipe_pref);
458c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(allocated_pipe) {
459c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed          layer_info[index].can_use_mdp = true;
460c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed          layer_info[index].pipe_pref = allocated_pipe;
461c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed          current_frame.count++;
462c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }else {
463c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: pipe marking in mark layer fails for : %d",
464c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                          __FUNCTION__, allocated_pipe);
465c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return MDPCOMP_FAILURE;
466c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
467c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
468c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return MDPCOMP_SUCCESS;
469c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
470c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
471c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::reset_layer_mdp_info(layer_mdp_info* layer_info, int count) {
472c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for(int i = 0 ; i < count; i++ ) {
473c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        layer_info[i].can_use_mdp = false;
474c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        layer_info[i].pipe_pref = PIPE_NONE;
475c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
476c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
477c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
478660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::alloc_layer_pipes(hwc_display_contents_1_t* list,
479c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                        layer_mdp_info* layer_info, frame_info& current_frame) {
480c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
481c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int layer_count = list->numHwLayers;
482c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int mdp_count = current_frame.count;
483c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int fallback_count = layer_count - mdp_count;
484c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int frame_pipe_count = 0;
485c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
486c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    ALOGD_IF(isDebug(), "%s:  dual mode: %d  total count: %d \
487c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                mdp count: %d fallback count: %d",
488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                            __FUNCTION__, (layer_count != mdp_count),
489c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                            layer_count, mdp_count, fallback_count);
490c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
491c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
492660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[index];
493c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
494c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(layer_info[index].can_use_mdp) {
495c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             pipe_layer_pair& info = current_frame.pipe_layer[frame_pipe_count];
496c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             mdp_pipe_info& pipe_info = info.pipe_index;
497c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
498c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             pipe_info.index = sPipeMgr.assign_pipe(layer_info[index].pipe_pref);
499c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             pipe_info.isVG = (layer_info[index].pipe_pref == PIPE_REQ_VG);
500c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             pipe_info.isFG = (frame_pipe_count == 0);
501c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             /* if VAR pipe is attached to FB, FB will be updated with
502c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                VSYNC WAIT flag, so no need to set VSYNC WAIT for any
503c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                bypass pipes. if not, set VSYNC WAIT to the last updating pipe*/
504c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             pipe_info.vsync_wait =
505c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                 (sPipeMgr.getStatus(VAR_INDEX) == PIPE_IN_FB_MODE) ? false:
506c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                      (frame_pipe_count == (mdp_count - 1));
507c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             /* All the layers composed on FB will have MDP zorder 0, so start
508c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                assigning from  1*/
509c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                pipe_info.z_order = index -
510c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                        (fallback_count ? fallback_count - 1 : fallback_count);
511c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
512c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             info.layer_index = index;
513c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed             frame_pipe_count++;
514c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
515c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
516c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return 1;
517c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
518c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
519c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed//returns array of layers and their allocated pipes
520660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::parse_and_allocate(hwc_context_t* ctx, hwc_display_contents_1_t* list,
521c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                  frame_info& current_frame ) {
522c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
523c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int layer_count = list->numHwLayers;
524c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
525c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* clear pipe status */
526c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sPipeMgr.reset();
527c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
528c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    layer_mdp_info* bp_layer_info = (layer_mdp_info*)
529c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                   malloc(sizeof(layer_mdp_info)* layer_count);
530c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
531c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    reset_layer_mdp_info(bp_layer_info, layer_count);
532c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
533c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* iterate through layer list to mark candidate */
534c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(mark_layers(list, bp_layer_info, current_frame) == MDPCOMP_ABORT) {
535c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        free(bp_layer_info);
536c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        current_frame.count = 0;
537c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE_IF(isDebug(), "%s:mark_layers failed!!", __FUNCTION__);
538c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
539c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
540c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    current_frame.pipe_layer = (pipe_layer_pair*)
541c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                          malloc(sizeof(pipe_layer_pair) * current_frame.count);
542c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
543c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* allocate MDP pipes for marked layers */
544c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    alloc_layer_pipes( list, bp_layer_info, current_frame);
545c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
546c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    free(bp_layer_info);
547c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
548c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
549c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER
550c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint MDPComp::configure_var_pipe(hwc_context_t* ctx) {
551c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
552c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
553c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       ALOGE("%s: invalid context", __FUNCTION__);
554c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       return -1;
555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
557c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    framebuffer_device_t *fbDev = ctx->fbDev;
558c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if (!fbDev) {
559c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: fbDev is NULL", __FUNCTION__);
560c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return -1;
561c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
562c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
563c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int new_mode = -1, cur_mode;
564c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    fbDev->perform(fbDev,EVENT_GET_VAR_PIPE_MODE, (void*)&cur_mode);
565c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
566c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(sPipeMgr.getStatus(VAR_INDEX) == PIPE_IN_FB_MODE) {
567c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        new_mode = VAR_PIPE_FB_ATTACH;
568c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    } else if(sPipeMgr.getStatus(VAR_INDEX) == PIPE_IN_BYP_MODE) {
569c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        new_mode = VAR_PIPE_FB_DETACH;
570c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        fbDev->perform(fbDev,EVENT_WAIT_POSTBUFFER,NULL);
571c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
572c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    ALOGD_IF(isDebug(),"%s: old_mode: %d new_mode: %d", __FUNCTION__,
574c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                      cur_mode, new_mode);
575c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
576c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if((new_mode != cur_mode) && (new_mode >= 0)) {
577c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       if(fbDev->perform(fbDev,EVENT_SET_VAR_PIPE_MODE,(void*)&new_mode) < 0) {
578c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           ALOGE("%s: Setting var pipe mode failed", __FUNCTION__);
579c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       }
580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
582c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return 0;
583c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
584c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif
585c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
586660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::setup(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
587c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int nPipeIndex, vsync_wait, isFG;
588c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int numHwLayers = list->numHwLayers;
589c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
590c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    frame_info &current_frame = sCurrentFrame;
591c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    current_frame.count = 0;
592c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
593c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
594c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       ALOGE("%s: invalid context", __FUNCTION__);
595c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       return -1;
596c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
597c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
598c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    framebuffer_device_t *fbDev = ctx->mFbDev;
599c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if (!fbDev) {
600c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: fbDev is NULL", __FUNCTION__);
601c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return -1;
602c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
603c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
604c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!parse_and_allocate(ctx, list, current_frame)) {
605c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER
606c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       int mode = VAR_PIPE_FB_ATTACH;
607c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       if(fbDev->perform(fbDev,EVENT_SET_VAR_PIPE_MODE,(void*)&mode) < 0 ) {
608c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           ALOGE("%s: setting var pipe mode failed", __FUNCTION__);
609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       }
610c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif
611c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       ALOGD_IF(isDebug(), "%s: Falling back to FB", __FUNCTION__);
612c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       return false;
613c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
614c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER
615c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    configure_var_pipe(ctx);
616c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif
617c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
618c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    overlay::Overlay& ov = *(ctx->mOverlay);
619c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    ovutils::eOverlayState state = ov.getState();
620c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
621c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if (current_frame.count == 1) {
622c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         state = ovutils::OV_BYPASS_1_LAYER;
623c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    } else if (current_frame.count == 2) {
624c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         state = ovutils::OV_BYPASS_2_LAYER;
625c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    } else if (current_frame.count == 3) {
626c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         state = ovutils::OV_BYPASS_3_LAYER;
627c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed   }
628c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
629c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed      ov.setState(state);
630c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
631c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
632c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for (int index = 0 ; index < current_frame.count; index++) {
633c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int layer_index = current_frame.pipe_layer[index].layer_index;
634660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[layer_index];
635c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        mdp_pipe_info& cur_pipe = current_frame.pipe_layer[index].pipe_index;
636c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
637c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if( prepare(ctx, layer, cur_pipe) != 0 ) {
638c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           ALOGD_IF(isDebug(), "%s: MDPComp failed to configure overlay for \
639c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                    layer %d with pipe index:%d",__FUNCTION__,
640c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                    index, cur_pipe.index);
641c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           return false;
642c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         } else {
643c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            setLayerIndex(layer, index);
644c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         }
645c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
646c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
647c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
648c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
649660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::unsetMDPCompLayerFlags(hwc_context_t* ctx, hwc_display_contents_1_t* list)
650c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
651c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if (!list)
652c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
653c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
654c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for (int index = 0 ; index < sCurrentFrame.count; index++) {
655c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int l_index = sCurrentFrame.pipe_layer[index].layer_index;
656c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(list->hwLayers[l_index].flags & HWC_MDPCOMP) {
657c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            list->hwLayers[l_index].flags &= ~HWC_MDPCOMP;
658c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
6591409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed
6601409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed        if(list->hwLayers[l_index].compositionType == HWC_OVERLAY) {
6611409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed            list->hwLayers[l_index].compositionType = HWC_FRAMEBUFFER;
6621409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed        }
663c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
664c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
665c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
666660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
667c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
668c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!isEnabled()) {
669c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled",__FUNCTION__);
670c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return 0;
671c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     }
672c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
673c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
674c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
675c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return -1;
676c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
677c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
678c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    overlay::Overlay& ov = *(ctx->mOverlay);
679c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
680c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    for(unsigned int i = 0; i < list->numHwLayers; i++ )
681c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
682660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
683c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
684c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(!(layer->flags & HWC_MDPCOMP)) {
685c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(), "%s: Layer Not flagged for MDP comp",
686c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                                                __FUNCTION__);
687c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
688c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
689c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
690c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int data_index = getLayerIndex(layer);
691c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        mdp_pipe_info& pipe_info =
692c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                          sCurrentFrame.pipe_layer[data_index].pipe_index;
693c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int index = pipe_info.index;
694c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
695c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(index < 0) {
696c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, index);
697c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return -1;
698c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
699c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
700c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        /* reset Invalidator */
701c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(idleInvalidator)
702c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        idleInvalidator->markForSleep();
703c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
704c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ovutils::eDest dest;
705c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
706c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (index == 0) {
707c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dest = ovutils::OV_PIPE0;
708c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else if (index == 1) {
709c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dest = ovutils::OV_PIPE1;
710c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else if (index == 2) {
711c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            dest = ovutils::OV_PIPE2;
712c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
713c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
714c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (ctx ) {
715c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            private_handle_t *hnd = (private_handle_t *)layer->handle;
716c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(!hnd) {
717c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGE("%s handle null", __FUNCTION__);
718c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return -1;
719c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
720c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
721c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            //lock buffer before queue
722c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            //XXX: Handle lock failure
723c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ctx->qbuf->lockAndAdd(hnd);
724c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
725c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
726c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                 using  pipe: %d", __FUNCTION__, layer,
727c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                 hnd, index );
728c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
729c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
730c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
731c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                return -1;
732c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
733c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
734c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        layer->flags &= ~HWC_MDPCOMP;
735c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        layer->flags |= HWC_MDPCOMP_INDEX_MASK;
736c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
737c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return 0;
738c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
739c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
740c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::init(hwc_context_t *dev) {
741c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
742c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!dev) {
743c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
744c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
745c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
746c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
747c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER
748c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(MAX_MDPCOMP_LAYERS > MAX_STATIC_PIPES) {
749c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        framebuffer_device_t *fbDev = dev->fbDevice;
750c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(fbDev == NULL) {
751c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: FATAL: framebuffer device is NULL", __FUNCTION__);
752c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return false;
753c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
754c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
755c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //Receive VAR pipe object from framebuffer
756c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(fbDev->perform(fbDev,EVENT_GET_VAR_PIPE,(void*)&ov) < 0) {
757c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: FATAL: getVariablePipe failed!!", __FUNCTION__);
758c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            return false;
759c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
760c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
761c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        sPipeMgr.setStatus(VAR_INDEX, PIPE_IN_FB_MODE);
762c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
763c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif
764c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    char property[PROPERTY_VALUE_MAX];
765c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
766c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sMaxLayers = 0;
767c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(property_get("debug.mdpcomp.maxlayer", property, NULL) > 0) {
768c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(atoi(property) != 0)
769c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           sMaxLayers = atoi(property);
770c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
771c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
772c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sDebugLogs = false;
773c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
774c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(atoi(property) != 0)
775c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           sDebugLogs = true;
776c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
777c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
778c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    unsigned long idle_timeout = DEFAULT_IDLE_TIME;
779c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
780c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(atoi(property) != 0)
781c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed           idle_timeout = atoi(property);
782c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
783c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
784c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //create Idle Invalidator
785c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    idleInvalidator = IdleInvalidator::getInstance();
786c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
787c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(idleInvalidator == NULL) {
788c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       ALOGE("%s: failed to instantiate idleInvalidator  object", __FUNCTION__);
789c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    } else {
790c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed       idleInvalidator->init(timeout_handler, dev, idle_timeout);
791c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
792c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
793c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
794c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
795660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::configure(hwc_composer_device_1_t *dev,  hwc_display_contents_1_t* list) {
796c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
797c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!isEnabled()) {
798c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
799c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
800c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
801c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
802c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
803c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
804c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    bool isMDPCompUsed = true;
805c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    bool doable = is_doable(dev, list);
806c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
807c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(doable) {
808c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(setup(ctx, list)) {
809c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            setMDPCompLayerFlags(list);
810c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            sMDPCompState = MDPCOMP_ON;
811c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else {
812c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: MDP Comp Failed",__FUNCTION__);
813c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            isMDPCompUsed = false;
814c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
815c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     } else {
816c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF( isDebug(),"%s: MDP Comp not possible[%d]",__FUNCTION__,
817c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                   doable);
818c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        isMDPCompUsed = false;
819c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     }
820c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
821c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     //Reset states
822c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     if(!isMDPCompUsed) {
823c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //Reset current frame
824c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed         reset(ctx, list);
825c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     }
826c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
827c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     sIdleFallBack = false;
828c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
829c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed     return isMDPCompUsed;
830c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
831c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
832c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
833