hwc.cpp revision c439b604bcd6441e3706fdcaa5084ec58cbaf16d
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
33ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
54019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained
64019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * for attribution purposes only.
74019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R *
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License.
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License.
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
203156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h>
22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h>
23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h>
25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/atomic.h>
261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <EGL/egl.h>
2704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed#include <utils/Trace.h>
28c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran#include <sys/ioctl.h>
291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <overlay.h>
30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h>
3176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include <overlayWriteback.h>
32b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h>
33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h"
3447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h"
3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h"
36c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan#include "hwc_dump_layers.h"
37bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
384019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h"
39f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h"
4095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed#include "profiler.h"
41c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#include "hwc_vpuclient.h"
42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
4411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
4511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0
472a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
71361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran/* In case of proprietary WFD session, we are fooling SF by piggybacking on
72361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their
73361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL.
74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */
75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int getHWCDpy(hwc_context_t *ctx, int dpy) {
77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive)
78361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_VIRTUAL;
79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return dpy;
80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
85660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
888eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
94359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
95359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
96aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
97aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
98359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
100befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
10225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
1039f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
1049f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                  hwc_display_contents_1_t** displays) {
1050df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
1079f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
1089f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // value is reset on every prepare. However, for the layer
1099f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // cache we need to reset it.
1109f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // We can probably rethink that later on
1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        if (LIKELY(list && list->numHwLayers > 1)) {
1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1169f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
117640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
118640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
119640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
1204019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
1214019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
122bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar        if(ctx->mLayerRotMap[i])
123bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar            ctx->mLayerRotMap[i]->reset();
1242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
125f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
126f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    ctx->mAD->reset();
1278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    MDPComp::reset();
1282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
13016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame
13154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) {
13216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    if(ctx->layerProp[dpy]) {
13316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       delete[] ctx->layerProp[dpy];
13416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed       ctx->layerProp[dpy] = NULL;
13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed    }
13654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    ctx->layerProp[dpy] = new LayerProp[numAppLayers];
13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
13816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
139eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shahstatic void handleGeomChange(hwc_context_t *ctx, int dpy,
140eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        hwc_display_contents_1_t *list) {
141eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah    if(list->flags & HWC_GEOMETRY_CHANGED) {
142eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        ctx->mOverlay->forceSet(dpy);
143eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah    }
144eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah}
145eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah
1462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1483156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
150640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
15154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
15254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
15354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
154eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
155074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
1566e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
1576e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah        if(fbLayer->handle) {
158640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            setListStats(ctx, list, dpy);
159c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
160c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed            ctx->mVPUClient->prepare(ctx, list);
161c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                const int fbZ = 0;
164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah            }
1669ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            if (ctx->mMDP.version < qdutils::MDP_V4_0) {
167699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                if(ctx->mCopyBit[dpy])
1689ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
1699ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson            }
1702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
1712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
1732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
176361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
1773156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
179361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
18076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
18154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
18254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
18354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
185eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
18676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
18754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
18890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
18990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            if(fbLayer->handle) {
190361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->dpyAttr[dpy].isConfiguring = false;
19190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                setListStats(ctx, list, dpy);
192699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
193699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    const int fbZ = 0;
194699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
195699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah                }
196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
197a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                if(ctx->listStats[dpy].isDisplayAnimating) {
198a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    // Mark all app layers as HWC_OVERLAY for external during
199a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    // animation, so that SF doesnt draw it on FB
200a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
201a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                        hwc_layer_1_t *layer = &list->hwLayers[i];
202a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                        layer->compositionType = HWC_OVERLAY;
203a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                    }
204a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                }
20590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            }
20690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // External Display is in Pause state.
20890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // ToDo:
20990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // Mark all application layers as OVERLAY so that
21090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // GPU will not compose. This is done for power
21190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            // optimization
21276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
2132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
21525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
21625322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev,
218361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
2193156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
221361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_VIRTUAL;
223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
224361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if (LIKELY(list && list->numHwLayers > 1) &&
225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].isActive &&
226361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].connected) {
227361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
228eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah        handleGeomChange(ctx, dpy, list);
229361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        uint32_t last = list->numHwLayers - 1;
230361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
231361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!ctx->dpyAttr[dpy].isPause) {
232361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(fbLayer->handle) {
233361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->dpyAttr[dpy].isConfiguring = false;
234361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                setListStats(ctx, list, dpy);
235361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
236361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    const int fbZ = 0;
237361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
238361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                }
239361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
240361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                if(ctx->listStats[dpy].isDisplayAnimating) {
241361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    // Mark all app layers as HWC_OVERLAY for virtual during
242361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    // animation, so that SF doesnt draw it on FB
243361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) {
244361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                        hwc_layer_1_t *layer = &list->hwLayers[i];
245361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                        layer->compositionType = HWC_OVERLAY;
246361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    }
247361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                }
248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        } else {
250361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Virtual Display is in Pause state.
251361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // ToDo:
252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Mark all application layers as OVERLAY so that
253361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // GPU will not compose. This is done for power
254361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // optimization
255361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
256361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
257361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return 0;
258361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
259361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
260361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
261660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
262660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
263befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
2642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
2667351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
2671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
2689f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed    reset(ctx, numDisplays, displays);
269bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
27047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
271327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
27276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
27376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
27411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah    Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
275bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
27690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (int32_t i = numDisplays; i >= 0; i--) {
27716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
278361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        int dpy = getHWCDpy(ctx, i);
279361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
28016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
28116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
28216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
28316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
284361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
285361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
28690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
287361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_virtual(dev, list);
28816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
28916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
29016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
291befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
292befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
29347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
294640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
295327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
29676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
297327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
299befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
300befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
301660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
30255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
3031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3043156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
3061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
3081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
30955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
3104267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
31210d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
31355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
314dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
31555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
316dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
317f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
318a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
319a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
3201a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
321a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
322a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // will be used in hwc_video::configure to disable
323a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // rotation animation on external display
324a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
325a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
326a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
327f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
3281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
3291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
3301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
3321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
334660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
335660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
33604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3371ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
338c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
3391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
340361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
341f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
34255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
343905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
344905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
345905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
346905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
347905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
348905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
349905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
35076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        overlay::Writeback::clear();
351905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
3522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
353361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
354361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK;
355361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
356361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Failed to handle blank event(%d) for Primary!!",
357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                  __FUNCTION__, blank );
358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return -1;
359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
360361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!blank) {
362361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Enable HPD here, as during bootup unblank is called
363361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        /* Since SF is not aware of VIRTUAL DISPLAY being handle by HWC,
368361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran         * it wont send blank / unblank events for it. We piggyback on
369361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran         * PRIMARY DISPLAY events to release mdp pips and
370361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran         * activate/deactive VIRTUAL DISPLAY */
371361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
372361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
3738f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(blank) {
3748f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                int dpy = HWC_DISPLAY_VIRTUAL;
3758f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
3768f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ALOGE("%s: display commit fail for virtual!", __FUNCTION__);
3778f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
3788f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
3798f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
380361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
381361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
382361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
383361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
384361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(blank) {
3858f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
3868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ALOGE("%s: display commit fail for external!", __FUNCTION__);
3878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
3888f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
389361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
390361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
391361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
392361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
393660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
39455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
395361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    ctx->dpyAttr[dpy].isActive = !blank;
396361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
397f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran          blank ? "blanking":"unblanking", dpy);
3998f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
400660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
401660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
402660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
4031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
4041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
4051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
4062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
4071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
4091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
4101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
4132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
41476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        if(ctx->mMDP.hasOverlay)
41576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            supported |= HWC_DISPLAY_EXTERNAL_BIT;
4162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
4172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
4181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
4191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
4201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4211589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
4221589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
425c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
42704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4283475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
429640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
430e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
43176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
43276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4334019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
43404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
4354019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
43604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
437e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
438e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
440c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
441c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
442c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
443c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
445327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
44616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
44716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
448c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
449c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed        ctx->mVPUClient->draw(ctx, list);
450c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
45116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
4522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
4532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
45454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
45504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        if(copybitDone) {
45604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
45704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
45854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
45954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
46054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
46154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
46254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
46316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
4642a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
465c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4668f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4678f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
46850c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
4692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
471a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
472a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
4733475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
4742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
4752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
4762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
477361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
47804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
47904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4803475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
48176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
482361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
483361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
484361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
485e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
4864d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
4874d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
4884d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        uint32_t last = list->numHwLayers - 1;
4894d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4904d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
4914d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
4924d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
4934d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
49476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
4954d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
4964d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
49776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
4984d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
4994d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
5004d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
501eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
5024d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
5034d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
5044d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
5054d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
50604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
5074d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
5084d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
5094d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5104d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
5114d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
5124d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
5134d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
5144d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
5154d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
5164d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
5174d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5184d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
5194d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
5204d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
5214d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
5223475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
5233475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
524c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5258f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
5268f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
52754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
5282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
530a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
531a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5323475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
535361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_set_virtual(hwc_context_t *ctx,
536361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
537361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{
538361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    ATRACE_CALL();
539361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0;
5409730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi
541361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_VIRTUAL;
542361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5439730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi
544361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
5459730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ctx->dpyAttr[dpy].connected &&
5469730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            !ctx->dpyAttr[dpy].isPause) {
5479730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        uint32_t last = list->numHwLayers - 1;
5489730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5499730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        int fd = -1; //FenceFD from the Copybit(valid in async mode)
5509730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        bool copybitDone = false;
5519730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(ctx->mCopyBit[dpy])
5529730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
553361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5549730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(list->numHwLayers > 1)
5559730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hwc_sync(ctx, list, dpy, fd);
556361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
557361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Dump the layers for virtual
558361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(ctx->mHwcDebug[dpy])
559361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mHwcDebug[dpy]->dumpLayers(list);
560361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5619730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
5629730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
5639730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ret = -1;
5649730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        }
565361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5669730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        int extOnlyLayerIndex =
5679730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            ctx->listStats[dpy].extOnlyLayerIndex;
568361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5699730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
5709730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(extOnlyLayerIndex!= -1) {
5719730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
5729730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hnd = (private_handle_t *)extLayer->handle;
5739730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        } else if(copybitDone) {
5749730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
5759730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        }
576361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5779730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi        if(hnd && !isYuvBuffer(hnd)) {
5789730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
5799730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
5809730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi                ret = -1;
581361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
582361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
583361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
5848f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
5858f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
586361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ret = -1;
587361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
588361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
589361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
590361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    closeAcquireFds(list);
591361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
592bf5438200b5c0cf81cb008481e951760df83b161Dileep Kumar Reddi    if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) {
593361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // SF assumes HWC waits for the acquire fence and returns a new fence
594361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // that signals when we're done. Since we don't wait, and also don't
595361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // touch the buffer, we can just handle the acquire fence back to SF
596361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        // as the retire fence.
597361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        list->retireFenceFd = list->outbufAcquireFenceFd;
598361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    }
599361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
600361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return ret;
601361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
602361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
603361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
604660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
605660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
606660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
607befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
608befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
609befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
61090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    for (uint32_t i = 0; i <= numDisplays; i++) {
611660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
612361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        int dpy = getHWCDpy(ctx, i);
613361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
6142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
6152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
61676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
618361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
619361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
62090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
621361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_virtual(ctx, list);
62276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
6242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
625660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
6262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
62795eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
62895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
62995eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
63033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
63156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
6327351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
6331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
636ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
64076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
641361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    disp = getHWCDpy(ctx, disp);
6422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
6432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
6442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
6452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
64676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
64776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
64876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
64976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
65076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
6512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
6522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
6530df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
65476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
6550df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
65676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
65776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
65876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
65976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
66076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
66176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
6622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
663660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
664befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
665befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
666befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
6672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
6682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
6692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
671361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    disp = getHWCDpy(ctx, disp);
6720df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
673361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
67476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
67576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
67676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
6812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
6822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
6832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
6862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
6882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
6892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
6912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
6922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
6932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
6952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
6962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
69776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
69876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
70276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
70376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
70679e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
70979e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
72093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
72193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
72293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7231a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
724a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
725a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
726a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
727a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
7280df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
729f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
731f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
732a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
733a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
734a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
735327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
7364762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
737327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
738a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
73993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
74093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
741befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
7441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
745befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
746befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
747befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
748befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
749befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
750befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
751befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
752befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
753befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
754befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
755befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
756befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
757befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
758befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
759befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
760befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
7621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
7631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
764befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
7651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
7661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
76812a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_2;
7692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
77793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
781befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
782befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
783befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
784befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
785