hwc.cpp revision e54f8a454099b5773541ecc70bbe3b7579c5d66b
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"
41140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_virtual.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
5727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev);
5827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
73bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on
74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their
75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL.
76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */
77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
78bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) {
79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive)
80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_VIRTUAL;
81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return dpy;
82361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
83361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
87660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
908eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("%s", __FUNCTION__);
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
96359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
97359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
98aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // Now that we have the functions needed, kick off
99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    // the uevent & vsync threads
100359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
101aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    init_vsync_thread(ctx);
102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
1042a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setPaddingRound(hwc_context_t *ctx, int numDisplays,
1052a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                            hwc_display_contents_1_t** displays) {
10603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal    ctx->isPaddingRound = false;
1072a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    for(int i = 0; i < numDisplays; i++) {
1082a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        hwc_display_contents_1_t *list = displays[i];
1092a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
1102a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            if((ctx->mPrevHwLayerCount[i] == 1 or
1112a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                ctx->mPrevHwLayerCount[i] == 0) and
1122a345b980298c7623e553634ff56cf5f619765d9Raj Kamal               (list->numHwLayers > 1)) {
1132a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                /* If the previous cycle for dpy 'i' has 0 AppLayers and the
1142a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                 * current cycle has atleast 1 AppLayer, padding round needs
1152a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                 * to be invoked in current cycle on all the active displays
1162a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                 * to free up the resources.
1172a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                 */
1182a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                ctx->isPaddingRound = true;
1192a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            }
1202a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers;
1212a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        } else {
1222a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            ctx->mPrevHwLayerCount[i] = 0;
1232a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        }
1242a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    }
1252a345b980298c7623e553634ff56cf5f619765d9Raj Kamal}
1262a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1272a345b980298c7623e553634ff56cf5f619765d9Raj Kamal/* Based on certain conditions, isPaddingRound will be set
1282a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * to make this function self-contained */
1292a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setDMAState(hwc_context_t *ctx, int numDisplays,
1302a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        hwc_display_contents_1_t** displays) {
1312a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1322a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    if(ctx->mRotMgr->getNumActiveSessions() == 0)
1332a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
13403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal
135404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R    for(int i = 0; i < numDisplays; i++) {
1369f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
1374c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
1383d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu            for(size_t j = 0; j < list->numHwLayers; j++) {
1399f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
1402a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                {
1412a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    hwc_layer_1_t const* layer = &list->hwLayers[i];
1422a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    private_handle_t *hnd = (private_handle_t *)layer->handle;
1432a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1442a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    /* If a video layer requires rotation, set the DMA state
1452a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                     * to BLOCK_MODE */
1462a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1472a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    if (UNLIKELY(isYuvBuffer(hnd)) && canUseRotator(ctx,i) &&
1482a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        (layer->transform & HWC_TRANSFORM_ROT_90)) {
1492a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        if(not qdutils::MDPVersion::getInstance().is8x26()) {
1502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                            if(ctx->mOverlay->isPipeTypeAttached(
1512a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                                             overlay::utils::OV_MDP_PIPE_DMA))
1522a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                                ctx->isPaddingRound = true;
1532a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        }
1542a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
1552a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    }
1562a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                }
1579f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1582a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            if(i) {
1592a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                /* Uncomment the below code for testing purpose.
1602a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   Assuming the orientation value is in terms of HAL_TRANSFORM,
1612a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   this needs mapping to HAL, if its in different convention */
1622a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1632a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                /* char value[PROPERTY_VALUE_MAX];
1642a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   property_get("sys.ext_orientation", value, "0");
1652a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   ctx->mExtOrientation = atoi(value);*/
1662a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1672a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                if(ctx->mExtOrientation || ctx->mBufferMirrorMode) {
1682a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    if(ctx->mOverlay->isPipeTypeAttached(
1692a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                                         overlay::utils::OV_MDP_PIPE_DMA)) {
1702a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        ctx->isPaddingRound = true;
1712a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    }
1722a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
1732a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                }
1742a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            }
1752a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        }
1762a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    }
1772a345b980298c7623e553634ff56cf5f619765d9Raj Kamal}
1782a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1792a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays,
1802a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                            hwc_display_contents_1_t** displays) {
1814c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal
1822a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    ctx->numActiveDisplays = 0;
1832a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    for(int i = 0; i < numDisplays; i++) {
1842a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        hwc_display_contents_1_t *list = displays[i];
1852a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
1864c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal            /* For display devices like SSD and screenrecord, we cannot
1874c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * rely on isActive and connected attributes of dpyAttr to
1884c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * determine if the displaydevice is active. Hence in case if
1894c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * the layer-list is non-null and numHwLayers > 0, we assume
1904c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * the display device to be active.
1914c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             */
1924c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal            ctx->numActiveDisplays += 1;
1932a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        }
1942a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    }
1952a345b980298c7623e553634ff56cf5f619765d9Raj Kamal}
19603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal
1972a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void reset(hwc_context_t *ctx, int numDisplays,
1982a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                  hwc_display_contents_1_t** displays) {
1992a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
2002a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
2012a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    for(int i = 0; i < numDisplays; i++) {
2022a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        hwc_display_contents_1_t *list = displays[i];
2032a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // XXX:SurfaceFlinger no longer guarantees that this
2042a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // value is reset on every prepare. However, for the layer
2052a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // cache we need to reset it.
2062a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // We can probably rethink that later on
2072a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
2082a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            for(size_t j = 0; j < list->numHwLayers; j++) {
2092a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
2102a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
21103514577d0c705056352898f66ed2a8e9b131df8Raj Kamal            }
2123d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu            ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers;
2133d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        } else {
2143d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu            ctx->mPrevHwLayerCount[i] = 0;
2159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
216640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
217640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
218640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
2194019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
2204019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
221bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar        if(ctx->mLayerRotMap[i])
222bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar            ctx->mLayerRotMap[i]->reset();
2232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
224f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
225f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    ctx->mAD->reset();
2268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    MDPComp::reset();
227140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan    if(ctx->mHWCVirtual)
228140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        ctx->mHWCVirtual->destroy(ctx, numDisplays, displays);
22916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
23016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
231f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddibool isEqual(float f1, float f2) {
232f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        return ((int)(f1*100) == (int)(f2*100)) ? true : false;
233f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi}
234f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
235f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddistatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy,
236f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi                            hwc_display_contents_1_t *list) {
2373d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t origXres = ctx->dpyAttr[dpy].xres_orig;
2383d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t origYres = ctx->dpyAttr[dpy].yres_orig;
2393d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t fakeXres = ctx->dpyAttr[dpy].xres;
2403d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t fakeYres = ctx->dpyAttr[dpy].yres;
2413d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    float xresRatio = (float)origXres / (float)fakeXres;
2423d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    float yresRatio = (float)origYres / (float)fakeYres;
243f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    for (size_t i = 0; i < list->numHwLayers; i++) {
244f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_layer_1_t *layer = &list->hwLayers[i];
245f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_rect_t& displayFrame = layer->displayFrame;
246f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
2473d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t layerWidth = displayFrame.right - displayFrame.left;
2483d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t layerHeight = displayFrame.bottom - displayFrame.top;
2493d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t sourceWidth = sourceCrop.right - sourceCrop.left;
2503d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t sourceHeight = sourceCrop.bottom - sourceCrop.top;
251f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2523d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        if (isEqual(((float)layerWidth / (float)sourceWidth), xresRatio) &&
2533d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu                isEqual(((float)layerHeight / (float)sourceHeight), yresRatio))
254f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi            break;
255f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2563d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.left = (int)(xresRatio * (float)displayFrame.left);
2573d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.top = (int)(yresRatio * (float)displayFrame.top);
2583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.right = (int)((float)displayFrame.left +
2593d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu                                   (float)layerWidth * xresRatio);
2603d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.bottom = (int)((float)displayFrame.top +
2613d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu                                    (float)layerHeight * yresRatio);
262f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    }
263f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi}
264f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
2662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
2673156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
2682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
269640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
270b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam    bool fbComp = false;
27154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
27254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
273f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
274f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        if (ctx->dpyAttr[dpy].customFBSize)
275f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi            scaleDisplayFrame(ctx, dpy, list);
276f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2773d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
278c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        setListStats(ctx, list, dpy);
279b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
28001cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed        fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0);
281b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
282b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        if (fbComp) {
283c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            const int fbZ = 0;
284a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah            if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) {
285a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                ctx->mOverlay->clear(dpy);
286a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                ctx->mLayerRotMap[dpy]->clear();
287a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah            }
288c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        }
289b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
290c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        if (ctx->mMDP.version < qdutils::MDP_V4_0) {
291c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mCopyBit[dpy])
292c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
2932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
2949c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed        setGPUHint(ctx, list);
2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
2972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
300361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
3013156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
303361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
30476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
30554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
30654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
30754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
3083d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
30990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
310c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->dpyAttr[dpy].isConfiguring = false;
311c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            setListStats(ctx, list, dpy);
312c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
313c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                const int fbZ = 0;
314a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ))
315a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                {
316a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                    ctx->mOverlay->clear(dpy);
317a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                    ctx->mLayerRotMap[dpy]->clear();
318a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                }
319c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            }
32090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
321b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            /* External Display is in Pause state.
322b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * Mark all application layers as OVERLAY so that
323b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * GPU will not compose.
324b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             */
325b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) {
326b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                hwc_layer_1_t *layer = &list->hwLayers[i];
327b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                layer->compositionType = HWC_OVERLAY;
328b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            }
32976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
3302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
3312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
33225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
33325322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
334660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
335660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
336befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
3372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
33927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
34027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ctx->mPanelResetStatus) {
34127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__);
34227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        reset_panel(dev);
34327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
34427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
3457351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
3461a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
3472a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setPaddingRound(ctx,numDisplays,displays);
3482a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setDMAState(ctx,numDisplays,displays);
3492a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setNumActiveDisplays(ctx,numDisplays,displays);
3502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    reset(ctx, (int)numDisplays, displays);
351bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
35247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
353327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
35476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
35576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
3563d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) {
35716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
358bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
36016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
36116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
36216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
36316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
36690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
367140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
368140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->prepare(dev, list);
36916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
37016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
37116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
372befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
373befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
37447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
375640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
376327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
37776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
378327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
3792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
380befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
381befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
382660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
38355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
3841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3853156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3861589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
3871589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3881589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
3891589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
39055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
3914267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
39255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
39310d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
39455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
395dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
39655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
397dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
398f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
399a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
400a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
4011a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
402a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
403a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
404a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
405a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
406f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
4071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
4081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
4091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
413660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
414660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
41504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4161ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
417c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4181a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
419361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
420bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
421bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    /* In case of non-hybrid WFD session, we are fooling SF by
422bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * piggybacking on HDMI display ID for virtual.
423bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * TODO: Not needed once we have WFD client working on top
424bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * of Google API's.
425bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     */
426bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    dpy = getDpyforExternalDisplay(ctx,dpy);
427bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
428f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
42955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
430905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
431905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
432905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
433905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
434905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
435905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
436905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
4375f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // If VDS is connected, do not clear WB object as it
4385f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // will end up detaching IOMMU. This is required
4395f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // to send black frame to WFD sink on power suspend.
4405f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // Note: With this change, we keep the WriteBack object
4415f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // alive on power suspend for AD use case.
442905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
4432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
444361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
445361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK;
446361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
447361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Failed to handle blank event(%d) for Primary!!",
448361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                  __FUNCTION__, blank );
449361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return -1;
450361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
451361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
452361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!blank) {
453361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Enable HPD here, as during bootup unblank is called
454361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
455361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
456361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
457361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
458bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
459bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
460bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        if(ctx->mVirtualonExtActive) {
461bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            /* if mVirtualonExtActive is true, display hal will
462bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * receive unblank calls for non-hybrid WFD solution
463bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * since we piggyback on HDMI.
464bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * TODO: Not needed once we have WFD client working on top
465bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             of Google API's */
466bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            break;
467bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        }
468bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    case HWC_DISPLAY_VIRTUAL:
469bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        /* There are two ways to reach this block of code.
470bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
471bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL
472bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and ctx->mVirtualonExtActive is true. In this case, non-hybrid
473bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD is active. If so, getDpyforExternalDisplay will return dpy
474bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         as HWC_DISPLAY_VIRTUAL.
475bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
476bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_PRIMARY
477bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and since SF is not aware of VIRTUAL DISPLAY being handle by HWC,
478bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         it wont send blank / unblank events for it. We piggyback on
479bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         PRIMARY DISPLAY events to release mdp pipes and
480bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         activate/deactivate VIRTUAL DISPLAY.
481bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
482bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * TODO: This separate case statement is not needed once we have
483bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD client working on top of Google API's.
484bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
485bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         */
486361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
487361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
488bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) {
4898f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                int dpy = HWC_DISPLAY_VIRTUAL;
4908f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4918f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ALOGE("%s: display commit fail for virtual!", __FUNCTION__);
4928f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
4938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
4948f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
495361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
496361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
497361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
498361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
499361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(blank) {
5008f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
5018f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ALOGE("%s: display commit fail for external!", __FUNCTION__);
5028f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
5038f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
504361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
505bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
506361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
507361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
508361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
509660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
51055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
511f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
512361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran          blank ? "blanking":"unblanking", dpy);
5138f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
514660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
515660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
51627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev)
51727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{
51827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    int ret = 0;
51927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
52027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
52122f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar    if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) {
52222f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar        ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__);
52322f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar        ctx->mPanelResetStatus = false;
52427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        return;
52522f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar    }
52627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
52727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__);
52827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1);
52927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
53027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to BLANK:  %s", __FUNCTION__,
53127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
53227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
53327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
53427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__);
53527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0);
53627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
53727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__,
53827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
53927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
54027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1);
54127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
54227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ctx->mPanelResetStatus = false;
54327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran}
54427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
54527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
546660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
5471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
5491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
5502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
5511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
5531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
5541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
5551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
5561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
5572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
558140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        if(ctx->mMDP.hasOverlay) {
559140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            supported |= HWC_DISPLAY_VIRTUAL_BIT;
560a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna            if(!(qdutils::MDPVersion::getInstance().is8x26() ||
561a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna                        qdutils::MDPVersion::getInstance().is8x16()))
562140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                supported |= HWC_DISPLAY_EXTERNAL_BIT;
563140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        }
5642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
5652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
566f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan    case HWC_FORMAT_RB_SWAP:
567f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        value[0] = 1;
568f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        break;
569905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    case HWC_COLOR_FILL:
570905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        value[0] = 1;
571905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        break;
5721589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
5731589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
5741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
5751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
5761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
5781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
579c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
58104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
5823475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
583640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
584e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
5853d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        size_t last = list->numHwLayers - 1;
58676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5874019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
58804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
5894019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
59004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
591e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
592e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
594c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
595c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
596c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
597c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
59801cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
599327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
60016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
60116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
60216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
6032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
6042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
60554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
606ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson        if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) {
60704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
60804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
60954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
61054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
61154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
61254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
61354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
61416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
6152a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
616c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
617c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran        int lSplit = getLeftSplit(ctx, dpy);
618e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran        qhwc::ovutils::Dim lRoi = qhwc::ovutils::Dim(
619c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].lRoi.left,
620c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].lRoi.top,
621c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].lRoi.right - ctx->listStats[dpy].lRoi.left,
622e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran            ctx->listStats[dpy].lRoi.bottom - ctx->listStats[dpy].lRoi.top);
623c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran
624e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran        qhwc::ovutils::Dim rRoi = qhwc::ovutils::Dim(
625c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].rRoi.left - lSplit,
626c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].rRoi.top,
627c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].rRoi.right - ctx->listStats[dpy].rRoi.left,
628e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran            ctx->listStats[dpy].rRoi.bottom - ctx->listStats[dpy].rRoi.top);
629c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran
630c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, lRoi, rRoi)) {
6318f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
63250c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
634b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
636a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
637a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
6383475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
642361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
64304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
64404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
6453475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
64676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
648361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
649361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
650e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
6514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
6524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
6533d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        size_t last = list->numHwLayers - 1;
6544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
6554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
6564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
6574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
6584d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
65976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
6614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
66276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
6644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
6654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
666eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
6674d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
6684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
6694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
6704d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
67104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
6724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
6734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
6744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
6754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
6764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
6774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
6784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
6794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
6804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
6814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
6824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
6834d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
6844d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
6854d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
6864d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
6873475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
6883475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
689c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
6908f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
6918f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
69254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
6932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
695a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
696a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
6973475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
700660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
701660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
702660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
703befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
704befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
705befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7063d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    for (int i = 0; i < (int)numDisplays; i++) {
707660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
708bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
709361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
71276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
714361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
715361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
71690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
717140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
718140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->set(ctx, list);
71976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
722660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
7232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
72495eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
72595eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
72695eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
72733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
72856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
7297351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
7301a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
7322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
733ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
7342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
7362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
738bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
74376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
74476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
74576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
74676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
74776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
7500df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
75176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
7520df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
75376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
75476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
75576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
75676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
75776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
75876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
7592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
760660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
762befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
763befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
765404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R        uint32_t /*config*/, const uint32_t* attributes, int32_t* values) {
7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
768bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7690df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
770361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
77176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
77276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
77376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
7812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
7832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7843d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
7852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
7862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
7882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
7892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
7902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
7912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
7932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
79476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
79576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
7962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
7982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
79976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
80076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
8012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
8022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
80379e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
8042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
8052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
80679e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
8072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
8082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
8092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
8102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
8112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
8122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
8132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
8142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
8152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
8162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
81793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
81893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
81993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
8201a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
821a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
822a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
823a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
824a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
8250df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
826f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
828f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
829a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
830a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
831a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
832327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
8334762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
834327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
835d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    ovDump[0] = '\0';
836ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    if(Writeback::getDump(ovDump, 1024)) {
837ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        dumpsys_log(aBuf, ovDump);
838ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        ovDump[0] = '\0';
839ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    }
840a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
84193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
84293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
843befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
844befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
845befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
8461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
847befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
848befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
849befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
850befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
851befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
852befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
853befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
854befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
855befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
856befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
857befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
858befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
859befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
860befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
861befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
862befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
863c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan        if(dev == NULL)
864c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan            return status;
865befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
8661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8671589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
868befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
8691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8701589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
8712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
8728f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_3;
8732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
8742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
8752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
8762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
8772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
8782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
8792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
8802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
88193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
8822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
8832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
8842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
885befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
886befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
887befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
888befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
889