1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2010 The Android Open Source Project
3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are retained
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * for attribution purposes only.
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License");
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License.
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *      http://www.apache.org/licenses/LICENSE-2.0
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS,
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License.
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <fcntl.h>
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <errno.h>
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/log.h>
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/atomic.h>
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <EGL/egl.h>
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Trace.h>
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/ioctl.h>
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlay.h>
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlayRotator.h>
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlayWriteback.h>
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <mdp_version.h>
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_utils.h"
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_fbupdate.h"
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_mdpcomp.h"
36a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_dump_layers.h"
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "external.h"
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_copybit.h"
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_ad.h"
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "profiler.h"
41a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_virtual.h"
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qhwc;
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay;
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define VSYNC_DEBUG 0
47adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed#define POWER_MODE_DEBUG 1
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_device_open(const struct hw_module_t* module,
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                           const char* name,
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                           struct hw_device_t** device);
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic struct hw_module_methods_t hwc_module_methods = {
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    open: hwc_device_open
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
57a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void reset_panel(struct hwc_composer_device_1* dev);
58a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonhwc_module_t HAL_MODULE_INFO_SYM = {
60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    common: {
61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        tag: HARDWARE_MODULE_TAG,
62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        version_major: 2,
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        version_minor: 0,
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        id: HWC_HARDWARE_MODULE_ID,
65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        name: "Qualcomm Hardware Composer Module",
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        author: "CodeAurora Forum",
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        methods: &hwc_module_methods,
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dso: 0,
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        reserved: {0},
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
73a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on
74a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * HDMI display ID for virtual. This helper is needed to differentiate their
75a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * paths in HAL.
76a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * TODO: Not needed once we have WFD client working on top of Google API's */
77a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
78a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) {
79a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive)
80a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        return HWC_DISPLAY_VIRTUAL;
81a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    return dpy;
82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
83a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Save callback functions registered to HWC
86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                              hwc_procs_t const* procs)
89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGI("%s", __FUNCTION__);
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(!ctx) {
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: Invalid context", __FUNCTION__);
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return;
95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->proc = procs;
97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // Now that we have the functions needed, kick off
99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // the uevent & vsync threads
100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    init_uevent_thread(ctx);
101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    init_vsync_thread(ctx);
102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
104b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void setPaddingRound(hwc_context_t *ctx, int numDisplays,
105b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                            hwc_display_contents_1_t** displays) {
106a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ctx->isPaddingRound = false;
107b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    for(int i = 0; i < numDisplays; i++) {
108b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        hwc_display_contents_1_t *list = displays[i];
109b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
110b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal            if((ctx->mPrevHwLayerCount[i] == 1 or
111b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                ctx->mPrevHwLayerCount[i] == 0) and
112b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal               (list->numHwLayers > 1)) {
113b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                /* If the previous cycle for dpy 'i' has 0 AppLayers and the
114b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                 * current cycle has atleast 1 AppLayer, padding round needs
115b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                 * to be invoked in current cycle on all the active displays
116b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                 * to free up the resources.
117b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                 */
118b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                ctx->isPaddingRound = true;
119b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal            }
120b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal            ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers;
121b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        } else {
122b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal            ctx->mPrevHwLayerCount[i] = 0;
123b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        }
124b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    }
125b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal}
126b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
127b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal/* Based on certain conditions, isPaddingRound will be set
128b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal * to make this function self-contained */
129b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void setDMAState(hwc_context_t *ctx, int numDisplays,
130b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                        hwc_display_contents_1_t** displays) {
131b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
132b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    if(ctx->mRotMgr->getNumActiveSessions() == 0)
133b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
134a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
1354db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan    for(int dpy = 0; dpy < numDisplays; dpy++) {
1364db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan        hwc_display_contents_1_t *list = displays[dpy];
137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if (LIKELY(list && list->numHwLayers > 0)) {
1384db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan            for(size_t layerIndex = 0; layerIndex < list->numHwLayers;
1394db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan                                                  layerIndex++) {
1404db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan                if(list->hwLayers[layerIndex].compositionType !=
1414db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan                                            HWC_FRAMEBUFFER_TARGET)
142b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                {
1434db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan                    hwc_layer_1_t const* layer = &list->hwLayers[layerIndex];
144b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                    private_handle_t *hnd = (private_handle_t *)layer->handle;
145b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
1464a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan                    /* If a layer requires rotation, set the DMA state
147b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                     * to BLOCK_MODE */
148b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
1494a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan                    if (canUseRotator(ctx, dpy) &&
1504a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan                        has90Transform(layer) && isRotationDoable(ctx, hnd)) {
1514418482cd51e8343e7efd978ccdd17c616d1d78aRaj Kamal                        if(not ctx->mOverlay->isDMAMultiplexingSupported()) {
152b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                            if(ctx->mOverlay->isPipeTypeAttached(
153b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                                             overlay::utils::OV_MDP_PIPE_DMA))
154b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                                ctx->isPaddingRound = true;
155b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                        }
156b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                        Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
157b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                    }
158b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                }
159b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal            }
1604db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan            if(dpy) {
161b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                /* Uncomment the below code for testing purpose.
162b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                   Assuming the orientation value is in terms of HAL_TRANSFORM,
163b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                   this needs mapping to HAL, if its in different convention */
164b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
165b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                /* char value[PROPERTY_VALUE_MAX];
166b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                   property_get("sys.ext_orientation", value, "0");
167b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                   ctx->mExtOrientation = atoi(value);*/
168b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
169b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                if(ctx->mExtOrientation || ctx->mBufferMirrorMode) {
170b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                    if(ctx->mOverlay->isPipeTypeAttached(
171b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                                         overlay::utils::OV_MDP_PIPE_DMA)) {
172b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                        ctx->isPaddingRound = true;
173b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                    }
174b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                    Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
175b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                }
176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
177b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        }
178b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    }
179b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal}
180a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
181b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays,
182b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                            hwc_display_contents_1_t** displays) {
183b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
184b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    ctx->numActiveDisplays = 0;
185b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    for(int i = 0; i < numDisplays; i++) {
186b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        hwc_display_contents_1_t *list = displays[i];
187b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            /* For display devices like SSD and screenrecord, we cannot
189a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             * rely on isActive and connected attributes of dpyAttr to
190a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             * determine if the displaydevice is active. Hence in case if
191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             * the layer-list is non-null and numHwLayers > 0, we assume
192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             * the display device to be active.
193a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             */
194a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ctx->numActiveDisplays += 1;
195b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        }
196b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    }
197b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal}
198a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
199b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void reset(hwc_context_t *ctx, int numDisplays,
200b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                  hwc_display_contents_1_t** displays) {
201b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
202b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
203b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal    for(int i = 0; i < numDisplays; i++) {
204b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        hwc_display_contents_1_t *list = displays[i];
205b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        // XXX:SurfaceFlinger no longer guarantees that this
206b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        // value is reset on every prepare. However, for the layer
207b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        // cache we need to reset it.
208b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        // We can probably rethink that later on
209b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
210b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal            for(size_t j = 0; j < list->numHwLayers; j++) {
211b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
212b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
213a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            }
214b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal
215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
21744d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal        if(ctx->mMDPComp[i])
21844d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal            ctx->mMDPComp[i]->reset();
219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(ctx->mFBUpdate[i])
220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->mFBUpdate[i]->reset();
221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(ctx->mCopyBit[i])
222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->mCopyBit[i]->reset();
223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(ctx->mLayerRotMap[i])
224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->mLayerRotMap[i]->reset();
225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mAD->reset();
228a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(ctx->mHWCVirtual)
229a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->mHWCVirtual->destroy(ctx, numDisplays, displays);
230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
232a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy,
233a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                            hwc_display_contents_1_t *list) {
2342c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    uint32_t origXres = ctx->dpyAttr[dpy].xres;
2352c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    uint32_t origYres = ctx->dpyAttr[dpy].yres;
2362c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    uint32_t newXres = ctx->dpyAttr[dpy].xres_new;
2372c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    uint32_t newYres = ctx->dpyAttr[dpy].yres_new;
2382c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    float xresRatio = (float)origXres / (float)newXres;
2392c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    float yresRatio = (float)origYres / (float)newYres;
240a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    for (size_t i = 0; i < list->numHwLayers; i++) {
241a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        hwc_layer_1_t *layer = &list->hwLayers[i];
242a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        hwc_rect_t& displayFrame = layer->displayFrame;
243a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
2444217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        uint32_t layerWidth = displayFrame.right - displayFrame.left;
2454217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        uint32_t layerHeight = displayFrame.bottom - displayFrame.top;
2464217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        displayFrame.left = (int)(xresRatio * (float)displayFrame.left);
2474217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        displayFrame.top = (int)(yresRatio * (float)displayFrame.top);
2484217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        displayFrame.right = (int)((float)displayFrame.left +
2494217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu                                   (float)layerWidth * xresRatio);
2504217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        displayFrame.bottom = (int)((float)displayFrame.top +
2514217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu                                    (float)layerHeight * yresRatio);
252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hwc_display_contents_1_t *list) {
257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ATRACE_CALL();
258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const int dpy = HWC_DISPLAY_PRIMARY;
260a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool fbComp = false;
261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (LIKELY(list && list->numHwLayers > 1) &&
262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->dpyAttr[dpy].isActive) {
263a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
2642c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi        if (ctx->dpyAttr[dpy].customFBSize &&
2652c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                list->flags & HWC_GEOMETRY_CHANGED)
266a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            scaleDisplayFrame(ctx, dpy, list);
267a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
2684217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        setListStats(ctx, list, dpy);
270a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
271201e4c9a80c1adb32ac8271a95721aa838c4d9feNaseer Ahmed        fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0);
272a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
273a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if (fbComp) {
274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            const int fbZ = 0;
2757c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah            if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) {
2767c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                ctx->mOverlay->clear(dpy);
2777c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                ctx->mLayerRotMap[dpy]->clear();
2787c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah            }
279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
280a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if (ctx->mMDP.version < qdutils::MDP_V4_0) {
282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if(ctx->mCopyBit[dpy])
283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
2851b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan        setGPUHint(ctx, list);
286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hwc_display_contents_1_t *list) {
292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ATRACE_CALL();
293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const int dpy = HWC_DISPLAY_EXTERNAL;
295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (LIKELY(list && list->numHwLayers > 1) &&
297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->dpyAttr[dpy].isActive &&
298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->dpyAttr[dpy].connected) {
2994217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(!ctx->dpyAttr[dpy].isPause) {
301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ctx->dpyAttr[dpy].isConfiguring = false;
302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            setListStats(ctx, list, dpy);
303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
304ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                const int fbZ = 0;
3057c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ))
3067c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                {
3077c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                    ctx->mOverlay->clear(dpy);
3087c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                    ctx->mLayerRotMap[dpy]->clear();
3097c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah                }
310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        } else {
312a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            /* External Display is in Pause state.
313a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             * Mark all application layers as OVERLAY so that
314a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             * GPU will not compose.
315a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson             */
316a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) {
317a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                hwc_layer_1_t *layer = &list->hwLayers[i];
318a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                layer->compositionType = HWC_OVERLAY;
319a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            }
320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                       hwc_display_contents_1_t** displays)
327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
330a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
331a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if (ctx->mPanelResetStatus) {
332a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__);
333a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        reset_panel(dev);
334a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
335a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //Will be unlocked at the end of set
337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mDrawLock.lock();
338cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain    setPaddingRound(ctx, (int)numDisplays, displays);
339cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain    setDMAState(ctx, (int)numDisplays, displays);
340cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain    setNumActiveDisplays(ctx, (int)numDisplays, displays);
3414217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu    reset(ctx, (int)numDisplays, displays);
342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mOverlay->configBegin();
344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mRotMgr->configBegin();
345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    overlay::Writeback::configBegin();
346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
3474217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu    for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) {
348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hwc_display_contents_1_t *list = displays[i];
349a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        int dpy = getDpyforExternalDisplay(ctx, i);
350a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        switch(dpy) {
351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            case HWC_DISPLAY_PRIMARY:
352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = hwc_prepare_primary(dev, list);
353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            case HWC_DISPLAY_EXTERNAL:
355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = hwc_prepare_external(dev, list);
356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            case HWC_DISPLAY_VIRTUAL:
358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                if(ctx->mHWCVirtual)
359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                    ret = ctx->mHWCVirtual->prepare(dev, list);
360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            default:
362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = -EINVAL;
363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mOverlay->configDone();
367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mRotMgr->configDone();
368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    overlay::Writeback::configDone();
369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return ret;
371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                             int event, int enable)
375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ATRACE_CALL();
377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch(event) {
380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_EVENT_VSYNC:
381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if (ctx->vstate.enable == enable)
382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = hwc_vsync_control(ctx, dpy, enable);
384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if(ret == 0)
385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ctx->vstate.enable = !!enable;
386ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                      (enable)?"ENABLED":"DISABLED");
388ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
389a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef QCOM_BSP
390a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case  HWC_EVENT_ORIENTATION:
391a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            if(dpy == HWC_DISPLAY_PRIMARY) {
392a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                Locker::Autolock _l(ctx->mDrawLock);
393a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                // store the primary display orientation
394a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                ctx->deviceOrientation = enable;
395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            }
396a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
397a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif
398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        default:
399ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = -EINVAL;
400ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return ret;
402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
404adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmedstatic int hwc_setPowerMode(struct hwc_composer_device_1* dev, int dpy,
405adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        int mode)
406ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
407ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ATRACE_CALL();
408ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int ret = 0, value = 0;
410a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
411adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    Locker::Autolock _l(ctx->mDrawLock);
412adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    ALOGD_IF(POWER_MODE_DEBUG, "%s: Setting mode %d on display: %d",
413adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            __FUNCTION__, mode, dpy);
414adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed
415adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    switch(mode) {
416adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        case HWC_POWER_MODE_OFF:
417adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // free up all the overlay pipes in use
418adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // when we get a blank for either display
419adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // makes sure that all pipes are freed
420adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            ctx->mOverlay->configBegin();
421adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            ctx->mOverlay->configDone();
422adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            ctx->mRotMgr->clear();
423adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // If VDS is connected, do not clear WB object as it
424adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // will end up detaching IOMMU. This is required
425adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // to send black frame to WFD sink on power suspend.
426adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // Note: With this change, we keep the WriteBack object
427adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // alive on power suspend for AD use case.
428adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            value = FB_BLANK_POWERDOWN;
429adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            break;
430adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        case HWC_POWER_MODE_DOZE:
431adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        case HWC_POWER_MODE_DOZE_SUSPEND:
432adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            value = FB_BLANK_VSYNC_SUSPEND;
433adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            break;
434adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        case HWC_POWER_MODE_NORMAL:
435adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            value = FB_BLANK_UNBLANK;
436adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            break;
437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
438adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed
439ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch(dpy) {
440a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    case HWC_DISPLAY_PRIMARY:
441a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
442adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            ALOGE("%s: ioctl FBIOBLANK failed for Primary with error %s"
443adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed                    " value %d", __FUNCTION__, strerror(errno), value);
444adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            return -errno;
445a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        }
446a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
447adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        if(mode == HWC_POWER_MODE_NORMAL) {
448adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            // Enable HPD here, as during bootup POWER_MODE_NORMAL is set
449a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            // when SF is completely initialized
450a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ctx->mExtDisplay->setHPD(1);
451a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        }
452a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
453adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF);
454adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        //Deliberate fall through since there is no explicit power mode for
455adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        //virtual displays.
456a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    case HWC_DISPLAY_VIRTUAL:
457a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
458adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            const int dpy = HWC_DISPLAY_VIRTUAL;
459adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            if(mode == HWC_POWER_MODE_OFF and
460adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed                    (not ctx->dpyAttr[dpy].isPause)) {
461a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
462adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed                    ALOGE("%s: displayCommit failed for virtual", __FUNCTION__);
463ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    ret = -1;
464ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                }
465ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
466adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF);
467a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        }
468a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        break;
469a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    case HWC_DISPLAY_EXTERNAL:
470adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        if(mode == HWC_POWER_MODE_OFF) {
471a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
472adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed                ALOGE("%s: displayCommit failed for external", __FUNCTION__);
473a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                ret = -1;
474a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            }
475a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        }
476adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF);
477a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        break;
478a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    default:
479a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        return -EINVAL;
480ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
481ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
482adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    ALOGD_IF(POWER_MODE_DEBUG, "%s: Done setting mode %d on display %d",
483adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed            __FUNCTION__, mode, dpy);
484a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    return ret;
485a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void reset_panel(struct hwc_composer_device_1* dev)
488a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{
489a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int ret = 0;
490a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
491a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
492a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) {
493a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__);
494a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->mPanelResetStatus = false;
495a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        return;
496a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
497a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
498adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    ALOGD("%s: setting power mode off", __FUNCTION__);
499adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_OFF);
500a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if (ret < 0) {
501a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ALOGE("%s: FBIOBLANK failed to BLANK:  %s", __FUNCTION__,
502adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed                strerror(errno));
503a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
504a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
505adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    ALOGD("%s: setting power mode normal and enabling vsync", __FUNCTION__);
506adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_NORMAL);
507a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if (ret < 0) {
508a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__,
509adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed                strerror(errno));
510a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
511a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1);
512a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
513a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ctx->mPanelResetStatus = false;
514ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
515ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
516a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
517ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_query(struct hwc_composer_device_1* dev,
518ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                     int param, int* value)
519ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
520ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
521ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int supported = HWC_DISPLAY_PRIMARY_BIT;
522ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
523ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch (param) {
524ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    case HWC_BACKGROUND_LAYER_SUPPORTED:
525ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        // Not supported for now
526ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        value[0] = 0;
527ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        break;
528a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    case HWC_DISPLAY_TYPES_SUPPORTED:
529ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(ctx->mMDP.hasOverlay) {
530ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            supported |= HWC_DISPLAY_VIRTUAL_BIT;
5310fdae193307fb17bb537598ab62682edd5138b72radhakrishna            if(!(qdutils::MDPVersion::getInstance().is8x26() ||
5323fdd1867c6a39a4397ea74370c0d895be30b0e76Prabhanjan Kandula                        qdutils::MDPVersion::getInstance().is8x16() ||
5333fdd1867c6a39a4397ea74370c0d895be30b0e76Prabhanjan Kandula                        qdutils::MDPVersion::getInstance().is8x39()))
534ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                supported |= HWC_DISPLAY_EXTERNAL_BIT;
535ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
536ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        value[0] = supported;
537ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        break;
538a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    case HWC_FORMAT_RB_SWAP:
539a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        value[0] = 1;
540a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        break;
541a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    case HWC_COLOR_FILL:
542a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        value[0] = 1;
543a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        break;
544ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    default:
545ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -EINVAL;
546ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
547ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
548ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
549ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
550ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
551ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
552ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
553ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ATRACE_CALL();
554ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
555ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const int dpy = HWC_DISPLAY_PRIMARY;
556ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
5574217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        size_t last = list->numHwLayers - 1;
558ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
559ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int fd = -1; //FenceFD from the Copybit(valid in async mode)
560ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        bool copybitDone = false;
56180cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan
56280cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan        if (ctx->mCopyBit[dpy]) {
56380cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan            if (ctx->mMDP.version < qdutils::MDP_V4_0)
56480cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan                copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
56580cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan            else
56680cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan                fd = ctx->mMDPComp[dpy]->drawOverlap(ctx, list);
56780cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan        }
56880cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan
569ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(list->numHwLayers > 1)
570ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hwc_sync(ctx, list, dpy, fd);
571ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
572a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        // Dump the layers for primary
573a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(ctx->mHwcDebug[dpy])
574a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ctx->mHwcDebug[dpy]->dumpLayers(list);
575a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
576201e4c9a80c1adb32ac8271a95721aa838c4d9feNaseer Ahmed        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
577ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
578ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = -1;
579ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
580ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
581ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        //TODO We dont check for SKIP flag on this layer because we need PAN
582ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        //always. Last layer is always FB
583ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
584a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) {
585ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
586ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
587ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
588bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh        if(isAbcInUse(ctx) == true) {
589bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh            int index = ctx->listStats[dpy].renderBufIndexforABC;
590bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh            hwc_layer_1_t *tempLayer = &list->hwLayers[index];
591bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh            hnd = (private_handle_t *)tempLayer->handle;
592bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh        }
593bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh
594ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(hnd) {
595ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
596ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
597ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = -1;
598ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
599ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
600ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
6016f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran        int lSplit = getLeftSplit(ctx, dpy);
60234a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran        qhwc::ovutils::Dim lRoi = qhwc::ovutils::Dim(
6036f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            ctx->listStats[dpy].lRoi.left,
6046f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            ctx->listStats[dpy].lRoi.top,
6056f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            ctx->listStats[dpy].lRoi.right - ctx->listStats[dpy].lRoi.left,
60634a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran            ctx->listStats[dpy].lRoi.bottom - ctx->listStats[dpy].lRoi.top);
6076f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran
60834a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran        qhwc::ovutils::Dim rRoi = qhwc::ovutils::Dim(
6096f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            ctx->listStats[dpy].rRoi.left - lSplit,
6106f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            ctx->listStats[dpy].rRoi.top,
6116f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            ctx->listStats[dpy].rRoi.right - ctx->listStats[dpy].rRoi.left,
61234a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran            ctx->listStats[dpy].rRoi.bottom - ctx->listStats[dpy].rRoi.top);
6136f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran
6146f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, lRoi, rRoi)) {
615a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
616ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = -1;
617ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
618a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
619ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
620ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
621a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    closeAcquireFds(list);
622ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return ret;
623ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
624ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
625ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_set_external(hwc_context_t *ctx,
626a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                            hwc_display_contents_1_t* list)
627ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
628ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ATRACE_CALL();
629ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
630a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
631ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    const int dpy = HWC_DISPLAY_EXTERNAL;
632ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
633a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
634ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
635a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->dpyAttr[dpy].connected &&
636a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        !ctx->dpyAttr[dpy].isPause) {
6374217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu        size_t last = list->numHwLayers - 1;
638ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
639ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int fd = -1; //FenceFD from the Copybit(valid in async mode)
640ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        bool copybitDone = false;
641ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(ctx->mCopyBit[dpy])
642ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
643ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
644ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(list->numHwLayers > 1)
645ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hwc_sync(ctx, list, dpy, fd);
646ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
647a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        // Dump the layers for external
648a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(ctx->mHwcDebug[dpy])
649a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ctx->mHwcDebug[dpy]->dumpLayers(list);
650a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
651ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
652ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
653ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = -1;
654ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
655ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
656a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        int extOnlyLayerIndex =
657a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                ctx->listStats[dpy].extOnlyLayerIndex;
658a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
659ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
660a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(extOnlyLayerIndex!= -1) {
661a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
662a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            hnd = (private_handle_t *)extLayer->handle;
663a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        } else if(copybitDone) {
664ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
665ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
666ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
667a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(hnd && !isYuvBuffer(hnd)) {
668ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
669ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
670ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = -1;
671ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
672ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
673ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
674a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
675a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
676ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = -1;
677ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
678ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
679ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
680a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    closeAcquireFds(list);
681ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return ret;
682ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
683ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
684ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_set(hwc_composer_device_1 *dev,
685ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                   size_t numDisplays,
686ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                   hwc_display_contents_1_t** displays)
687ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
688ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
689ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
6904217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu    for (int i = 0; i < (int)numDisplays; i++) {
691ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hwc_display_contents_1_t* list = displays[i];
692a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        int dpy = getDpyforExternalDisplay(ctx, i);
693a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        switch(dpy) {
694ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            case HWC_DISPLAY_PRIMARY:
695ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = hwc_set_primary(ctx, list);
696ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
697ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            case HWC_DISPLAY_EXTERNAL:
698ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = hwc_set_external(ctx, list);
699ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
700ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            case HWC_DISPLAY_VIRTUAL:
701a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                if(ctx->mHWCVirtual)
702a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                    ret = ctx->mHWCVirtual->set(ctx, list);
703ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
704ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            default:
705ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = -EINVAL;
706ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
707ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
708ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // This is only indicative of how many times SurfaceFlinger posts
709ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // frames to the display.
710ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    CALC_FPS();
711ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDPComp::resetIdleFallBack();
712ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mVideoTransFlag = false;
713ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //Was locked at the beginning of prepare
714ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mDrawLock.unlock();
715ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return ret;
716ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
717ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
718ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
719ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        uint32_t* configs, size_t* numConfigs) {
720ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int ret = 0;
721ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
722a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    disp = getDpyforExternalDisplay(ctx, disp);
723adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    //Currently we allow only 1 config, reported as config id # 0
724adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    //This config is passed in to getDisplayAttributes. Ignored for now.
725ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch(disp) {
726ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_PRIMARY:
727ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if(*numConfigs > 0) {
728ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                configs[0] = 0;
729ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                *numConfigs = 1;
730ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
731ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = 0; //NO_ERROR
732ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
733ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_EXTERNAL:
734a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case HWC_DISPLAY_VIRTUAL:
735ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ret = -1; //Not connected
736a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            if(ctx->dpyAttr[disp].connected) {
737ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ret = 0; //NO_ERROR
738ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                if(*numConfigs > 0) {
739ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    configs[0] = 0;
740ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    *numConfigs = 1;
741ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                }
742ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
743ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
744ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
745ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return ret;
746ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
747ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
748ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
749a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        uint32_t /*config*/, const uint32_t* attributes, int32_t* values) {
750ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
751ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
752a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    disp = getDpyforExternalDisplay(ctx, disp);
753a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
754a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
755ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -1;
756ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
757ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
758ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //From HWComposer
759ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static const uint32_t DISPLAY_ATTRIBUTES[] = {
760ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        HWC_DISPLAY_VSYNC_PERIOD,
761ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        HWC_DISPLAY_WIDTH,
762ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        HWC_DISPLAY_HEIGHT,
763ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        HWC_DISPLAY_DPI_X,
764ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        HWC_DISPLAY_DPI_Y,
765ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        HWC_DISPLAY_NO_ATTRIBUTE,
766ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
767ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
7684217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu    const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
769ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            sizeof(DISPLAY_ATTRIBUTES)[0]);
770ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
771ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
772ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        switch (attributes[i]) {
773ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_VSYNC_PERIOD:
774ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            values[i] = ctx->dpyAttr[disp].vsync_period;
775ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
776ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_WIDTH:
7772c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi            if (ctx->dpyAttr[disp].customFBSize)
7782c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                values[i] = ctx->dpyAttr[disp].xres_new;
7792c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi            else
7802c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                values[i] = ctx->dpyAttr[disp].xres;
7812c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi
782ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
7832c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                    values[i]);
784ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
785ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_HEIGHT:
7862c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi            if (ctx->dpyAttr[disp].customFBSize)
7872c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                values[i] = ctx->dpyAttr[disp].yres_new;
7882c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi            else
7892c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                values[i] = ctx->dpyAttr[disp].yres;
790ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
7912c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi                    values[i]);
792ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
793ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_DPI_X:
794ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
795ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
796ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case HWC_DISPLAY_DPI_Y:
797ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
798ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
799ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        default:
800ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("Unknown display attribute %d",
801ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    attributes[i]);
802ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return -EINVAL;
803ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
804ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
805ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
806ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
807ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
808ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
809ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
810ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hwc_context_t* ctx = (hwc_context_t*)(dev);
811ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Locker::Autolock _l(ctx->mDrawLock);
812ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    android::String8 aBuf("");
813ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
814ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
815ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
816ced6b79c3e1b60b05e2e054e709b1f9a2b6b304cNaseer Ahmed    if(ctx->vstate.fakevsync)
817ced6b79c3e1b60b05e2e054e709b1f9a2b6b304cNaseer Ahmed        dumpsys_log(aBuf, "  Vsync is being faked!!\n");
818a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
819ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(ctx->mMDPComp[dpy])
820463feeb515f0cc7454eac70ae8bb96df4b852a38Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf, ctx);
821ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
822ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    char ovDump[2048] = {'\0'};
823ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mOverlay->getDump(ovDump, 2048);
824ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    dumpsys_log(aBuf, ovDump);
825ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ovDump[0] = '\0';
826ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ctx->mRotMgr->getDump(ovDump, 1024);
827ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    dumpsys_log(aBuf, ovDump);
828ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ovDump[0] = '\0';
829ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(Writeback::getDump(ovDump, 1024)) {
830ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dumpsys_log(aBuf, ovDump);
831ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ovDump[0] = '\0';
832ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
833ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    strlcpy(buff, aBuf.string(), buff_len);
834ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
835ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
836adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmedint hwc_getActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/) {
837adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    //Supports only the default config (0th index) for now
838adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    return 0;
839adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed}
840adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed
841adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmedint hwc_setActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/,
842adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        int index) {
843adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    //Supports only the default config (0th index) for now
844adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed    return (index == 0) ? index : -EINVAL;
845adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed}
846adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed
847ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_device_close(struct hw_device_t *dev)
848ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
849ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(!dev) {
850ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: NULL device pointer", __FUNCTION__);
851ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -1;
852ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
853ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    closeContext((hwc_context_t*)dev);
854ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    free(dev);
855ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
856ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
857ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
858ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
859ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
860ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                           struct hw_device_t** device)
861ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
862ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int status = -EINVAL;
863ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
864ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
865ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        struct hwc_context_t *dev;
866ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev = (hwc_context_t*)malloc(sizeof(*dev));
867a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(dev == NULL)
868a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            return status;
869ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        memset(dev, 0, sizeof(*dev));
870ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
871ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        //Initialize hwc context
872ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        initContext(dev);
873ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
874ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        //Setup HWC methods
875ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
876adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_4;
877ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.common.module       = const_cast<hw_module_t*>(module);
878ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.common.close        = hwc_device_close;
879ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.prepare             = hwc_prepare;
880ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.set                 = hwc_set;
881ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.eventControl        = hwc_eventControl;
882adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        dev->device.setPowerMode        = hwc_setPowerMode;
883ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.query               = hwc_query;
884ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.registerProcs       = hwc_registerProcs;
885ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.dump                = hwc_dump;
886ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
887ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
888adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        dev->device.getActiveConfig     = hwc_getActiveConfig;
889adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed        dev->device.setActiveConfig     = hwc_setActiveConfig;
890ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        *device = &dev->device.common;
891ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        status = 0;
892ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
893ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return status;
894ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
895