hwc.cpp revision c4aeb6a47160792212f22edecdf1ed45e5f575f3
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
33ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
54019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained
64019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * for attribution purposes only.
74019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R *
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License.
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License.
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
203156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h>
22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h>
23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h>
25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/atomic.h>
261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <EGL/egl.h>
2704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed#include <utils/Trace.h>
28c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran#include <sys/ioctl.h>
291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <overlay.h>
30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
3176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include <overlayWriteback.h>
32b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h>
33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h"
3447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h"
3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h"
36c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan#include "hwc_dump_layers.h"
37bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
384019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h"
39f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h"
4095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed#include "profiler.h"
41c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#include "hwc_vpuclient.h"
42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
4411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
4511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0
472a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
5727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev);
5827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
73bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on
74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their
75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL.
76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */
77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
78bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) {
79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive)
80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_VIRTUAL;
81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return dpy;
82361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
83361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
87660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
908eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
96359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
97359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
98aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
100359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
101aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
10425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
1059f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                  hwc_display_contents_1_t** displays) {
1070df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
1089f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
1099f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
1109f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // value is reset on every prepare. However, for the layer
1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // cache we need to reset it.
1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // We can probably rethink that later on
1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        if (LIKELY(list && list->numHwLayers > 1)) {
1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
1169f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
1179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1189f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
119640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
120640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
121640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
1224019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
1234019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
124bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar        if(ctx->mLayerRotMap[i])
125bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar            ctx->mLayerRotMap[i]->reset();
1262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
127f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
128f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    ctx->mAD->reset();
1298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    MDPComp::reset();
1302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
13216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame
13354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) {
13416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(ctx->layerProp[dpy]) {
13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       delete[] ctx->layerProp[dpy];
13616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       ctx->layerProp[dpy] = NULL;
13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
13854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    ctx->layerProp[dpy] = new LayerProp[numAppLayers];
13916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
14016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
141eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shahstatic void handleGeomChange(hwc_context_t *ctx, int dpy,
142eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        hwc_display_contents_1_t *list) {
1430ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson    /* No point to calling overlay_set on MDP3 */
1440ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson    if(list->flags & HWC_GEOMETRY_CHANGED &&
1450ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson            ctx->mMDP.version >= qdutils::MDP_V4_0) {
146eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        ctx->mOverlay->forceSet(dpy);
147eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah    }
148eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah}
149eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah
1502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1523156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
154640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
15554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
15654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
15754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
158eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
159c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        setListStats(ctx, list, dpy);
160c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
161c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        ctx->mVPUClient->prepare(ctx, list);
162c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
163c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
164c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            const int fbZ = 0;
165c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
166c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        }
167c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        if (ctx->mMDP.version < qdutils::MDP_V4_0) {
168c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mCopyBit[dpy])
169c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
1702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
1712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
1732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
176361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
1773156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
179361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
18076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
18154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
18254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
18354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
185eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
18690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
187c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->dpyAttr[dpy].isConfiguring = false;
188c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            setListStats(ctx, list, dpy);
189c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
190c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                const int fbZ = 0;
191c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
192c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            }
193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
194c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->listStats[dpy].isDisplayAnimating) {
195c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                // Mark all app layers as HWC_OVERLAY for external during
196c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                // animation, so that SF doesnt draw it on FB
197c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
198c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                    hwc_layer_1_t *layer = &list->hwLayers[i];
199c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                    layer->compositionType = HWC_OVERLAY;
200a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                }
20190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            }
20290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
20390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // External Display is in Pause state.
20490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // ToDo:
20590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // Mark all application layers as OVERLAY so that
20690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // GPU will not compose. This is done for power
20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // optimization
20876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
2092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
21125322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
21225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
213361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev,
214361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
2153156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
216361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
218361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_VIRTUAL;
219361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if (LIKELY(list && list->numHwLayers > 1) &&
221361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].isActive &&
222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].connected) {
223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
224eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!ctx->dpyAttr[dpy].isPause) {
226c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->dpyAttr[dpy].isConfiguring = false;
227c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            setListStats(ctx, list, dpy);
228c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
229c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                const int fbZ = 0;
230c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
231c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            }
232361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
233c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->listStats[dpy].isDisplayAnimating) {
234c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                // Mark all app layers as HWC_OVERLAY for virtual during
235c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                // animation, so that SF doesnt draw it on FB
236c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
237c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                    hwc_layer_1_t *layer = &list->hwLayers[i];
238c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                    layer->compositionType = HWC_OVERLAY;
239361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                }
240361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
241361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        } else {
242361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Virtual Display is in Pause state.
243361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // ToDo:
244361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Mark all application layers as OVERLAY so that
245361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // GPU will not compose. This is done for power
246361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // optimization
247361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return 0;
250361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
251361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
253660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
254660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
255befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
2562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
257befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
25827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
25927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ctx->mPanelResetStatus) {
26027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__);
26127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        reset_panel(dev);
26227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
26327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
2647351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
2651a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
2669f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed    reset(ctx, numDisplays, displays);
267bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
26847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
269327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
27076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
27176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
27290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (int32_t i = numDisplays; i >= 0; i--) {
27316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
274bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
275361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
27616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
27716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
27816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
27916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
280361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
281361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
28290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
283361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_virtual(dev, list);
28416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
28516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
28616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
287befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
28947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
290640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
291327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
29276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
293327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
2942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
295befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
296befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
297660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
29855290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
2991589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3003156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3011589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
3021589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
3041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
30555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
3064267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
30755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
30810d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
30955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
310dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
312dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
313f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
314a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
315a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
3161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
317a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
318a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // will be used in hwc_video::configure to disable
319a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // rotation animation on external display
320a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
321a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
322a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
323f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
3241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
3251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
3261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
3281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
330660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
331660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
33204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3331ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
334c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
3351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
336361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
337bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
338bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    /* In case of non-hybrid WFD session, we are fooling SF by
339bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * piggybacking on HDMI display ID for virtual.
340bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * TODO: Not needed once we have WFD client working on top
341bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * of Google API's.
342bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     */
343bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    dpy = getDpyforExternalDisplay(ctx,dpy);
344bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
345f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
34655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
347905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
348905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
349905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
350905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
351905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
352905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
353905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
35476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        overlay::Writeback::clear();
355905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
3562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK;
359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
360361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Failed to handle blank event(%d) for Primary!!",
361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                  __FUNCTION__, blank );
362361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return -1;
363361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!blank) {
366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Enable HPD here, as during bootup unblank is called
367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
368361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
369361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
370361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
371bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
372bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
373bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        if(ctx->mVirtualonExtActive) {
374bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            /* if mVirtualonExtActive is true, display hal will
375bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * receive unblank calls for non-hybrid WFD solution
376bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * since we piggyback on HDMI.
377bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * TODO: Not needed once we have WFD client working on top
378bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             of Google API's */
379bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            break;
380bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        }
381bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    case HWC_DISPLAY_VIRTUAL:
382bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        /* There are two ways to reach this block of code.
383bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
384bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL
385bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and ctx->mVirtualonExtActive is true. In this case, non-hybrid
386bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD is active. If so, getDpyforExternalDisplay will return dpy
387bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         as HWC_DISPLAY_VIRTUAL.
388bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
389bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_PRIMARY
390bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and since SF is not aware of VIRTUAL DISPLAY being handle by HWC,
391bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         it wont send blank / unblank events for it. We piggyback on
392bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         PRIMARY DISPLAY events to release mdp pipes and
393bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         activate/deactivate VIRTUAL DISPLAY.
394bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
395bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * TODO: This separate case statement is not needed once we have
396bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD client working on top of Google API's.
397bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
398bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         */
399361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
400361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
401bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) {
4028f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                int dpy = HWC_DISPLAY_VIRTUAL;
4038f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4048f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ALOGE("%s: display commit fail for virtual!", __FUNCTION__);
4058f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
4068f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
4078f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
408361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
409361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
410361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
411361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
412361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(blank) {
4138f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4148f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ALOGE("%s: display commit fail for external!", __FUNCTION__);
4158f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
4168f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
417361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
418bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
419361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
420361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
421361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
422660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
42355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
424f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
425361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran          blank ? "blanking":"unblanking", dpy);
4268f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
427660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
428660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
42927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev)
43027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{
43127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    int ret = 0;
43227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
43327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
43427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (!ctx->mPanelResetStatus)
43527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        return;
43627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
43727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__);
43827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1);
43927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
44027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to BLANK:  %s", __FUNCTION__,
44127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
44227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
44327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
44427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__);
44527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0);
44627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
44727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__,
44827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
44927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
45027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1);
45127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
45227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ctx->mPanelResetStatus = false;
45327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran}
45427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
45527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
456660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
4571589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
4581589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
4591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
4602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
4611589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
4631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
4641589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
4651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
4661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
4672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
46876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        if(ctx->mMDP.hasOverlay)
46976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            supported |= HWC_DISPLAY_EXTERNAL_BIT;
4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
4712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
472f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan    case HWC_FORMAT_RB_SWAP:
473f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        value[0] = 1;
474f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        break;
475905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    case HWC_COLOR_FILL:
476905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        value[0] = 1;
477905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        break;
4781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
4791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
4801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4811589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
4821589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4831589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
485c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
48704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4883475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
489640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
490e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
49176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
49276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4934019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
49404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
4954019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
49604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
497e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
498e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
499f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
500c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
501c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
502c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
503c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
504f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
505327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
50616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
50716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
508c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
509c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed        ctx->mVPUClient->draw(ctx, list);
510c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
51116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
5122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
5132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
51454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
51504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        if(copybitDone) {
51604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
51704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
51854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
51954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
52054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
52154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
52254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
52316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
5242a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
525c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
526bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd,
527bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                            ctx->listStats[dpy].roi)) {
5288f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
52950c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
5302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
532a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
533a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5343475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
538361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
53904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
54004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
5413475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
54276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
543361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
544361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
545361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
546e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
5474d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
5484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
5494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        uint32_t last = list->numHwLayers - 1;
5504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
5524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
5534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
5544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
55576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
5574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
55876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
5604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
5614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
562eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
5634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
5644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
5654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
5664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
56704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
5684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
5694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
5704d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5714d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
5724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
5734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
5744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
5754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
5764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
5774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
5784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
5804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
5814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
5824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
5833475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
5843475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
585c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
5878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
58854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
5892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
591a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
592a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5933475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
596361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_set_virtual(hwc_context_t *ctx,
597361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
598361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{
599361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    ATRACE_CALL();
600361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0;
6019730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi
602361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_VIRTUAL;
603361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6049730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi
605361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
6069730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ctx->dpyAttr[dpy].connected &&
6079730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            !ctx->dpyAttr[dpy].isPause) {
6089730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        uint32_t last = list->numHwLayers - 1;
6099730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
6109730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        int fd = -1; //FenceFD from the Copybit(valid in async mode)
6119730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        bool copybitDone = false;
6129730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(ctx->mCopyBit[dpy])
6139730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
614361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6159730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(list->numHwLayers > 1)
6169730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hwc_sync(ctx, list, dpy, fd);
617361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
618361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Dump the layers for virtual
619361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(ctx->mHwcDebug[dpy])
620361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mHwcDebug[dpy]->dumpLayers(list);
621361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6229730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
6239730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
6249730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ret = -1;
6259730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        }
626361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6279730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        int extOnlyLayerIndex =
6289730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ctx->listStats[dpy].extOnlyLayerIndex;
629361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6309730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
6319730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(extOnlyLayerIndex!= -1) {
6329730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
6339730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hnd = (private_handle_t *)extLayer->handle;
6349730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        } else if(copybitDone) {
6359730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
6369730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        }
637361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6389730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(hnd && !isYuvBuffer(hnd)) {
6399730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
6409730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
6419730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi                ret = -1;
642361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
643361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
644361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6458f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
6468f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ret = -1;
648361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
649361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
650361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
651361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    closeAcquireFds(list);
652361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
653bf5438200b5c0cf81cb008481e951760df83b161Dileep Kumar Reddi    if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) {
654361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // SF assumes HWC waits for the acquire fence and returns a new fence
655361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // that signals when we're done. Since we don't wait, and also don't
656361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // touch the buffer, we can just handle the acquire fence back to SF
657361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // as the retire fence.
658361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        list->retireFenceFd = list->outbufAcquireFenceFd;
659361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
660361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
661361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return ret;
662361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
663361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
664361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
665660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
666660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
667660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
668befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
669befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
670befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
67190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (uint32_t i = 0; i <= numDisplays; i++) {
672660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
673bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
674361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
67776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
679361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
680361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
68190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
682361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_virtual(ctx, list);
68376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
686660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
68895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
68995eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
69095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
69133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
69256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
6933aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah    if(ctx->mRotMgr->getNumActiveSessions() == 0)
6943aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah        Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
6957351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
6961a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
6972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
699ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
70376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
704bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
7062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
70976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
71076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
71176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
71276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
71376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
7160df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
71776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
7180df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
71976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
72076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
72176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
72276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
72376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
72476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
7252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
726660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
727befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
728befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
729befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
7322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
734bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7350df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
736361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
73876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
73976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
7432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
7442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
7452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
7462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
7492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
7512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
7522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
7542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
7552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
7562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
7572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
7592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
76076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
76176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
7622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
7642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
76576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
76676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
76979e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
77279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
7812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
78393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
78493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
78593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7861a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
787a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
788a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
789a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
790a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
7910df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
792f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
793f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
794f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
795a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
796a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
797a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
798327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
7994762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
800327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
801d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    ovDump[0] = '\0';
802ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    if(Writeback::getDump(ovDump, 1024)) {
803ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        dumpsys_log(aBuf, ovDump);
804ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        ovDump[0] = '\0';
805ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    }
806a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
80793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
80893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
809befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
810befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
811befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
8121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
813befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
814befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
815befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
816befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
817befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
818befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
819befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
820befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
821befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
822befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
823befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
824befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
825befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
826befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
827befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
828befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
829befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
8301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
832befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
8331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
8352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
8368f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_3;
8372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
8382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
8392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
8402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
8412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
8422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
8432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
8442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
84593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
8462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
8472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
8482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
849befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
850befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
851befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
852befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
853