hwc.cpp revision 1029ad2b12d5f30e77b2c2f85da891f2d1842424
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
3f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi * Copyright (C) 2012-2014, 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"
42140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_virtual.h"
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
4511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay;
4611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah
4747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0
482a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
5827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev);
5927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
74bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on
75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their
76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL.
77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */
78361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
79bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) {
80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive)
81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_VIRTUAL;
82361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return dpy;
83361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
84361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
88660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
918eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
97359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
98359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
100aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
101359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
102aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
10525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
1079f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                  hwc_display_contents_1_t** displays) {
1084c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal
1094c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal    ctx->numActiveDisplays = 0;
1100df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // value is reset on every prepare. However, for the layer
1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // cache we need to reset it.
1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        // We can probably rethink that later on
1164c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
1179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
1189f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
1199f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
1209f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1214c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal
1224c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal            /* For display devices like SSD and screenrecord, we cannot
1234c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * rely on isActive and connected attributes of dpyAttr to
1244c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * determine if the displaydevice is active. Hence in case if
1254c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * the layer-list is non-null and numHwLayers > 0, we assume
1264c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * the display device to be active.
1274c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             */
1284c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal            ctx->numActiveDisplays += 1;
1299f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
130640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
131640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
132640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
1334019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
1344019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
135bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar        if(ctx->mLayerRotMap[i])
136bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar            ctx->mLayerRotMap[i]->reset();
1374c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal
1382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
139f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
140f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    ctx->mAD->reset();
1418eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    MDPComp::reset();
142140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan    if(ctx->mHWCVirtual)
143140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        ctx->mHWCVirtual->destroy(ctx, numDisplays, displays);
14416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
14516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
146f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddibool isEqual(float f1, float f2) {
147f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        return ((int)(f1*100) == (int)(f2*100)) ? true : false;
148f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi}
149f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
150f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddistatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy,
151f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi                            hwc_display_contents_1_t *list) {
152f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    float origXres = ctx->dpyAttr[dpy].xres_orig;
153f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    float origYres = ctx->dpyAttr[dpy].yres_orig;
154f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    float fakeXres = ctx->dpyAttr[dpy].xres;
155f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    float fakeYres = ctx->dpyAttr[dpy].yres;
156f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    float xresRatio = origXres / fakeXres;
157f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    float yresRatio = origYres / fakeYres;
158f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    for (size_t i = 0; i < list->numHwLayers; i++) {
159f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_layer_1_t *layer = &list->hwLayers[i];
160f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_rect_t& displayFrame = layer->displayFrame;
161f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
162f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        float layerWidth = displayFrame.right - displayFrame.left;
163f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        float layerHeight = displayFrame.bottom - displayFrame.top;
164f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        float sourceWidth = sourceCrop.right - sourceCrop.left;
165f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        float sourceHeight = sourceCrop.bottom - sourceCrop.top;
166f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
167f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        if (isEqual(layerWidth / sourceWidth, xresRatio) &&
168f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi                isEqual(layerHeight / sourceHeight, yresRatio))
169f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi            break;
170f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
171f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        displayFrame.left = xresRatio * displayFrame.left;
172f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        displayFrame.top = yresRatio * displayFrame.top;
173f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        displayFrame.right = displayFrame.left + layerWidth * xresRatio;
174f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        displayFrame.bottom = displayFrame.top + layerHeight * yresRatio;
175f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    }
176f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi}
177f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
1782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1803156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
1812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
182640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
183b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam    bool fbComp = false;
18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
18554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
186f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
187f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        if (ctx->dpyAttr[dpy].customFBSize)
188f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi            scaleDisplayFrame(ctx, dpy, list);
189f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
19054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
191c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        setListStats(ctx, list, dpy);
192b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
193b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        if (ctx->mVPUClient == NULL)
194b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam            fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0);
195c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET
196b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        else
197b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam            fbComp = (ctx->mVPUClient->prepare(ctx, dpy, list) < 0);
198c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif
199b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
200b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        if (fbComp) {
201c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            const int fbZ = 0;
2021029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah            ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ);
203c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        }
204b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
205c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        if (ctx->mMDP.version < qdutils::MDP_V4_0) {
206c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mCopyBit[dpy])
207c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
2082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
2092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
2112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
2122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
2132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
214361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
2153156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
2162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
21876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
21954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
22054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
22154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
22254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
22390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
224c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->dpyAttr[dpy].isConfiguring = false;
225c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            setListStats(ctx, list, dpy);
226c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
227c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                const int fbZ = 0;
2281029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah                ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ);
229c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            }
23090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
231b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            /* External Display is in Pause state.
232b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * Mark all application layers as OVERLAY so that
233b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * GPU will not compose.
234b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             */
235b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) {
236b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                hwc_layer_1_t *layer = &list->hwLayers[i];
237b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                layer->compositionType = HWC_OVERLAY;
238b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            }
23976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
2402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
24225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
24325322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
244660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
245660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
246befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
2472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
248befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
24927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
25027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ctx->mPanelResetStatus) {
25127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__);
25227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        reset_panel(dev);
25327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
25427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
2557351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
2561a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
2579f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed    reset(ctx, numDisplays, displays);
258bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
25947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
260327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
26176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
26276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
2634c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal    for (int32_t i = (numDisplays-1); i >= 0; i--) {
26416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
265bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
266361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
26716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
26816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
26916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
27016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
271361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
272361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
27390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
274140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
275140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->prepare(dev, list);
27616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
27716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
27816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
279befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
280befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
28147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
282640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
283327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
28476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
285327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
2862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
287befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
289660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
29055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
2911589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
2923156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
2931589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
2941589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
2951589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
2961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
29755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
2984267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
29955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
30010d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
30155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
302dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
30355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
304dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
305f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
306a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
307a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
3081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
309a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
310a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
311a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
312a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
313f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
3141589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
3151589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
3161589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3171589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
3181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
320660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
321660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
32204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
3231ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
324c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
3251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
326361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
327bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
328bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    /* In case of non-hybrid WFD session, we are fooling SF by
329bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * piggybacking on HDMI display ID for virtual.
330bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * TODO: Not needed once we have WFD client working on top
331bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * of Google API's.
332bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     */
333bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    dpy = getDpyforExternalDisplay(ctx,dpy);
334bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
335f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
33655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
337905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
338905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
339905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
340905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
341905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
342905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
343905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
34476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        overlay::Writeback::clear();
345905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
3462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
347361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
348361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK;
349361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
350361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Failed to handle blank event(%d) for Primary!!",
351361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                  __FUNCTION__, blank );
352361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return -1;
353361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
354361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
355361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!blank) {
356361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Enable HPD here, as during bootup unblank is called
357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
360361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
361bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
362bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
363bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        if(ctx->mVirtualonExtActive) {
364bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            /* if mVirtualonExtActive is true, display hal will
365bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * receive unblank calls for non-hybrid WFD solution
366bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * since we piggyback on HDMI.
367bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * TODO: Not needed once we have WFD client working on top
368bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             of Google API's */
369bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            break;
370bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        }
371bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    case HWC_DISPLAY_VIRTUAL:
372bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        /* There are two ways to reach this block of code.
373bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
374bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL
375bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and ctx->mVirtualonExtActive is true. In this case, non-hybrid
376bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD is active. If so, getDpyforExternalDisplay will return dpy
377bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         as HWC_DISPLAY_VIRTUAL.
378bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
379bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_PRIMARY
380bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and since SF is not aware of VIRTUAL DISPLAY being handle by HWC,
381bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         it wont send blank / unblank events for it. We piggyback on
382bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         PRIMARY DISPLAY events to release mdp pipes and
383bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         activate/deactivate VIRTUAL DISPLAY.
384bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
385bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * TODO: This separate case statement is not needed once we have
386bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD client working on top of Google API's.
387bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
388bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         */
389361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
390361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
391bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) {
3928f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                int dpy = HWC_DISPLAY_VIRTUAL;
3938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
3948f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ALOGE("%s: display commit fail for virtual!", __FUNCTION__);
3958f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
3968f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
3978f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
399361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
400361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
401361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
402361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(blank) {
4038f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4048f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ALOGE("%s: display commit fail for external!", __FUNCTION__);
4058f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
4068f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
407361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
408bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
409361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
410361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
411361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
412660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
41355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
414f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
415361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran          blank ? "blanking":"unblanking", dpy);
4168f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
417660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
418660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
41927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev)
42027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{
42127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    int ret = 0;
42227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
42327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
42427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (!ctx->mPanelResetStatus)
42527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        return;
42627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
42727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__);
42827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1);
42927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
43027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to BLANK:  %s", __FUNCTION__,
43127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
43227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
43327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
43427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__);
43527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0);
43627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
43727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__,
43827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
43927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
44027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1);
44127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
44227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ctx->mPanelResetStatus = false;
44327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran}
44427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
44527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
446660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
4471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
4481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
4491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
4502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
4511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
4531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
4541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
4551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
4561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
4572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
458140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        if(ctx->mMDP.hasOverlay) {
459140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            supported |= HWC_DISPLAY_VIRTUAL_BIT;
460140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            if(!qdutils::MDPVersion::getInstance().is8x26())
461140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                supported |= HWC_DISPLAY_EXTERNAL_BIT;
462140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        }
4632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
4642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
465f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan    case HWC_FORMAT_RB_SWAP:
466f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        value[0] = 1;
467f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        break;
468905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    case HWC_COLOR_FILL:
469905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        value[0] = 1;
470905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        break;
4711589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
4721589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
4731589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
4751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
4761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
478c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
48004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4813475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
482640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
483e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
48476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        uint32_t last = list->numHwLayers - 1;
48576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4864019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
48704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
4884019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
48904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
490e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
491e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
492f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
493c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
494c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
495c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
496c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
497b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        if (ctx->mVPUClient != NULL) {
498b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#ifdef VPU_TARGET
499b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam            ctx->mVPUClient->predraw(ctx, dpy, list);
500b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#endif
501b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        }
502b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        else if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
503327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
50416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
50516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
50616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
5072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
50954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
510ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson        if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) {
51104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
51204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
51354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
51454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
51554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
51654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
51754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
51816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
5192a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
520c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
521bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd,
522bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                            ctx->listStats[dpy].roi)) {
5238f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
52450c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
5252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
526b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
527b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#ifdef VPU_TARGET
528b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        if (ctx->mVPUClient != NULL)
529b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam            ctx->mVPUClient->draw(ctx, dpy, list);
530b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#endif
5312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
532a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
533a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5343475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
5372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
538361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
53904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
54004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
5413475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
54276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
543361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
544361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
545361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
546e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
5474d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
5484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
5494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        uint32_t last = list->numHwLayers - 1;
5504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
5524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
5534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
5544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
55576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
5574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
55876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
5594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
5604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
5614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
562eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
5634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
5644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
5654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
5664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
56704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
5684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
5694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
5704d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5714d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
5724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
5734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
5744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
5754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
5764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
5774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
5784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
5794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
5804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
5814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
5824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
5833475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
5843475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
585c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
5878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
58854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
5892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
5902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
591a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
592a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
5933475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
5942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
5952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
596660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
597660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
598660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
599befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
600befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
601befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
6024c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal    for (uint32_t i = 0; i < numDisplays; i++) {
603660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
604bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
605361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
6062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
6072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
60876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
610361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
611361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
61290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
613140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
614140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->set(ctx, list);
61576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
6172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
618660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
6192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
62095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
62195eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
62295eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
62333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
62456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
6253aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah    if(ctx->mRotMgr->getNumActiveSessions() == 0)
6263aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah        Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
6277351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
6281a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
6292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
6302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
631ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
63576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
636bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
64176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
64276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
64376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
64476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
64576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
6462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
6472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
6480df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
64976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
6500df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
65176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
65276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
65376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
65476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
65576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
65676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
6572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
658660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
659befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
660befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
661befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
6622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
6632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
6642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
666bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
6670df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
668361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
66976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
67076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
67176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
6732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
6742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
6812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
6832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
6862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
6882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
6892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
6902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
6912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
69276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
69376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
6952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
6962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
69776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
69876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
70179e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
70479e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
71593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
71693138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
71793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7181a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
719a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
720a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
721a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
722a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
7230df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
727a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
728a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
729a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
730327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
7314762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
732327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
733d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    ovDump[0] = '\0';
734ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    if(Writeback::getDump(ovDump, 1024)) {
735ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        dumpsys_log(aBuf, ovDump);
736ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        ovDump[0] = '\0';
737ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    }
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;
7688f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_3;
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