hwc_mdpcomp.cpp revision 8b2d50f3c665329517352269a687bdf562b2cc6d
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"
22591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h"
238b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h"
24c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmednamespace qhwc {
26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
2716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils;
28c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
29c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp========================================================
30c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL;
32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false;
33c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false;
3416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false;
35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
36c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh ShahMDPComp* MDPComp::getObject(const int& width) {
37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //For now. Later check for width > 2048
38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return new MDPCompLowRes();
39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
4016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
41c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf)
42c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{
43c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    dumpsys_log(buf, "  MDP Composition: ");
44c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    dumpsys_log(buf, "MDPCompState=%d\n", mState);
45c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //XXX: Log more info
46c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
47c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
48c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) {
49c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
50c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!ctx) {
51c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Invalid hwc context!!",__FUNCTION__);
52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
53c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
54c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
55c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!setupBasePipe(ctx)) {
56c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__);
57c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
60c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    char property[PROPERTY_VALUE_MAX];
61c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
62c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sEnabled = false;
63c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) &&
64c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
65c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah             (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
66c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        sEnabled = true;
67c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
68c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
69c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    sDebugLogs = false;
70c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.logs", property, NULL) > 0) {
71c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
72c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            sDebugLogs = true;
73c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
74c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
75c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    unsigned long idle_timeout = DEFAULT_IDLE_TIME;
76c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) {
77c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(atoi(property) != 0)
78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            idle_timeout = atoi(property);
79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //create Idle Invalidator
82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    idleInvalidator = IdleInvalidator::getInstance();
83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(idleInvalidator == NULL) {
85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: failed to instantiate idleInvalidator  object", __FUNCTION__);
86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        idleInvalidator->init(timeout_handler, ctx, idle_timeout);
88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
91c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
92c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) {
93c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    struct hwc_context_t* ctx = (struct hwc_context_t*)(udata);
94c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
95c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
96c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: received empty data in timer callback", __FUNCTION__);
97c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
98c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
99c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
100359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    if(!ctx->proc) {
101c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: HWC proc not registered", __FUNCTION__);
102c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return;
103c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    sIdleFallBack = true;
105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    /* Trigger SF to redraw the current frame */
106359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc->invalidate(ctx->proc);
107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
109c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx,
110c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_display_contents_1_t* list) {
111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    LayerProp *layerProp = ctx->layerProp[dpy];
113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    for(int index = 0; index < ctx->listStats[dpy].numAppLayers; index++ ) {
115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_layer_1_t* layer = &(list->hwLayers[index]);
116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        layerProp[index].mFlags |= HWC_MDPCOMP;
117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        layer->compositionType = HWC_OVERLAY;
118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        layer->hints |= HWC_HINT_CLEAR_FB;
119b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed    }
120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::unsetMDPCompLayerFlags(hwc_context_t* ctx,
123c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_display_contents_1_t* list) {
124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    LayerProp *layerProp = ctx->layerProp[dpy];
126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    for (int index = 0 ;
128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            index < ctx->listStats[dpy].numAppLayers; index++) {
129c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(layerProp[index].mFlags & HWC_MDPCOMP) {
130c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            layerProp[index].mFlags &= ~HWC_MDPCOMP;
131c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
132c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
133c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(list->hwLayers[index].compositionType == HWC_OVERLAY) {
134c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            list->hwLayers[index].compositionType = HWC_FRAMEBUFFER;
135c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        }
136c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
13816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/*
140c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0.
141c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl.
142c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */
143c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) {
144c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
145c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_stride = ctx->dpyAttr[dpy].stride;
146c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_width = ctx->dpyAttr[dpy].xres;
147c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_height = ctx->dpyAttr[dpy].yres;
148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int fb_fd = ctx->dpyAttr[dpy].fd;
149c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mdp_overlay ovInfo;
151c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    msmfb_overlay_data ovData;
152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovInfo, 0, sizeof(mdp_overlay));
153c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    memset(&ovData, 0, sizeof(msmfb_overlay_data));
154c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
155c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.format = MDP_RGB_BORDERFILL;
156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.width  = fb_width;
157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src.height = fb_height;
158c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.w = fb_width;
159c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.src_rect.h = fb_height;
160c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.w = fb_width;
161c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.dst_rect.h = fb_height;
162c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovInfo.id = MSMFB_NEW_REQUEST;
163c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
164c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
165c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                strerror(errno));
167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovData.id = ovInfo.id;
171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                strerror(errno));
174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return false;
175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::printInfo(hwc_layer_1_t* layer) {
180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    hwc_rect_t sourceCrop = layer->sourceCrop;
181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    hwc_rect_t displayFrame = layer->displayFrame;
182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int s_l = sourceCrop.left;
184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int s_t = sourceCrop.top;
185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int s_r = sourceCrop.right;
186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int s_b = sourceCrop.bottom;
187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int d_l = displayFrame.left;
189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int d_t = displayFrame.top;
190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int d_r = displayFrame.right;
191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int d_b = displayFrame.bottom;
192c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ALOGD_IF(isDebug(), "src:[%d,%d,%d,%d] (%d x %d) \
194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            dst:[%d,%d,%d,%d] (%d x %d)",
195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            s_l, s_t, s_r, s_b, (s_r - s_l), (s_b - s_t),
196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            d_l, d_t, d_r, d_b, (d_r - d_l), (d_b - d_t));
197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//=============MDPCompLowRes===================================================
200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPCompLowRes::reset(hwc_context_t *ctx,
201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_display_contents_1_t* list ) {
202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //Reset flags and states
203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    unsetMDPCompLayerFlags(ctx, list);
204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mCurrentFrame.count = 0;
205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(mCurrentFrame.pipeLayer) {
206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        free(mCurrentFrame.pipeLayer);
207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        mCurrentFrame.pipeLayer = NULL;
208c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
209c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah}
210c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
211c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPCompLowRes::setVidInfo(hwc_layer_1_t *layer,
212c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ovutils::eMdpFlags &mdpFlags) {
21316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    private_handle_t *hnd = (private_handle_t *)layer->handle;
214591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan    MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
21516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
21616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(isSecureBuffer(hnd)) {
21716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
21816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
21916fdbfa1b3314c14b63f91ead7044bcd4ad28a3eRamkumar Radhakrishnan    if(metadata && (metadata->operation & PP_PARAM_INTERLACED) &&
22016fdbfa1b3314c14b63f91ead7044bcd4ad28a3eRamkumar Radhakrishnan                                              metadata->interlaced) {
221591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan        ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_DEINTERLACE);
222591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan    }
22316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
22416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
225c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
226c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition
227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
228c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
229c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        MdpPipeInfo& mdp_info) {
230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int nPipeIndex = mdp_info.index;
231c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
232c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
233c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
234c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
235c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!hnd) {
236c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: layer handle is NULL", __FUNCTION__);
237c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return -1;
238c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
239c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
240c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int hw_w = ctx->dpyAttr[dpy].xres;
241c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int hw_h = ctx->dpyAttr[dpy].yres;
242c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
243c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    hwc_rect_t sourceCrop = layer->sourceCrop;
244c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    hwc_rect_t displayFrame = layer->displayFrame;
245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
246c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int src_w = sourceCrop.right - sourceCrop.left;
247c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int src_h = sourceCrop.bottom - sourceCrop.top;
248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
249c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    hwc_rect_t crop = sourceCrop;
250c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int crop_w = crop.right - crop.left;
251c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int crop_h = crop.bottom - crop.top;
252c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
253c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    hwc_rect_t dst = displayFrame;
254c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int dst_w = dst.right - dst.left;
255c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int dst_h = dst.bottom - dst.top;
256c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
257c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(dst.left < 0 || dst.top < 0 ||
258c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            dst.right > hw_w || dst.bottom > hw_h) {
259c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGD_IF(isDebug(),"%s: Destination has negative coordinates",
260c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                __FUNCTION__);
261c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        qhwc::calculate_crop_rects(crop, dst, hw_w, hw_h, 0);
262c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
263c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        //Update calulated width and height
264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        crop_w = crop.right - crop.left;
265c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        crop_h = crop.bottom - crop.top;
266c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
267c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        dst_w = dst.right - dst.left;
268c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        dst_h = dst.bottom - dst.top;
269c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
270c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
271c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if( (dst_w > hw_w)|| (dst_h > hw_h)) {
272c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGD_IF(isDebug(),"%s: Dest rect exceeds FB", __FUNCTION__);
273c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        printInfo(layer);
274c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        dst_w = hw_w;
275c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        dst_h = hw_h;
276c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
277c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
278c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // Determine pipe to set based on pipe index
279c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::eDest dest = (ovutils::eDest)mdp_info.index;
280c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
281c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::eZorder zOrder = ovutils::ZORDER_0;
282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
283c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(mdp_info.zOrder == 0 ) {
284c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        zOrder = ovutils::ZORDER_0;
285c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else if(mdp_info.zOrder == 1 ) {
286c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        zOrder = ovutils::ZORDER_1;
287c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else if(mdp_info.zOrder == 2 ) {
288c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        zOrder = ovutils::ZORDER_2;
289c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else if(mdp_info.zOrder == 3) {
290c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        zOrder = ovutils::ZORDER_3;
291c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
292c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
293c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // Order order order
294c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // setSource - just setting source
295c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // setParameter - changes src w/h/f accordingly
296c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // setCrop - ROI - src_rect
297c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // setPosition - dst_rect
298c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // commit - commit changes to mdp driver
299c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    // queueBuffer - not here, happens when draw is called
300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
301c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
302c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
303c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
304c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
305c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(isYuvBuffer(hnd))
306c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        setVidInfo(layer, mdpFlags);
30716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
308c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::setMdpFlags(mdpFlags,ovutils::OV_MDP_BACKEND_COMPOSITION);
30916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
310c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(layer->blending == HWC_BLENDING_PREMULT) {
311c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ovutils::setMdpFlags(mdpFlags,
312c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                ovutils::OV_MDP_BLEND_FG_PREMULT);
313c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
31416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
315c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::eTransform orient = overlay::utils::OVERLAY_TRANSFORM_0 ;
316b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah
317c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!(layer->transform & HWC_TRANSFORM_ROT_90)) {
318c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(layer->transform & HWC_TRANSFORM_FLIP_H) {
319c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H);
320b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah        }
321b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah
322c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(layer->transform & HWC_TRANSFORM_FLIP_V) {
323c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            ovutils::setMdpFlags(mdpFlags,  ovutils::OV_MDP_FLIP_V);
32416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
325c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
326c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        orient = static_cast<ovutils::eTransform>(layer->transform);
327c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
328d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah
3298b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan    ovutils::eRotFlags rotFlags = ovutils::ROT_FLAGS_NONE;
3308b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan    if(isYuvBuffer(hnd) && (ctx->mMDP.version >= qdutils::MDP_V4_2 &&
3318b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan                           ctx->mMDP.version < qdutils::MDSS_V5)) {
3328b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan        rotFlags = ovutils::ROT_DOWNSCALE_ENABLED;
3338b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan    }
3348b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan
335c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::PipeArgs parg(mdpFlags,
336c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            info,
337c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            zOrder,
338c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            ovutils::IS_FG_OFF,
3398b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan            rotFlags);
340c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
341c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ov.setSource(parg, dest);
34216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
343c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ov.setTransform(orient, dest);
344c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
345c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::Dim dcrop(crop.left, crop.top, crop_w, crop_h);
346c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ov.setCrop(dcrop, dest);
347c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
348c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ovutils::Dim dim(dst.left, dst.top, dst_w, dst_h);
349c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ov.setPosition(dim, dest);
350c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
351c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    ALOGD_IF(isDebug(),"%s: MDP set: crop[%d,%d,%d,%d] dst[%d,%d,%d,%d] \
352c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            nPipe: %d zorder: %d",__FUNCTION__, dcrop.x,
353c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            dcrop.y,dcrop.w, dcrop.h, dim.x, dim.y, dim.w, dim.h,
354c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            mdp_info.index, mdp_info.zOrder);
355c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
356c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if (!ov.commit(dest)) {
357c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: commit failed", __FUNCTION__);
358c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return -1;
359c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
360c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return 0;
361c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
362c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
363c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/*
364c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * MDPComp not possible when
365c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 1. We have more than sMaxLayers
366c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 2. External display connected
367c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 3. Composition is triggered by
368c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed *    Idle timer expiry
369c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 4. Rotation is  needed
370c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 5. Overlay in use
371c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */
372c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
373c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::isDoable(hwc_context_t *ctx,
374c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_display_contents_1_t* list) {
375c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //Number of layers
376c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
377c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int numAppLayers = ctx->listStats[dpy].numAppLayers;
37816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
379c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    overlay::Overlay& ov = *ctx->mOverlay;
380c500638565ae6b65a7007c5d1ad73f1ec5c7e53cJeykumar Sankaran    int availablePipes = ov.availablePipes(dpy);
381c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah
382c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(numAppLayers < 1 || numAppLayers > (uint32_t)availablePipes) {
383c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: Unsupported number of layers",__FUNCTION__);
384c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
385c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
386c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
387413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar    if(ctx->mExtDispConfiguring) {
388413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar        ALOGD_IF( isDebug(),"%s: External Display connection is pending",
389413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar                __FUNCTION__);
390413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar        return false;
391413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar    }
392413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar
39316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(isSecuring(ctx)) {
39416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__);
39516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
39616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
39716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
3980114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed    if(ctx->mSecureMode)
3990114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed        return false;
4000114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed
40116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    //Check for skip layers
402c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(isSkipPresent(ctx, dpy)) {
40316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Skip layers are present",__FUNCTION__);
4046d41cb36a5f965bb6e5d6e0a6391f97ded56d39dSaurabh Shah        return false;
405c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
406c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
407c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(ctx->listStats[dpy].needsAlphaScale) {
40833650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed        ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__);
40933650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed        return false;
41033650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed    }
41133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed
412c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    //FB composition on idle timeout
413c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(sIdleFallBack) {
41416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        sIdleFallBack = false;
415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__);
416c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
417c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
418c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
419d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah    //MDP composition is not efficient if layer needs rotator.
4202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for(int i = 0; i < numAppLayers; ++i) {
421d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah        // As MDP h/w supports flip operation, use MDP comp only for
422d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah        // 180 transforms. Fail for any transform involving 90 (90, 270).
42316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[i];
42416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        private_handle_t *hnd = (private_handle_t *)layer->handle;
42516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if((layer->transform & HWC_TRANSFORM_ROT_90)  && !isYuvBuffer(hnd)) {
42616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__);
42716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
428c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
429c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
431c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
432c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
433c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::getMdpPipe(hwc_context_t *ctx, ePipeType type) {
434c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
43516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
43616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    int mdp_pipe = -1;
437c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
43816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    switch(type) {
439c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        case MDPCOMP_OV_ANY:
440c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        case MDPCOMP_OV_RGB:
441c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, dpy);
442c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            if(mdp_pipe != ovutils::OV_INVALID) {
443c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                return mdp_pipe;
444c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            }
445c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
446c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            if(type == MDPCOMP_OV_RGB) {
447c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                //Requested only for RGB pipe
448c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                return -1;
449c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            }
450c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        case  MDPCOMP_OV_VG:
451c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_VG, dpy);
452c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            if(mdp_pipe != ovutils::OV_INVALID) {
453c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                return mdp_pipe;
454c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            }
455c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            return -1;
456c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        default:
457c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            ALOGE("%s: Invalid pipe type",__FUNCTION__);
45816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return -1;
45916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    };
460c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
461c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
462c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx,
4632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t* list,
46416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        FrameInfo& currentFrame) {
465c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
46616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
467c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int layer_count = ctx->listStats[dpy].numAppLayers;
468c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
46916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    currentFrame.count = layer_count;
47016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    currentFrame.pipeLayer = (PipeLayerPair*)
471c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            malloc(sizeof(PipeLayerPair) * currentFrame.count);
472c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
473c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(isYuvPresent(ctx, dpy)) {
474c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        int nYuvIndex = ctx->listStats[dpy].yuvIndex;
47516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
47616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        PipeLayerPair& info = currentFrame.pipeLayer[nYuvIndex];
47716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& pipe_info = info.pipeIndex;
47816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG);
47916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(pipe_info.index < 0) {
48016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos",
481c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                    __FUNCTION__);
48216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
483c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
48416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = nYuvIndex;
485c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
486c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
48716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for(int index = 0 ; index < layer_count ; index++ ) {
488c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(index  == ctx->listStats[dpy].yuvIndex )
48916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            continue;
490c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
49116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[index];
49216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        PipeLayerPair& info = currentFrame.pipeLayer[index];
49316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& pipe_info = info.pipeIndex;
49416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_ANY);
49516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(pipe_info.index < 0) {
49616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__);
49716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
49816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
49916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        pipe_info.zOrder = index;
500c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
501c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    return true;
502c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
503c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
504c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::setup(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
505c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
506c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    int nPipeIndex, vsync_wait, isFG;
507c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int numHwLayers = ctx->listStats[dpy].numAppLayers;
508c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
509c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    FrameInfo &currentFrame = mCurrentFrame;
51016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    currentFrame.count = 0;
511c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
51216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(currentFrame.pipeLayer) {
51316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        free(currentFrame.pipeLayer);
51416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        currentFrame.pipeLayer = NULL;
515b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed    }
516b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed
517c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx) {
518c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        ALOGE("%s: invalid context", __FUNCTION__);
519c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        return -1;
520c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
521c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
52216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(!allocLayerPipes(ctx, list, currentFrame)) {
52316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        //clean current frame data
52416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        currentFrame.count = 0;
525c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
52616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(currentFrame.pipeLayer) {
52716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            free(currentFrame.pipeLayer);
52816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            currentFrame.pipeLayer = NULL;
52916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
530c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
53116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(), "%s: Falling back to FB", __FUNCTION__);
53216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
53316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
534c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
53516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    for (int index = 0 ; index < currentFrame.count; index++) {
53616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_layer_1_t* layer = &list->hwLayers[index];
53716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& cur_pipe = currentFrame.pipeLayer[index].pipeIndex;
538c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
539c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if(configure(ctx, layer, cur_pipe) != 0 ) {
540c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            ALOGD_IF(isDebug(), "%s: MDPComp failed to configure overlay for \
541c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                    layer %d with pipe index:%d",__FUNCTION__,
542c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                    index, cur_pipe.index);
543c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah            return false;
5441409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed        }
545c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
546c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return true;
547c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
548c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
549c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
550c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
55116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(!isEnabled() || !isUsed()) {
55216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__);
55316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return true;
554c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!ctx || !list) {
557c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGE("%s: invalid contxt or list",__FUNCTION__);
55816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        return false;
559c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
560c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
56116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    /* reset Invalidator */
56216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(idleInvalidator)
56316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        idleInvalidator->markForSleep();
56416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
565c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
56616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
567c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    LayerProp *layerProp = ctx->layerProp[dpy];
568c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
569c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    int numHwLayers = ctx->listStats[dpy].numAppLayers;
5702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for(int i = 0; i < numHwLayers; i++ )
571c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    {
572660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_layer_1_t *layer = &list->hwLayers[i];
573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
57416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        if(!(layerProp[i].mFlags & HWC_MDPCOMP)) {
575c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            continue;
576c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
577c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
57816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        MdpPipeInfo& pipe_info =
579c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                mCurrentFrame.pipeLayer[i].pipeIndex;
580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        int index = pipe_info.index;
581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
582c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(index < 0) {
583c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, index);
58416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            return false;
585c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
586c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
58716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ovutils::eDest dest = (ovutils::eDest)index;
588c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
589c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if (ctx ) {
590c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            private_handle_t *hnd = (private_handle_t *)layer->handle;
591c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if(!hnd) {
592c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGE("%s handle null", __FUNCTION__);
59316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                return false;
594c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
595c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
596c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \
597c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                    using  pipe: %d", __FUNCTION__, layer,
598c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                    hnd, index );
599c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
600c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
601c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
60216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                return false;
603c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            }
604c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
60516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
60616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        layerProp[i].mFlags &= ~HWC_MDPCOMP;
607c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
60816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    return true;
609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
610c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
611c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::prepare(hwc_context_t *ctx,
612c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        hwc_display_contents_1_t* list) {
613c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(!isEnabled()) {
61416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        ALOGE_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__);
615c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        return false;
616c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    }
617c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
61816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    overlay::Overlay& ov = *ctx->mOverlay;
619c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    bool isMDPCompUsed = true;
62016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    bool doable = isDoable(ctx, list);
621c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
622c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    if(doable) {
623c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        if(setup(ctx, list)) {
62416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            setMDPCompLayerFlags(ctx, list);
625c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        } else {
626c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            ALOGD_IF(isDebug(),"%s: MDP Comp Failed",__FUNCTION__);
627c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed            isMDPCompUsed = false;
628c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        }
629c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    } else {
630c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        ALOGD_IF( isDebug(),"%s: MDP Comp not possible[%d]",__FUNCTION__,
631c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah                doable);
632c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        isMDPCompUsed = false;
633c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
634c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
635c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    //Reset states
636c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    if(!isMDPCompUsed) {
637c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed        //Reset current frame
638c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        reset(ctx, list);
639c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    }
64093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
641c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    mState = isMDPCompUsed ? MDPCOMP_ON : MDPCOMP_OFF;
642c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah    return isMDPCompUsed;
64393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
64493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
645c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace
646c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
647