hwc.cpp revision f1e233034ba5bc96e32861fa98a5504aad06415b
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"
3347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h"
3416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h"
35c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan#include "hwc_dump_layers.h"
36bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
374019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h"
3895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed#include "profiler.h"
39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
4111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
4211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
4347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0
442a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1
45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
71660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
748eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
77befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
78befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
79befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
80359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
81359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
82aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
83aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
84359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
85aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
8825322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
899f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
909f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                  hwc_display_contents_1_t** displays) {
912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    memset(ctx->listStats, 0, sizeof(ctx->listStats));
9290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < MAX_DISPLAYS; i++) {
939f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
949f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
959f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // value is reset on every prepare. However, for the layer
969f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // cache we need to reset it.
979f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // We can probably rethink that later on
989f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        if (LIKELY(list && list->numHwLayers > 1)) {
999f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
1009f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
1019f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
1029f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1039f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
104640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
105640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
106640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
1074019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
1084019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
1092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
11216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame
11354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) {
11416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(ctx->layerProp[dpy]) {
11516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       delete[] ctx->layerProp[dpy];
11616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       ctx->layerProp[dpy] = NULL;
11716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
11854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    ctx->layerProp[dpy] = new LayerProp[numAppLayers];
11916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
12016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
121c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaranstatic int display_commit(hwc_context_t *ctx, int dpy) {
122c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    struct mdp_display_commit commit_info;
123c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    memset(&commit_info, 0, sizeof(struct mdp_display_commit));
124c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
125c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) {
126c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran       ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__);
127c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran       return -errno;
128c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    }
129c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran    return 0;
130c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran}
131c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
1322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
135640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
13654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
13754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
13854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
139074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
1406e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
1416e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        if(fbLayer->handle) {
142640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            setListStats(ctx, list, dpy);
143f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list);
144f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            if(fbZOrder >= 0)
145f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder);
146f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
1479ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            if (ctx->mMDP.version < qdutils::MDP_V4_0) {
1489ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson                if((fbZOrder >= 0) && ctx->mCopyBit[dpy])
1499ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
1509ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            }
1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
1522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
1542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
15790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        hwc_display_contents_1_t *list, int dpy) {
1586e5f4943b740677ec2f124fda808f6fb2d715cdeRaj kamal
1592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
1606e5f4943b740677ec2f124fda808f6fb2d715cdeRaj kamal    Locker::Autolock _l(ctx->mExtLock);
16176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
16254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
16354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
16454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
16554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
16676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
16754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
16890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
16990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            if(fbLayer->handle) {
17054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ctx->mExtDispConfiguring = false;
17190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                setListStats(ctx, list, dpy);
172f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list);
173a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                if(ctx->deviceOrientation &&
174a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    ctx->listStats[dpy].isDisplayAnimating) {
175a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    fbZOrder = 0;
176a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                }
177f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                if(fbZOrder >= 0)
178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder);
179f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
180f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                /* Temporarily commenting out C2D until we support partial
181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                   copybit composition for mixed mode MDP
182f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                if((fbZOrder >= 0) && ctx->mCopyBit[dpy])
18490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                */
186a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                if(ctx->listStats[dpy].isDisplayAnimating) {
187a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    // Mark all app layers as HWC_OVERLAY for external during
188a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    // animation, so that SF doesnt draw it on FB
189a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
190a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                        hwc_layer_1_t *layer = &list->hwLayers[i];
191a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                        layer->compositionType = HWC_OVERLAY;
192a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    }
193a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                }
19490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            }
19590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
19690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // External Display is in Pause state.
19790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // ToDo:
19890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // Mark all application layers as OVERLAY so that
19990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // GPU will not compose. This is done for power
20090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // optimization
20176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
2022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
20425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
20525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
206660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
207660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
208befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
2092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
210befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
21147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
2129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed    reset(ctx, numDisplays, displays);
213bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
21447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
215327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
21611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
217bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
21890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (int32_t i = numDisplays; i >= 0; i--) {
21916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
22016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        switch(i) {
22116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
22216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
22316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
22416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
22590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
22690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                ret = hwc_prepare_external(dev, list, i);
22716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
22816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
22916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
230befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
231befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
23247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
233640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
234327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
235327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
2362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
237befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
238befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
239660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
24055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
2411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
2421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
2431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
24410d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
2451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
2461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
24755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
2484267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
24955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
25010d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
25155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
252dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
25355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
254dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
255f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
256a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
257a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
258a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
259a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // will be used in hwc_video::configure to disable
260a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // rotation animation on external display
261a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
262a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
263a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
264f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
2651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
2661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
2671589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
2681589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
2691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
2701589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
271660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
272660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
27304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
2741ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
275c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
27647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
2772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
278f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
27955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
280905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
281905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
282905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
283905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
284905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
285905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
286905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
287905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
2882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
2892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
2902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(blank) {
291c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_POWERDOWN);
2923fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan
2933fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
2943fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    // Surfaceflinger does not send Blank/unblank event to hwc
2953fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    // for virtual display, handle it explicitly when blank for
2963fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    // primary is invoked, so that any pipes unset get committed
297c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                    if (display_commit(ctx, HWC_DISPLAY_VIRTUAL) < 0) {
2983fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                        ret = -1;
2993fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                        ALOGE("%s:post failed for virtual display !!",
3003fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                                                            __FUNCTION__);
3013fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    } else {
3023fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                        ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
3033fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    }
3043fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                }
3052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            } else {
306c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, FB_BLANK_UNBLANK);
3073fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) {
3083fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                    ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
3093fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan                }
3102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            }
3112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
3132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(blank) {
314c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                // call external framebuffer commit on blank,
315c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                // so that any pipe unsets gets committed
316c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran                if (display_commit(ctx, dpy) < 0) {
3173ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R                    ret = -1;
318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                    ALOGE("%s:post failed for external display !! ",
319f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran                          __FUNCTION__);
3203ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R                }
3212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            } else {
3222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            }
3232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
3252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
3262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
32771005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R    // Enable HPD here, as during bootup unblank is called
32871005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R    // when SF is completely initialized
32971005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R    ctx->mExtDisplay->setHPD(1);
33055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed    if(ret == 0){
33155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed        ctx->dpyAttr[dpy].isActive = !blank;
33255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed    } else {
33355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed        ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__,
33455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed              blank==1 ? "blanking":"unblanking", dpy, strerror(errno));
3352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        return ret;
336660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
33755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
338f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
33955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "blanking":"unblanking", dpy);
340660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    return 0;
341660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
342660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
343660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
3441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
3451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
3481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
3501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
3511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
3521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
3531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
3542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
35576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        if(ctx->mMDP.hasOverlay)
35676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            supported |= HWC_DISPLAY_EXTERNAL_BIT;
3572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
3582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
3591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
3601589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
3611589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
3631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3641589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
366c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
3672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
36804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3693475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
370640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
371e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
37276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
37376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
3744019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
37504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
3764019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
37704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
378e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
379e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
380f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
381c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
382c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
383c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
384c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
386327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
38716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
38816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
38916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
3902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
3912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
39254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
39304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        if(copybitDone) {
39404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
39504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
39654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
39754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
39854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
39954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
40054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
40116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
4022a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
403c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
404c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran        if (display_commit(ctx, dpy) < 0) {
405c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran            ALOGE("%s: display commit fail!", __FUNCTION__);
40650c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
4072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
4082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
409a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
410a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
4113475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
4122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
4132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
4142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
41504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed                            hwc_display_contents_1_t* list, int dpy)
41604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
41704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4183475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
4196e5f4943b740677ec2f124fda808f6fb2d715cdeRaj kamal    Locker::Autolock _l(ctx->mExtLock);
42076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
421e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
42290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause &&
423640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ctx->dpyAttr[dpy].connected) {
4242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
42576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4264019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
42704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
4284019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
42904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
43076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
431e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
432e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
43376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
434c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for external
435c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
436c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
437c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
438f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
4403475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            ret = -1;
4413475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
44276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
443eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R        int extOnlyLayerIndex =
444eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R            ctx->listStats[dpy].extOnlyLayerIndex;
445eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
44654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
447eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R        if(extOnlyLayerIndex!= -1) {
448eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
449eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R            hnd = (private_handle_t *)extLayer->handle;
450eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R        } else if(copybitDone) {
45104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
45204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
45304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
454eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R        if(hnd && !isYuvBuffer(hnd)) {
45504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
45647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
4573475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah                ret = -1;
4583475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
4593475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
460c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
461c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran        if (display_commit(ctx, dpy) < 0) {
462c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran            ALOGE("%s: display commit fail!", __FUNCTION__);
46354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
4642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
4652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
466a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
467a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
4683475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
4692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
471660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
472660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
473660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
474befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
475befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
476befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
47777d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed    Locker::Autolock _l(ctx->mBlankLock);
47890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (uint32_t i = 0; i <= numDisplays; i++) {
479660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
4802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch(i) {
4812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
4822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
48376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
4842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
48590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
48690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            /* ToDo: We are using hwc_set_external path for both External and
48790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                     Virtual displays on HWC1.1. Eventually, we will have
48890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                     separate functions when we move to HWC1.2
48990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            */
49090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                ret = hwc_set_external(ctx, list, i);
49176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
4922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
4932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
494660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
4952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
49695eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
49795eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
49895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
49933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
5002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
5012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
502ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
5032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
5042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
5052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
50676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
5072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
5092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
5102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
51176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
51276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
51376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
51476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
51576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
5162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
51876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
51976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) {
52076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
52176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
52276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
52376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
52476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
52576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
5262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
527660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
528befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
529befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
530befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
5312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
5322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
5332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
53576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    //If hotpluggable displays are inactive return error
53676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) {
53776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
53876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
53976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
5412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
5422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
5432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
5442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
5452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
5462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
5472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
5482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
5492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
5512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
5522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
5542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
5552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
5562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
5572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
5592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
56076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
56176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
5622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
5642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
56576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
56676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
5672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
56979e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
5702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
57279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
5732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
5742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
5752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
5762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
5772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
5782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
5802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
5812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
58393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
58493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
58593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
586a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
587a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
588a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
589a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    for(int dpy = 0; dpy < MAX_DISPLAYS; dpy++) {
591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
594a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
595a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
596a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
597327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
5984762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
599327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
600a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
60193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
60293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
603befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
604befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
605befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
6061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
607befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
608befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
609befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
610befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
611befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
612befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
613befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
614befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
615befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
616befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
617befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
618befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
619befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
620befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
621befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
622befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
623befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
6241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
6251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
626befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
6271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
6281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
6292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
6302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_1;
6312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
6362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
63993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
6412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
6422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
643befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
644befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
645befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
646befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
647