hwc.cpp revision 3d3705af561ebe7182b23fdc81e0b755d22b11eb
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;
2841029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah            ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ);
285c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        }
286b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
287c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        if (ctx->mMDP.version < qdutils::MDP_V4_0) {
288c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mCopyBit[dpy])
289c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
2902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
2919c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed        setGPUHint(ctx, list);
2922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
2942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
2962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
297361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
2983156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
300361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
30176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
30254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
30354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
30454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
3053d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
30690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
307c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->dpyAttr[dpy].isConfiguring = false;
308c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            setListStats(ctx, list, dpy);
309c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
310c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                const int fbZ = 0;
3111029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah                ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ);
312c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            }
31390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
314b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            /* External Display is in Pause state.
315b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * Mark all application layers as OVERLAY so that
316b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * GPU will not compose.
317b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             */
318b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) {
319b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                hwc_layer_1_t *layer = &list->hwLayers[i];
320b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                layer->compositionType = HWC_OVERLAY;
321b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            }
32276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
3232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
3242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
32525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
32625322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
327660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
328660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
329befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
3302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
331befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
33227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
33327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ctx->mPanelResetStatus) {
33427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__);
33527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        reset_panel(dev);
33627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
33727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
3387351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
3391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
3402a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setPaddingRound(ctx,numDisplays,displays);
3412a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setDMAState(ctx,numDisplays,displays);
3422a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setNumActiveDisplays(ctx,numDisplays,displays);
3432a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    reset(ctx, (int)numDisplays, displays);
344bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
34547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
346327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
34776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
34876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
3493d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) {
35016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
351bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
352361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
35316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
35416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
35516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
35616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
35990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
360140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
361140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->prepare(dev, list);
36216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
36316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
36416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
365befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
366befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
36747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
368640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
369327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
37076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
371327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
3722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
373befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
374befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
375660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
37655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
3771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3783156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
3801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3811589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
3821589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
38355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
3844267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
38555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
38610d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
38755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
388dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
38955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
390dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
391f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
392a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
393a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
3941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
395a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
396a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
397a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
398a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
399f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
4001589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
4011589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
4021589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
4041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
406660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
407660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
40804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4091ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
410c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
4111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
412361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
413bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
414bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    /* In case of non-hybrid WFD session, we are fooling SF by
415bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * piggybacking on HDMI display ID for virtual.
416bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * TODO: Not needed once we have WFD client working on top
417bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     * of Google API's.
418bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal     */
419bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    dpy = getDpyforExternalDisplay(ctx,dpy);
420bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
421f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
42255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
423905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    if(blank) {
424905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // free up all the overlay pipes in use
425905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // when we get a blank for either display
426905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        // makes sure that all pipes are freed
427905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configBegin();
428905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mOverlay->configDone();
429905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R        ctx->mRotMgr->clear();
4305f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // If VDS is connected, do not clear WB object as it
4315f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // will end up detaching IOMMU. This is required
4325f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // to send black frame to WFD sink on power suspend.
4335f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // Note: With this change, we keep the WriteBack object
4345f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa        // alive on power suspend for AD use case.
435905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
4362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
437361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
438361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK;
439361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
440361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Failed to handle blank event(%d) for Primary!!",
441361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                  __FUNCTION__, blank );
442361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return -1;
443361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
444361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
445361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(!blank) {
446361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // Enable HPD here, as during bootup unblank is called
447361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
448361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
449361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
450361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
451bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
452bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
453bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        if(ctx->mVirtualonExtActive) {
454bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            /* if mVirtualonExtActive is true, display hal will
455bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * receive unblank calls for non-hybrid WFD solution
456bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * since we piggyback on HDMI.
457bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             * TODO: Not needed once we have WFD client working on top
458bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal             of Google API's */
459bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            break;
460bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        }
461bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    case HWC_DISPLAY_VIRTUAL:
462bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        /* There are two ways to reach this block of code.
463bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
464bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL
465bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and ctx->mVirtualonExtActive is true. In this case, non-hybrid
466bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD is active. If so, getDpyforExternalDisplay will return dpy
467bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         as HWC_DISPLAY_VIRTUAL.
468bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
469bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * Display hal has received unblank call on HWC_DISPLAY_PRIMARY
470bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         and since SF is not aware of VIRTUAL DISPLAY being handle by HWC,
471bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         it wont send blank / unblank events for it. We piggyback on
472bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         PRIMARY DISPLAY events to release mdp pipes and
473bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         activate/deactivate VIRTUAL DISPLAY.
474bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
475bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         * TODO: This separate case statement is not needed once we have
476bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         WFD client working on top of Google API's.
477bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
478bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal         */
479361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
480361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
481bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) {
4828f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                int dpy = HWC_DISPLAY_VIRTUAL;
4838f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4848f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ALOGE("%s: display commit fail for virtual!", __FUNCTION__);
4858f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
4868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
4878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
488361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank;
489361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
490361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
491361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
492361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(blank) {
4938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
4948f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ALOGE("%s: display commit fail for external!", __FUNCTION__);
4958f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
4968f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
497361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
498bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        ctx->dpyAttr[dpy].isActive = !blank;
499361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
500361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
501361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
502660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
50355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
504f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
505361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran          blank ? "blanking":"unblanking", dpy);
5068f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
507660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
508660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
50927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev)
51027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{
51127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    int ret = 0;
51227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
51327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
51422f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar    if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) {
51522f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar        ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__);
51622f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar        ctx->mPanelResetStatus = false;
51727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        return;
51822f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar    }
51927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
52027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__);
52127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1);
52227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
52327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to BLANK:  %s", __FUNCTION__,
52427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
52527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
52627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
52727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__);
52827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0);
52927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
53027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__,
53127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                            strerror(errno));
53227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
53327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1);
53427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
53527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ctx->mPanelResetStatus = false;
53627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran}
53727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
53827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
539660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
5401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
5411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
5421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
5432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
5441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
5461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
5471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
5491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
5502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
551140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        if(ctx->mMDP.hasOverlay) {
552140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            supported |= HWC_DISPLAY_VIRTUAL_BIT;
553a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna            if(!(qdutils::MDPVersion::getInstance().is8x26() ||
554a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna                        qdutils::MDPVersion::getInstance().is8x16()))
555140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                supported |= HWC_DISPLAY_EXTERNAL_BIT;
556140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        }
5572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
5582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
559f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan    case HWC_FORMAT_RB_SWAP:
560f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        value[0] = 1;
561f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        break;
562905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    case HWC_COLOR_FILL:
563905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        value[0] = 1;
564905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        break;
5651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
5661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
5671589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
5681589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
5691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5701589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
5711589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
572c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
57404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
5753475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
576640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
577e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
5783d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        size_t last = list->numHwLayers - 1;
57976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5804019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
58104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
5824019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
58304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
584e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
585e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
587c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
588c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
589c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
590c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
59101cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
592327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
59316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
59416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
59516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
5962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
5972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
59854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
599ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson        if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) {
60004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
60104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
60254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
60354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
60454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
60554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
60654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
60716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
6082a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
609c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
610bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd,
611bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran                                            ctx->listStats[dpy].roi)) {
6128f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
61350c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
6142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
615b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
6162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
617a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
618a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
6193475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
6202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
6212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
623361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
62404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
62504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
6263475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
62776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
628361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
629361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
630361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
631e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
6324d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
6334d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
6343d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        size_t last = list->numHwLayers - 1;
6354d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
6364d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
6374d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
6384d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
6394d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
64076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6414d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
6424d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
64376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6444d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
6454d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
6464d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
647eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
6484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
6494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
6504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
6514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
65204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
6534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
6544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
6554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
6564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
6574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
6584d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
6594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
6604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
6614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
6624d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
6634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
6644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
6654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
6664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
6674d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
6683475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
6693475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
670c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
6718f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
6728f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
67354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
6742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
676a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
677a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
6783475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
681660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
682660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
683660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
684befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
685befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
686befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
6873d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    for (int i = 0; i < (int)numDisplays; i++) {
688660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
689bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
690361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
6912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
6922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
69376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
695361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
696361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
69790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
698140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
699140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->set(ctx, list);
70076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
703660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
70595eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
70695eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
70795eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
70833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
70956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
7107351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
7111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
714ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
71876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
719bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
7222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
7232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
72476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
72576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
72676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
72776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
72876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
7292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
7310df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
73276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
7330df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
73476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
73576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
73676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
73876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
73976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
741660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
744befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
746404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R        uint32_t /*config*/, const uint32_t* attributes, int32_t* values) {
7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
749bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7500df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
751361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
75276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
75376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
75476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
7552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
7562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
7572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
7592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
7602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
7612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
7622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
7642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7653d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
7692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
77576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
77676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
78076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
78176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
78479e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
7852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
78779e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
7882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
7902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
7912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
7922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
7932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
7942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
7952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
7962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
7972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
79893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
79993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
80093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
8011a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
802a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
803a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
804a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
805a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
8060df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
807f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
808f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf);
809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
810a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
811a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
812a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
813327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
8144762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
815327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
816d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    ovDump[0] = '\0';
817ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    if(Writeback::getDump(ovDump, 1024)) {
818ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        dumpsys_log(aBuf, ovDump);
819ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        ovDump[0] = '\0';
820ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    }
821a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
82293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
82393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
824befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
825befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
826befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
8271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
828befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
829befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
830befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
831befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
832befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
833befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
834befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
835befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
836befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
837befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
838befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
839befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
840befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
841befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
842befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
843befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
844c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan        if(dev == NULL)
845c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan            return status;
846befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
8471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
849befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
8501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
8522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
8538f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_3;
8542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
8552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
8562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
8572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
8582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
8592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
8602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
8612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
86293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
8632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
8642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
8652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
866befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
867befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
868befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
869befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
870