hwc.cpp revision 0ba4c1d6ac1b48697b6464f6450665836e50baeb
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
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
71bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on
72361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their
73361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL.
74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */
75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
76bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) {
77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive)
78361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_VIRTUAL;
79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return dpy;
80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
85660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
888eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
94359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
95359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
96aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
97aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
98359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
100befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
10225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
1039f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
1049f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                  hwc_display_contents_1_t** displays) {
1050df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
1079f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
1089f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // value is reset on every prepare. However, for the layer
1099f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // cache we need to reset it.
1109f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // We can probably rethink that later on
1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        if (LIKELY(list && list->numHwLayers > 1)) {
1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1169f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
117640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
118640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
119640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
1204019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
1214019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
122bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar        if(ctx->mLayerRotMap[i])
123bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar            ctx->mLayerRotMap[i]->reset();
1242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
125f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
126f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    ctx->mAD->reset();
1278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    MDPComp::reset();
1282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
13016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame
13154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) {
13216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(ctx->layerProp[dpy]) {
13316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       delete[] ctx->layerProp[dpy];
13416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       ctx->layerProp[dpy] = NULL;
13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
13654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    ctx->layerProp[dpy] = new LayerProp[numAppLayers];
13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
13816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
139eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shahstatic void handleGeomChange(hwc_context_t *ctx, int dpy,
140eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        hwc_display_contents_1_t *list) {
1410ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson    /* No point to calling overlay_set on MDP3 */
1420ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson    if(list->flags & HWC_GEOMETRY_CHANGED &&
1430ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson            ctx->mMDP.version >= qdutils::MDP_V4_0) {
144eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        ctx->mOverlay->forceSet(dpy);
145eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah    }
146eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah}
147eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah
1482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1503156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
152640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
15354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
15454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
15554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
156eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
157074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
1586e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
1596e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        if(fbLayer->handle) {
160640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            setListStats(ctx, list, dpy);
161c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
162c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed            ctx->mVPUClient->prepare(ctx, list);
163c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                const int fbZ = 0;
166699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
167699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
1689ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            if (ctx->mMDP.version < qdutils::MDP_V4_0) {
169699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                if(ctx->mCopyBit[dpy])
1709ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
1719ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            }
1722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
1732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
1752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
178361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
1793156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
181361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
18276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
18354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
18554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
18654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
187eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
18876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
18954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
19090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
19190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            if(fbLayer->handle) {
192361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->dpyAttr[dpy].isConfiguring = false;
19390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                setListStats(ctx, list, dpy);
194699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
195699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    const int fbZ = 0;
196699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
197699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                }
198f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
199a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                if(ctx->listStats[dpy].isDisplayAnimating) {
200a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    // Mark all app layers as HWC_OVERLAY for external during
201a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    // animation, so that SF doesnt draw it on FB
202a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
203a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                        hwc_layer_1_t *layer = &list->hwLayers[i];
204a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                        layer->compositionType = HWC_OVERLAY;
205a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    }
206a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                }
20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            }
20890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
20990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // External Display is in Pause state.
21090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // ToDo:
21190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // Mark all application layers as OVERLAY so that
21290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // GPU will not compose. This is done for power
21390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // optimization
21476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
2152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
21725322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
21825322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
219361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev,
220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
2213156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
224361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_VIRTUAL;
225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
226361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if (LIKELY(list && list->numHwLayers > 1) &&
227361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].isActive &&
228361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].connected) {
229361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
230eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
231361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        uint32_t last = list->numHwLayers - 1;
232361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
233361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!ctx->dpyAttr[dpy].isPause) {
234361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(fbLayer->handle) {
235361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->dpyAttr[dpy].isConfiguring = false;
236361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                setListStats(ctx, list, dpy);
237361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
238361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    const int fbZ = 0;
239361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
240361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                }
241361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
242361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                if(ctx->listStats[dpy].isDisplayAnimating) {
243361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    // Mark all app layers as HWC_OVERLAY for virtual during
244361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    // animation, so that SF doesnt draw it on FB
245361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
246361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                        hwc_layer_1_t *layer = &list->hwLayers[i];
247361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                        layer->compositionType = HWC_OVERLAY;
248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    }
249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                }
250361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
251361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        } else {
252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Virtual Display is in Pause state.
253361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // ToDo:
254361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Mark all application layers as OVERLAY so that
255361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // GPU will not compose. This is done for power
256361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // optimization
257361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
258361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
259361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return 0;
260361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
261361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
262361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
263660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
264660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
2662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
267befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
2687351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
2691a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
2709f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed    reset(ctx, numDisplays, displays);
271bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
27247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
273327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
27476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
27576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
27611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
277bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
27890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (int32_t i = numDisplays; i >= 0; i--) {
27916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
280bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
281361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
28216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
28316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
28416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
28516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
286361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
287361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
28890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
289361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_virtual(dev, list);
29016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
29116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
29216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
293befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
294befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
29547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
296640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
297327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
29876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
299327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
3002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
301befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
302befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
303660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
30455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
3051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3063156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
3081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
3101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
3124267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
31355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
31410d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
31555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
316dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
31755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
318dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
319f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
320a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
321a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
3221a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
323a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
324a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // will be used in hwc_video::configure to disable
325a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // rotation animation on external display
326a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
327a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
328a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
329f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
3301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
3321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
3341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
336660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
337660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
33804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3391ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
340c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
3411a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
342361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
343bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
344bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    /* In case of non-hybrid WFD session, we are fooling SF by
345bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * piggybacking on HDMI display ID for virtual.
346bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * TODO: Not needed once we have WFD client working on top
347bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * of Google API's.
348bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     */
349bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    dpy = getDpyforExternalDisplay(ctx,dpy);
350bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
351f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
35255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
353905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
354905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
355905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
356905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
357905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
358905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
359905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
36076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        overlay::Writeback::clear();
361905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
3622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
363361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK;
365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Failed to handle blank event(%d) for Primary!!",
367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                  __FUNCTION__, blank );
368361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return -1;
369361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
370361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
371361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!blank) {
372361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Enable HPD here, as during bootup unblank is called
373361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
374361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
375361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
376361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
377bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
378bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
379bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        if(ctx->mVirtualonExtActive) {
380bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            /* if mVirtualonExtActive is true, display hal will
381bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * receive unblank calls for non-hybrid WFD solution
382bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * since we piggyback on HDMI.
383bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * TODO: Not needed once we have WFD client working on top
384bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             of Google API's */
385bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            break;
386bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        }
387bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    case HWC_DISPLAY_VIRTUAL:
388bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        /* There are two ways to reach this block of code.
389bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
390bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL
391bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and ctx->mVirtualonExtActive is true. In this case, non-hybrid
392bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD is active. If so, getDpyforExternalDisplay will return dpy
393bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         as HWC_DISPLAY_VIRTUAL.
394bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
395bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_PRIMARY
396bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and since SF is not aware of VIRTUAL DISPLAY being handle by HWC,
397bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         it wont send blank / unblank events for it. We piggyback on
398bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         PRIMARY DISPLAY events to release mdp pipes and
399bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         activate/deactivate VIRTUAL DISPLAY.
400bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
401bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * TODO: This separate case statement is not needed once we have
402bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD client working on top of Google API's.
403bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
404bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         */
405361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
406361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
407bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) {
4088f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                int dpy = HWC_DISPLAY_VIRTUAL;
4098f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4108f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ALOGE("%s: display commit fail for virtual!", __FUNCTION__);
4118f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
4128f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
4138f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
414361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
415361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
416361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
417361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
418361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(blank) {
4198f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4208f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ALOGE("%s: display commit fail for external!", __FUNCTION__);
4218f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
4228f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
423361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
424bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
425361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
426361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
427361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
428660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
42955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
430f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
431361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran          blank ? "blanking":"unblanking", dpy);
4328f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
433660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
434660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
435660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
4361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
4371589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
4381589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
4392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
4401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
4421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
4431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
4441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
4451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
4462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
44776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        if(ctx->mMDP.hasOverlay)
44876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            supported |= HWC_DISPLAY_EXTERNAL_BIT;
4492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
4502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
4511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
4521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
4531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
4551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4571589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
458c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
46004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4613475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
462640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
463e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
46476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
46576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4664019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
46704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
4684019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
46904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
470e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
471e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
472f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
473c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
474c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
475c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
476c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
478327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
47916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
48016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
481c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
482c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed        ctx->mVPUClient->draw(ctx, list);
483c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
48416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
4852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
4862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
48754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
48804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        if(copybitDone) {
48904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
49004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
49154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
49254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
49354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
49454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
49554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
49616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
4972a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
498c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
499bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd,
500bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                            ctx->listStats[dpy].roi)) {
5018f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
50250c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
5032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
505a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
506a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5073475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
511361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
51204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
51304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
5143475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
51576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
516361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
517361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
518361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
519e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
5204d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
5214d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
5224d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        uint32_t last = list->numHwLayers - 1;
5234d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5244d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
5254d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
5264d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
5274d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
52876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5294d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
5304d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
53176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5324d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
5334d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
5344d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
535eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
5364d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
5374d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
5384d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
5394d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
54004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
5414d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
5424d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
5434d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5444d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
5454d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
5464d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
5474d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
5484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
5494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
5504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
5514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
5534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
5544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
5554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
5563475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
5573475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
558c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5598f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
5608f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
56154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
5622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
564a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
565a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5663475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
569361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_set_virtual(hwc_context_t *ctx,
570361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
571361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{
572361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    ATRACE_CALL();
573361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0;
5749730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi
575361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_VIRTUAL;
576361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5779730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi
578361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
5799730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ctx->dpyAttr[dpy].connected &&
5809730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            !ctx->dpyAttr[dpy].isPause) {
5819730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        uint32_t last = list->numHwLayers - 1;
5829730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5839730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        int fd = -1; //FenceFD from the Copybit(valid in async mode)
5849730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        bool copybitDone = false;
5859730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(ctx->mCopyBit[dpy])
5869730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
587361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5889730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(list->numHwLayers > 1)
5899730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hwc_sync(ctx, list, dpy, fd);
590361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
591361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Dump the layers for virtual
592361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(ctx->mHwcDebug[dpy])
593361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mHwcDebug[dpy]->dumpLayers(list);
594361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5959730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
5969730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
5979730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ret = -1;
5989730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        }
599361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6009730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        int extOnlyLayerIndex =
6019730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ctx->listStats[dpy].extOnlyLayerIndex;
602361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6039730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
6049730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(extOnlyLayerIndex!= -1) {
6059730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
6069730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hnd = (private_handle_t *)extLayer->handle;
6079730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        } else if(copybitDone) {
6089730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
6099730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        }
610361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6119730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(hnd && !isYuvBuffer(hnd)) {
6129730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
6139730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
6149730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi                ret = -1;
615361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
616361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
617361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
6188f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
6198f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
620361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ret = -1;
621361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
622361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
623361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
624361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    closeAcquireFds(list);
625361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
626bf5438200b5c0cf81cb008481e951760df83b161Dileep Kumar Reddi    if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) {
627361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // SF assumes HWC waits for the acquire fence and returns a new fence
628361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // that signals when we're done. Since we don't wait, and also don't
629361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // touch the buffer, we can just handle the acquire fence back to SF
630361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // as the retire fence.
631361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        list->retireFenceFd = list->outbufAcquireFenceFd;
632361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
633361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
634361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return ret;
635361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
636361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
637361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
638660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
639660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
640660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
641befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
642befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
643befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
64490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (uint32_t i = 0; i <= numDisplays; i++) {
645660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
646bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
6482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
6492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
65076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
652361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
653361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
65490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
655361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_virtual(ctx, list);
65676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
6582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
659660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
6602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
66195eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
66295eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
66395eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
66433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
66556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
6667351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
6671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
6682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
6692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
670ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
6712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
6722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
6732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
67476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
675bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
68076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
68176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
68276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
68376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
68476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
6862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
6870df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
68876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
6890df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
69076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
69176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
69276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
69376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
69476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
69576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
6962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
697660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
698befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
699befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
700befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
7032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
705bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7060df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
707361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
70876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
70976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
71076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
7222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
7232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
7252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
7262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
7272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
7282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
73176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
73276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
73676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
7382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
74079e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
74379e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
7442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
7462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
7492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
7502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
7512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
7522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
7532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
75493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
75593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
75693138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7571a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
758a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
759a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
760a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
761a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
7620df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
763f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
764f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
766a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
767a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
768a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
769327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
7704762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
771327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
772a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
77393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
77493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
775befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
776befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
777befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
7781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
779befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
780befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
781befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
782befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
783befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
784befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
785befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
786befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
787befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
788befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
789befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
790befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
791befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
792befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
793befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
794befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
795befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
7961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
7971589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
798befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
7991589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8001589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
8012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
80212a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_2;
8032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
8042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
8052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
8062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
8072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
8082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
8092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
8102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
81193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
8122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
8132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
8142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
815befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
816befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
817befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
818befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
819