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
47304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah#define POWER_MODE_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
1358df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan    for(int dpy = 0; dpy < numDisplays; dpy++) {
1368df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan        hwc_display_contents_1_t *list = displays[dpy];
1374c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
1388df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan            for(size_t layerIndex = 0; layerIndex < list->numHwLayers;
1398df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan                                                  layerIndex++) {
1408df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan                if(list->hwLayers[layerIndex].compositionType !=
1418df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan                                            HWC_FRAMEBUFFER_TARGET)
1422a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                {
1438df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan                    hwc_layer_1_t const* layer = &list->hwLayers[layerIndex];
1442a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    private_handle_t *hnd = (private_handle_t *)layer->handle;
1452a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1462a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    /* If a video layer requires rotation, set the DMA state
1472a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                     * to BLOCK_MODE */
1482a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1498df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan                    if (UNLIKELY(isYuvBuffer(hnd)) && canUseRotator(ctx, dpy) &&
1502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        (layer->transform & HWC_TRANSFORM_ROT_90)) {
1512a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        if(not qdutils::MDPVersion::getInstance().is8x26()) {
1522a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                            if(ctx->mOverlay->isPipeTypeAttached(
1532a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                                             overlay::utils::OV_MDP_PIPE_DMA))
1542a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                                ctx->isPaddingRound = true;
1552a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        }
1562a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
1572a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    }
1582a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                }
1599f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed            }
1608df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan            if(dpy) {
1612a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                /* Uncomment the below code for testing purpose.
1622a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   Assuming the orientation value is in terms of HAL_TRANSFORM,
1632a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   this needs mapping to HAL, if its in different convention */
1642a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1652a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                /* char value[PROPERTY_VALUE_MAX];
1662a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   property_get("sys.ext_orientation", value, "0");
1672a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                   ctx->mExtOrientation = atoi(value);*/
1682a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1692a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                if(ctx->mExtOrientation || ctx->mBufferMirrorMode) {
1702a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    if(ctx->mOverlay->isPipeTypeAttached(
1712a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                                         overlay::utils::OV_MDP_PIPE_DMA)) {
1722a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                        ctx->isPaddingRound = true;
1732a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    }
1742a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
1752a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                }
1762a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            }
1772a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        }
1782a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    }
1792a345b980298c7623e553634ff56cf5f619765d9Raj Kamal}
1802a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
1812a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays,
1822a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                            hwc_display_contents_1_t** displays) {
1834c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal
1842a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    ctx->numActiveDisplays = 0;
1852a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    for(int i = 0; i < numDisplays; i++) {
1862a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        hwc_display_contents_1_t *list = displays[i];
1872a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
1884c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal            /* For display devices like SSD and screenrecord, we cannot
1894c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * rely on isActive and connected attributes of dpyAttr to
1904c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * determine if the displaydevice is active. Hence in case if
1914c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * the layer-list is non-null and numHwLayers > 0, we assume
1924c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             * the display device to be active.
1934c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal             */
1944c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal            ctx->numActiveDisplays += 1;
1952a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        }
1962a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    }
1972a345b980298c7623e553634ff56cf5f619765d9Raj Kamal}
19803514577d0c705056352898f66ed2a8e9b131df8Raj Kamal
1992a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void reset(hwc_context_t *ctx, int numDisplays,
2002a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                  hwc_display_contents_1_t** displays) {
2012a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
2022a345b980298c7623e553634ff56cf5f619765d9Raj Kamal
2032a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    for(int i = 0; i < numDisplays; i++) {
2042a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        hwc_display_contents_1_t *list = displays[i];
2052a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // XXX:SurfaceFlinger no longer guarantees that this
2062a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // value is reset on every prepare. However, for the layer
2072a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // cache we need to reset it.
2082a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        // We can probably rethink that later on
2092a345b980298c7623e553634ff56cf5f619765d9Raj Kamal        if (LIKELY(list && list->numHwLayers > 0)) {
2102a345b980298c7623e553634ff56cf5f619765d9Raj Kamal            for(size_t j = 0; j < list->numHwLayers; j++) {
2112a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
2122a345b980298c7623e553634ff56cf5f619765d9Raj Kamal                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
21303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal            }
2143d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu            ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers;
2153d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        } else {
2163d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu            ctx->mPrevHwLayerCount[i] = 0;
2179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed        }
218640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
219640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(ctx->mFBUpdate[i])
220640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ctx->mFBUpdate[i]->reset();
2214019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[i])
2224019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            ctx->mCopyBit[i]->reset();
223bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar        if(ctx->mLayerRotMap[i])
224bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar            ctx->mLayerRotMap[i]->reset();
2252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
226f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah
227f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah    ctx->mAD->reset();
2288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah    MDPComp::reset();
229140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan    if(ctx->mHWCVirtual)
230140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        ctx->mHWCVirtual->destroy(ctx, numDisplays, displays);
23116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}
23216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
233f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddibool isEqual(float f1, float f2) {
234f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        return ((int)(f1*100) == (int)(f2*100)) ? true : false;
235f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi}
236f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
237f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddistatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy,
238f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi                            hwc_display_contents_1_t *list) {
2393d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t origXres = ctx->dpyAttr[dpy].xres_orig;
2403d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t origYres = ctx->dpyAttr[dpy].yres_orig;
2413d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t fakeXres = ctx->dpyAttr[dpy].xres;
2423d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    uint32_t fakeYres = ctx->dpyAttr[dpy].yres;
2433d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    float xresRatio = (float)origXres / (float)fakeXres;
2443d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    float yresRatio = (float)origYres / (float)fakeYres;
245f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    for (size_t i = 0; i < list->numHwLayers; i++) {
246f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_layer_1_t *layer = &list->hwLayers[i];
247f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_rect_t& displayFrame = layer->displayFrame;
248f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
2493d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t layerWidth = displayFrame.right - displayFrame.left;
2503d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t layerHeight = displayFrame.bottom - displayFrame.top;
2513d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t sourceWidth = sourceCrop.right - sourceCrop.left;
2523d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        uint32_t sourceHeight = sourceCrop.bottom - sourceCrop.top;
253f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2543d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        if (isEqual(((float)layerWidth / (float)sourceWidth), xresRatio) &&
2553d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu                isEqual(((float)layerHeight / (float)sourceHeight), yresRatio))
256f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi            break;
257f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.left = (int)(xresRatio * (float)displayFrame.left);
2593d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.top = (int)(yresRatio * (float)displayFrame.top);
2603d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.right = (int)((float)displayFrame.left +
2613d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu                                   (float)layerWidth * xresRatio);
2623d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        displayFrame.bottom = (int)((float)displayFrame.top +
2633d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu                                    (float)layerHeight * yresRatio);
264f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi    }
265f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi}
266f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
2682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
2693156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
2702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
271640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
272b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam    bool fbComp = false;
27354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
27454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
275f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
276f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi        if (ctx->dpyAttr[dpy].customFBSize)
277f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi            scaleDisplayFrame(ctx, dpy, list);
278f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi
2793d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
280c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        setListStats(ctx, list, dpy);
281b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
28201cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed        fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0);
283b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
284b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam        if (fbComp) {
285c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            const int fbZ = 0;
286a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah            if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) {
287a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                ctx->mOverlay->clear(dpy);
288a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                ctx->mLayerRotMap[dpy]->clear();
289a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah            }
290c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        }
291b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
292c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah        if (ctx->mMDP.version < qdutils::MDP_V4_0) {
293c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mCopyBit[dpy])
294c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
2969c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed        setGPUHint(ctx, list);
2972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
3002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
3012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
302361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        hwc_display_contents_1_t *list) {
3033156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
305361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
30676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
30754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
30854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
30954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ctx->dpyAttr[dpy].connected) {
3103d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
31190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
312c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            ctx->dpyAttr[dpy].isConfiguring = false;
313c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            setListStats(ctx, list, dpy);
314c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
315c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah                const int fbZ = 0;
316a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ))
317a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                {
318a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                    ctx->mOverlay->clear(dpy);
319a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                    ctx->mLayerRotMap[dpy]->clear();
320a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah                }
321c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah            }
32290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        } else {
323b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            /* External Display is in Pause state.
324b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * Mark all application layers as OVERLAY so that
325b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             * GPU will not compose.
326b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal             */
327b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) {
328b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                hwc_layer_1_t *layer = &list->hwLayers[i];
329b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal                layer->compositionType = HWC_OVERLAY;
330b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal            }
33176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        }
3322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
3332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
33425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
33525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
336660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
337660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
3392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
340befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
34127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
34227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ctx->mPanelResetStatus) {
34327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__);
34427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        reset_panel(dev);
34527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
34627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
3477351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Will be unlocked at the end of set
3481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.lock();
3492a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setPaddingRound(ctx,numDisplays,displays);
3502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setDMAState(ctx,numDisplays,displays);
3512a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    setNumActiveDisplays(ctx,numDisplays,displays);
3522a345b980298c7623e553634ff56cf5f619765d9Raj Kamal    reset(ctx, (int)numDisplays, displays);
353bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
35447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    ctx->mOverlay->configBegin();
355327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configBegin();
35676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configBegin();
35776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
3583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) {
35916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
360bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
36216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_PRIMARY:
36316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = hwc_prepare_primary(dev, list);
36416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
36516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            case HWC_DISPLAY_EXTERNAL:
366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_prepare_external(dev, list);
367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
36890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
369140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
370140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->prepare(dev, list);
37116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                break;
37216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            default:
37316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed                ret = -EINVAL;
374befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
375befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
37647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
377640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ctx->mOverlay->configDone();
378327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ctx->mRotMgr->configDone();
37976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    overlay::Writeback::configDone();
380327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
3812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
382befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
383befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
384660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
38555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                             int event, int enable)
3861589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3873156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed    ATRACE_CALL();
3881589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
3891589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3901589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
3911589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
39255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            if (ctx->vstate.enable == enable)
3934267d405186dccc076536208c9f428761146bae4Omprakash Dhyade                break;
39455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
39510d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed            if(ret == 0)
39655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                ctx->vstate.enable = !!enable;
397dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
39855290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
399dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev            break;
400f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP
401a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan        case  HWC_EVENT_ORIENTATION:
402a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            if(dpy == HWC_DISPLAY_PRIMARY) {
4031a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
404a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                // store the primary display orientation
405a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan                ctx->deviceOrientation = enable;
406a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            }
407a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan            break;
408f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif
4091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
4101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
4131589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
4141589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
415304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shahstatic int hwc_setPowerMode(struct hwc_composer_device_1* dev, int dpy,
416304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        int mode)
417660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
41804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
4191ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
420361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int ret = 0, value = 0;
421bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal
422304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
423304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    ALOGD_IF(POWER_MODE_DEBUG, "%s: Setting mode %d on display: %d",
424304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            __FUNCTION__, mode, dpy);
425304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah
426304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    switch(mode) {
427304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        case HWC_POWER_MODE_OFF:
428304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // free up all the overlay pipes in use
429304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // when we get a blank for either display
430304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // makes sure that all pipes are freed
431304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            ctx->mOverlay->configBegin();
432304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            ctx->mOverlay->configDone();
433304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            ctx->mRotMgr->clear();
434304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // If VDS is connected, do not clear WB object as it
435304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // will end up detaching IOMMU. This is required
436304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // to send black frame to WFD sink on power suspend.
437304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // Note: With this change, we keep the WriteBack object
438304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // alive on power suspend for AD use case.
4396d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed            // Instead, we now clear the writeback and associated pipes
4406d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed            // when the primary display is unblanking.
441304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            value = FB_BLANK_POWERDOWN;
442304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            break;
443304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        case HWC_POWER_MODE_DOZE:
444304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        case HWC_POWER_MODE_DOZE_SUSPEND:
445304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            value = FB_BLANK_VSYNC_SUSPEND;
446304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            break;
447304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        case HWC_POWER_MODE_NORMAL:
448304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            value = FB_BLANK_UNBLANK;
449304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            break;
450905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R    }
451304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah
4526d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // XXX: Workaround
4536d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // Clear writeback and all overlays when primary is unblanking,
4546d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // since the kernel may have internally reset writeback in XO shutdown.
4556d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // This is to maintain consistency with the kernel's internal state and
4566d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // not assume that we have a valid writeback object when unblanking primary
4576d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // Ideally, we should get an explicit blank on the virtual display
4586d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // or, the blank frames when the virtual display is blanking should
4596d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    // be sent _before_ the primary is unblanked
4606d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    if (dpy == HWC_DISPLAY_PRIMARY && not (mode == HWC_POWER_MODE_OFF)) {
4616d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed        ctx->mOverlay->configBegin();
4626d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed        ctx->mOverlay->configDone();
4636d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed        ctx->mRotMgr->clear();
4646d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed        Writeback::clear();
4656d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed    }
4666d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed
4672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
468361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_PRIMARY:
469361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) {
470304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            ALOGE("%s: ioctl FBIOBLANK failed for Primary with error %s"
471304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah                    " value %d", __FUNCTION__, strerror(errno), value);
472304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            return -errno;
473361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
474361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
475304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        if(mode == HWC_POWER_MODE_NORMAL) {
476304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            // Enable HPD here, as during bootup POWER_MODE_NORMAL is set
477361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            // when SF is completely initialized
478361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->mExtDisplay->setHPD(1);
479361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
480361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
481304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF);
482304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        //Deliberate fall through since there is no explicit power mode for
483304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        //virtual displays.
484bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    case HWC_DISPLAY_VIRTUAL:
485361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
486304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            const int dpy = HWC_DISPLAY_VIRTUAL;
487304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            if(mode == HWC_POWER_MODE_OFF and
488304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah                    (not ctx->dpyAttr[dpy].isPause)) {
4898f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
490304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah                    ALOGE("%s: displayCommit failed for virtual", __FUNCTION__);
4918f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                    ret = -1;
4928f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                }
4938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
494304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF);
495361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
496361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
497361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case HWC_DISPLAY_EXTERNAL:
498304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        if(mode == HWC_POWER_MODE_OFF) {
4998f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
500304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah                ALOGE("%s: displayCommit failed for external", __FUNCTION__);
5018f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar                ret = -1;
5028f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            }
503361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
504304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF);
505361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        break;
506361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
507361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return -EINVAL;
508660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
50955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed
510304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    ALOGD_IF(POWER_MODE_DEBUG, "%s: Done setting mode %d on display %d",
511304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah            __FUNCTION__, mode, dpy);
5128f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar    return ret;
513660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
514660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
51527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev)
51627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{
51727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    int ret = 0;
51827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_context_t* ctx = (hwc_context_t*)(dev);
51927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
52022f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar    if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) {
52122f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar        ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__);
52222f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar        ctx->mPanelResetStatus = false;
52327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        return;
52422f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar    }
52527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
526304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    ALOGD("%s: setting power mode off", __FUNCTION__);
527304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_OFF);
52827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
52927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to BLANK:  %s", __FUNCTION__,
530304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah                strerror(errno));
53127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
53227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
533304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    ALOGD("%s: setting power mode normal and enabling vsync", __FUNCTION__);
534304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_NORMAL);
53527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (ret < 0) {
53627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__,
537304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah                strerror(errno));
53827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
53927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1);
54027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
54127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    ctx->mPanelResetStatus = false;
54227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran}
54327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
54427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
545660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
5461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
5471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
5492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
5501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
5521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
5531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
5541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
5551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
5562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
557140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        if(ctx->mMDP.hasOverlay) {
558140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan            supported |= HWC_DISPLAY_VIRTUAL_BIT;
559a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna            if(!(qdutils::MDPVersion::getInstance().is8x26() ||
560a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna                        qdutils::MDPVersion::getInstance().is8x16()))
561140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                supported |= HWC_DISPLAY_EXTERNAL_BIT;
562140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan        }
5632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
5642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
565f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan    case HWC_FORMAT_RB_SWAP:
566f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        value[0] = 1;
567f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan        break;
568905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    case HWC_COLOR_FILL:
569905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        value[0] = 1;
570905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan        break;
5711589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
5721589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
5731589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
5741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
5751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
5761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
5771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
578c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
5792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
58004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
5813475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
582640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
583e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
5843d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        size_t last = list->numHwLayers - 1;
58576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
5864019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
58704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        bool copybitDone = false;
5884019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R        if(ctx->mCopyBit[dpy])
58904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
590e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
591e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran
593c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        // Dump the layers for primary
594c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan        if(ctx->mHwcDebug[dpy])
595c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan            ctx->mHwcDebug[dpy]->dumpLayers(list);
596c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan
59701cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
598327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
59916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            ret = -1;
60016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed        }
60116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed
6022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
6032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
60454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
605ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson        if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) {
60604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
60704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        }
60854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah
60954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah        if(hnd) {
61054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
61154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
61254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah                ret = -1;
61316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed            }
6142a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah        }
615c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
616c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran        int lSplit = getLeftSplit(ctx, dpy);
617e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran        qhwc::ovutils::Dim lRoi = qhwc::ovutils::Dim(
618c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].lRoi.left,
619c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].lRoi.top,
620c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].lRoi.right - ctx->listStats[dpy].lRoi.left,
621e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran            ctx->listStats[dpy].lRoi.bottom - ctx->listStats[dpy].lRoi.top);
622c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran
623e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran        qhwc::ovutils::Dim rRoi = qhwc::ovutils::Dim(
624c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].rRoi.left - lSplit,
625c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].rRoi.top,
626c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran            ctx->listStats[dpy].rRoi.right - ctx->listStats[dpy].rRoi.left,
627e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran            ctx->listStats[dpy].rRoi.bottom - ctx->listStats[dpy].rRoi.top);
628c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran
629c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, lRoi, rRoi)) {
6308f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
63150c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan            ret = -1;
6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
633b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam
6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
635a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
636a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
6373475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
641361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                            hwc_display_contents_1_t* list)
64204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
64304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    ATRACE_CALL();
6443475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    int ret = 0;
64576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
646361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const int dpy = HWC_DISPLAY_EXTERNAL;
647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
648361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
649e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
6504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        ctx->dpyAttr[dpy].connected &&
6514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause) {
6523d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        size_t last = list->numHwLayers - 1;
6534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
6544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int fd = -1; //FenceFD from the Copybit(valid in async mode)
6554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        bool copybitDone = false;
6564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mCopyBit[dpy])
6574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
65876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
6604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
66176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
6624d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        // Dump the layers for external
6634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(ctx->mHwcDebug[dpy])
6644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ctx->mHwcDebug[dpy]->dumpLayers(list);
665eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R
6664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
6674d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
6684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            ret = -1;
6694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
67004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
6714d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        int extOnlyLayerIndex =
6724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ctx->listStats[dpy].extOnlyLayerIndex;
6734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
6744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
6754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(extOnlyLayerIndex!= -1) {
6764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex];
6774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = (private_handle_t *)extLayer->handle;
6784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        } else if(copybitDone) {
6794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
6804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        }
6814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar
6824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        if(hnd && !isYuvBuffer(hnd)) {
6834d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
6844d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
6854d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ret = -1;
6863475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah            }
6873475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah        }
688c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran
6898f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar        if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
6908f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar            ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy);
69154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah            ret = -1;
6922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
6932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
694a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah
695a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah    closeAcquireFds(list);
6963475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah    return ret;
6972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
699660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
700660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
701660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
702befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
703befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
704befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7053d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    for (int i = 0; i < (int)numDisplays; i++) {
706660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
707bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal        int dpy = getDpyforExternalDisplay(ctx, i);
708361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        switch(dpy) {
7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
71176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
713361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ret = hwc_set_external(ctx, list);
714361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
71590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            case HWC_DISPLAY_VIRTUAL:
716140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                if(ctx->mHWCVirtual)
717140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan                    ret = ctx->mHWCVirtual->set(ctx, list);
71876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                break;
7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
721660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
7222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
72395eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
72495eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    // frames to the display.
72595eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed    CALC_FPS();
72633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah    MDPComp::resetIdleFallBack();
72756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah    ctx->mVideoTransFlag = false;
7287351e690989ae638e281be1999b002b3333cd403Saurabh Shah    //Was locked at the beginning of prepare
7291a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    ctx->mDrawLock.unlock();
7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
732ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
7342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
73676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
737bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
738304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    //Currently we allow only 1 config, reported as config id # 0
739304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    //This config is passed in to getDisplayAttributes. Ignored for now.
7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
74276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            if(*numConfigs > 0) {
74376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                configs[0] = 0;
74476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                *numConfigs = 1;
74576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
74676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = 0; //NO_ERROR
7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
7490df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
75076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ret = -1; //Not connected
7510df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar            if(ctx->dpyAttr[disp].connected) {
75276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                ret = 0; //NO_ERROR
75376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                if(*numConfigs > 0) {
75476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    configs[0] = 0;
75576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    *numConfigs = 1;
75676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                }
75776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            }
7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
759660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
760befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
762befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
764404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R        uint32_t /*config*/, const uint32_t* attributes, int32_t* values) {
7652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
767bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal    disp = getDpyforExternalDisplay(ctx, disp);
7680df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error
769361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) {
77076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        return -1;
77176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
77276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
7812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7833d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu    const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
7842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
7852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
7862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
7872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
7882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
7892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
7902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
7922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
79376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
79476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].xres);
7952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
7962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
7972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
79876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
79976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                    ctx->dpyAttr[disp].yres);
8002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
8012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
80279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
8032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
8042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
80579e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
8062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
8072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
8082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
8092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
8102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
8112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
8122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
8132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
8142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
8152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
81693138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
81793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{
81893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
8191a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
820a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    android::String8 aBuf("");
821a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
822a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
823a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
8240df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar    for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) {
825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        if(ctx->mMDPComp[dpy])
826f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran            ctx->mMDPComp[dpy]->dump(aBuf, ctx);
827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    }
828a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char ovDump[2048] = {'\0'};
829a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
830a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    dumpsys_log(aBuf, ovDump);
831327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    ovDump[0] = '\0';
8324762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
833327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    dumpsys_log(aBuf, ovDump);
834d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah    ovDump[0] = '\0';
835ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    if(Writeback::getDump(ovDump, 1024)) {
836ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        dumpsys_log(aBuf, ovDump);
837ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah        ovDump[0] = '\0';
838ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah    }
839a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
84093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed}
84193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed
842304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shahint hwc_getActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/) {
843304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    //Supports only the default config (0th index) for now
844304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    return 0;
845304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah}
846304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah
847304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shahint hwc_setActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/,
848304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        int index) {
849304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    //Supports only the default config (0th index) for now
850304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah    return (index == 0) ? index : -EINVAL;
851304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah}
852304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah
853befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
854befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
855befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
8561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
857befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
858befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
859befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
860befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
861befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
862befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
863befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
864befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
865befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
866befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
867befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
868befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
869befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
870befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
871befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
872befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
873c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan        if(dev == NULL)
874c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan            return status;
875befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
8761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
878befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
8791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
8801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
8812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
882304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_4;
8832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
8842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
8852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
8862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
8872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
888304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        dev->device.setPowerMode        = hwc_setPowerMode;
8892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
8902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
89193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed        dev->device.dump                = hwc_dump;
8922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
8932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
894304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        dev->device.getActiveConfig     = hwc_getActiveConfig;
895304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah        dev->device.setActiveConfig     = hwc_setActiveConfig;
8962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
897befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
898befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
899befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
900befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
901