hwc.cpp revision 905c994790c2e9ce6aa585cd9d70178db4391cce
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 */
2004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed#define ATRACE_TAG ATRACE_TAG_GRAPHICS
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>
31b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h>
32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h"
33ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed#include "hwc_video.h"
3447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h"
3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h"
36bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
374019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h"
38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
4047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0
41befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
67660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
708eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
74befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
76359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
77359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
78aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
79aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
80359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
81aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
8425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
859f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
869f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                  hwc_display_contents_1_t** displays) {
872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    memset(ctx->listStats, 0, sizeof(ctx->listStats));
8890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < MAX_DISPLAYS; i++) {
899f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
909f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
919f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // value is reset on every prepare. However, for the layer
929f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // cache we need to reset it.
939f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // We can probably rethink that later on
949f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        if (LIKELY(list && list->numHwLayers > 1)) {
959f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
969f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
979f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
989f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
999f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
100640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
101640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
102640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
103327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if(ctx->mVidOv[i])
104327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ctx->mVidOv[i]->reset();
1054019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
1064019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
1072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
11016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame
11154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) {
11216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(ctx->layerProp[dpy]) {
11316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       delete[] ctx->layerProp[dpy];
11416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       ctx->layerProp[dpy] = NULL;
11516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
11654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    ctx->layerProp[dpy] = new LayerProp[numAppLayers];
11716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
11816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
119c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaranstatic int display_commit(hwc_context_t *ctx, int dpy) {
120c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    struct mdp_display_commit commit_info;
121c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    memset(&commit_info, 0, sizeof(struct mdp_display_commit));
122c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
123c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) {
124c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran       ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__);
125c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran       return -errno;
126c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    }
127c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    return 0;
128c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran}
129c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
1302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
133640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
13454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
13554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
13654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
137074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
1386e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
1396e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        if(fbLayer->handle) {
14054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if(list->numHwLayers > MAX_NUM_LAYERS) {
14154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ctx->mFBUpdate[dpy]->prepare(ctx, list);
14254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                return 0;
14354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            }
144640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            setListStats(ctx, list, dpy);
14554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            bool ret = ctx->mMDPComp->prepare(ctx, list);
1464019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            if(!ret) {
1474019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R                // IF MDPcomp fails use this route
148327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ctx->mVidOv[dpy]->prepare(ctx, list);
14904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed                ctx->mFBUpdate[dpy]->prepare(ctx, list);
15054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                // Use Copybit, when MDP comp fails
15154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                if(ctx->mCopyBit[dpy])
15254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
15354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ctx->mLayerCache[dpy]->updateLayerCache(list);
15416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
1552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
1562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
1582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
16190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        hwc_display_contents_1_t *list, int dpy) {
1622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
16376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
16454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
16554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
16654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
16754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
16876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
16954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
17090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
17190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            if(fbLayer->handle) {
17254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ctx->mExtDispConfiguring = false;
17354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                if(list->numHwLayers > MAX_NUM_LAYERS) {
17454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                    ctx->mFBUpdate[dpy]->prepare(ctx, list);
17554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                    return 0;
17654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                }
17790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                setListStats(ctx, list, dpy);
178327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ctx->mVidOv[dpy]->prepare(ctx, list);
17904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed                ctx->mFBUpdate[dpy]->prepare(ctx, list);
18090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                ctx->mLayerCache[dpy]->updateLayerCache(list);
18190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                if(ctx->mCopyBit[dpy])
18290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
18390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            }
18490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
18590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // External Display is in Pause state.
18690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // ToDo:
18790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // Mark all application layers as OVERLAY so that
18890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // GPU will not compose. This is done for power
18990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // optimization
19076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
1912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
19325322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
19425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
195660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
196660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
197befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
1982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
199befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
20047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
2019f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed    reset(ctx, numDisplays, displays);
202bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
20347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
204327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
205f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran    ctx->mNeedsRotator = false;
206bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (int32_t i = numDisplays; i >= 0; i--) {
20816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
20916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        switch(i) {
21016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
21116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
21216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
21316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
21490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
21590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                ret = hwc_prepare_external(dev, list, i);
21616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
21716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
21816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
219befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
220befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
22147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
222640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
223327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
224327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
2252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
226befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
227befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
228660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
22955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
2301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
2311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
2321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
233dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev    pthread_mutex_lock(&ctx->vstate.lock);
2341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
2351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
23655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
2374267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
23855290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
23955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if(ret == 0) {
24055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
24155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                pthread_cond_signal(&ctx->vstate.cond);
24255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            }
243dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
24455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
245dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
2461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
2471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
2481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
249dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev    pthread_mutex_unlock(&ctx->vstate.lock);
2501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
2511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
2521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
253660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
254660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
25504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
2561ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
257c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
25847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
2592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
26055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed    ALOGD("%s: %s display: %d", __FUNCTION__,
26155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
262905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
263905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
264905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
265905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
266905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
267905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
268905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
269905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
2702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
2712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
2722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(blank) {
273c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_POWERDOWN);
2743fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan
2753fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
2763fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    // Surfaceflinger does not send Blank/unblank event to hwc
2773fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    // for virtual display, handle it explicitly when blank for
2783fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    // primary is invoked, so that any pipes unset get committed
279c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                    if (display_commit(ctx, HWC_DISPLAY_VIRTUAL) < 0) {
2803fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                        ret = -1;
2813fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                        ALOGE("%s:post failed for virtual display !!",
2823fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                                                            __FUNCTION__);
2833fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    } else {
2843fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                        ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
2853fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    }
2863fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                }
2872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            } else {
288c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, FB_BLANK_UNBLANK);
2893fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
2903fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
2913fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                }
2922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            }
2932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
2942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(blank) {
296c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                // call external framebuffer commit on blank,
297c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                // so that any pipe unsets gets committed
298c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                if (display_commit(ctx, dpy) < 0) {
2993ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R                    ret = -1;
300c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                    ALOGE("%s:post failed for external display !! ", __FUNCTION__);
3013ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R                }
3022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            } else {
3032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            }
3042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
3062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
3072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
30871005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R    // Enable HPD here, as during bootup unblank is called
30971005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R    // when SF is completely initialized
31071005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R    ctx->mExtDisplay->setHPD(1);
31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed    if(ret == 0){
31255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed        ctx->dpyAttr[dpy].isActive = !blank;
31355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed    } else {
31455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed        ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__,
31555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed              blank==1 ? "blanking":"unblanking", dpy, strerror(errno));
3162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        return ret;
317660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
31855290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
31955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed    ALOGD("%s: Done %s display: %d", __FUNCTION__,
32055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "blanking":"unblanking", dpy);
321660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    return 0;
322660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
323660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
324660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
3251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
3261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
3291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
3321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
3331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
3341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
3352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
33676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        if(ctx->mMDP.hasOverlay)
33776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            supported |= HWC_DISPLAY_EXTERNAL_BIT;
3382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
3392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
3401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
3411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
3421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
3441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
347c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
3482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
34904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3503475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
351640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
352e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
35376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
35476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
3554019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
35604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
3574019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
35804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
359e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
360e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
361327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ctx->mVidOv[dpy]->draw(ctx, list)) {
362327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: VideoOverlay draw failed", __FUNCTION__);
3633475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            ret = -1;
3643475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
365c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah        if (!ctx->mMDPComp->draw(ctx, list)) {
366327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
36716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
36816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
36916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
3702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
3712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
37254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
37304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        if(copybitDone) {
37404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
37504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
37654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
37754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
37854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
37954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
38054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
38116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
3822a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
383c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
384c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran        if (display_commit(ctx, dpy) < 0) {
385c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran            ALOGE("%s: display commit fail!", __FUNCTION__);
386c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran            return -1;
3872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
3882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
389a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
390a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
3913475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
3922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
3932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
3942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
39504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed                            hwc_display_contents_1_t* list, int dpy)
39604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
39704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3983475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
399f6205c18f4bbd23e7f39672f781498c34e6b7494Kinjal Bhavsar    Locker::Autolock _l(ctx->mExtSetLock);
40076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
401e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
40290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause &&
403640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ctx->dpyAttr[dpy].connected) {
4042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
40576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4064019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
40704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
4084019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
40904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
41076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
411e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
412e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
41376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
414327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        if (!ctx->mVidOv[dpy]->draw(ctx, list)) {
4153475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            ALOGE("%s: VideoOverlay::draw fail!", __FUNCTION__);
4163475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            ret = -1;
4173475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
41876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
41954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
42004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        if(copybitDone) {
42104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
42204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
42304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
42454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
42504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
42647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
4273475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah                ret = -1;
4283475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
4293475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
430c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
431c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran        if (display_commit(ctx, dpy) < 0) {
432c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran            ALOGE("%s: display commit fail!", __FUNCTION__);
43354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
4342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
4352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
436a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
437a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
4383475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
4392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
4402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
441660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
442660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
443660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
444befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
445befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
446befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
44777d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
44890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (uint32_t i = 0; i <= numDisplays; i++) {
449660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
4502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch(i) {
4512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
4522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
45376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
4542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
45590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
45690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            /* ToDo: We are using hwc_set_external path for both External and
45790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                     Virtual displays on HWC1.1. Eventually, we will have
45890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                     separate functions when we move to HWC1.2
45990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            */
46090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                ret = hwc_set_external(ctx, list, i);
46176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
4622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
4632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
464660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
4652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
4662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
4672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
468ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
4692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
4712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
47276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
4732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
4742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
4752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
4762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
47776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
47876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
47976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
48076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
48176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
4822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
4832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
48476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
48576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) {
48676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
48776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
48876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
48976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
49076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
49176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
4922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
493660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
494befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
495befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
496befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
4972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
4982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
4992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
50176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    //If hotpluggable displays are inactive return error
50276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) {
50376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
50476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
50576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
5072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
5092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
5102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
5112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
5122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
5132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
5142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
5152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
5172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
5182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
5202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
5212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
5222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
5232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
5252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
52676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
52776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
5282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
5302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
53176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
53276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
5332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
53579e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
5362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
53879e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
5392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
5412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
5422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
5432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
5442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
5462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
5472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
54993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
55093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
55193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
552a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
553a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
554a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
555a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
556a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mMDPComp->dump(aBuf);
557a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
558a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
559a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
560327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
561327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 2048);
562327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
563a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
56493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
56593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
566befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
567befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
568befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
5691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
570befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
571befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
572befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
573befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
574befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
575befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
576befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
577befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
578befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
579befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
580befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
581befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
582befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
583befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
584befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
585befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
586befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
5871589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5881589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
589befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
5901589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5911589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
5922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
5932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_1;
5942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
5952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
5962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
5972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
5982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
5992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
6002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
6012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
60293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
6032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
6042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
6052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
606befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
607befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
608befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
609befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
610