hwc.cpp revision 2e449280f98f003bb5831c274fc07ab722ac1a94
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
3bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License.
7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License.
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h>
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h>
20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h>
22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/atomic.h>
231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <EGL/egl.h>
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <overlay.h>
261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <fb_priv.h>
27b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h>
28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h"
29ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed#include "hwc_video.h"
30bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
34befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
35befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
41befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
60660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
68359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
69359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
70359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    // don't start listening for events until we can do something with them
71359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic void reset(hwc_context_t *ctx, int numDisplays) {
762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    memset(ctx->listStats, 0, sizeof(ctx->listStats));
772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for(int i = 0; i < numDisplays; i++){
782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        ctx->listStats[i].yuvIndex = -1;
792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if (LIKELY(list && list->numHwLayers)) {
862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        setListStats(ctx, list, HWC_DISPLAY_PRIMARY);
872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        if(VideoOverlay::prepare(ctx, list, HWC_DISPLAY_PRIMARY)) {
882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ctx->overlayInUse = true;
892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        } else if(MDPComp::configure(ctx, list)) {
902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ctx->overlayInUse = true;
912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        } else {
922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ctx->overlayInUse = false;
932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t *list) {
1002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
1022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if (LIKELY(list && list->numHwLayers)) {
1032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        setListStats(ctx, list, HWC_DISPLAY_EXTERNAL);
1042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //Nothing to do for now
1052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
10725322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
10825322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
109660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
110660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
111befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
1122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
113befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
114ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    ctx->overlayInUse = false;
115ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
1162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    reset(ctx, numDisplays);
117bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
118bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    //If securing of h/w in progress skip comp using overlay.
119bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    if(ctx->mSecuring == true) return 0;
120bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
121ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah    for (uint32_t i = 0; i < numDisplays; i++) {
122ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah        hwc_display_contents_1_t *list = displays[i];
1232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch(i) {
1242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
1252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_prepare_primary(dev, list);
1262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                break;
1272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
1282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_prepare_external(dev, list);
1292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                break;
1302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
1312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
132befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
133befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
1342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
135befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
136befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
137660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
1381589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                             int event, int enabled)
1391589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
1401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
1411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
1431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                ctx->mFbDev->common.module);
1441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
1451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
1462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_OVERLAY_VSYNC_CTRL,
1472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    &enabled) < 0) {
1482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ALOGE("%s: vsync control failed. Dpy=%d, enabled=%d : %s",
1492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                        __FUNCTION__, dpy, enabled, strerror(errno));
1501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                ret = -errno;
151080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            }
1522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
1531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
1541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
1551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
1561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
1571589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
1581589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
159660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
160660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
1611ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1621ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
1631ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed        ctx->mFbDev->common.module);
1642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
1652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    ALOGD("%s: Doing Dpy=%d, blank=%d", __FUNCTION__, dpy, blank);
1662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(dpy) {
1672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
1682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(blank) {
1692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ctx->mOverlay->setState(ovutils::OV_CLOSED);
1702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_POWERDOWN);
1712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            } else {
1722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_UNBLANK);
1732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            }
1742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
1752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
1762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            if(blank) {
1772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                //TODO actual
1782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            } else {
1792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            }
1802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
1812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
1822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
1832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
1842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if(ret < 0) {
1862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        ALOGE("%s: failed. Dpy=%d, blank=%d : %s",
1872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                __FUNCTION__, dpy, blank, strerror(errno));
1882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        return ret;
189660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
1902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    ALOGD("%s: Done Dpy=%d, blank=%d", __FUNCTION__, dpy, blank);
1912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    ctx->dpyAttr[dpy].isActive = !blank;
192660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    return 0;
193660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
194660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
195660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
1961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
1971589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
1981589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1991589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
2001589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ctx->mFbDev->common.module);
2012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
2021589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
2031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
2041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
2051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
2061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
2071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
2082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_VSYNC_PERIOD: //Not used for hwc > 1.1
20921fe85b5b8212ac43d81f5db4b2b30f71ac048e2Saurabh Shah        value[0] = m->fps;
2101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGI("fps: %d", value[0]);
2111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
2122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
2132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //Enable later
2142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //if(ctx->mMDP.hasOverlay)
2152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            //supported |= HWC_DISPLAY_EXTERNAL_BIT;
2162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        value[0] = supported;
2172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        break;
2181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
2191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
2201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
2211589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
2221589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
2231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
2241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
2252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
2262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if (LIKELY(list && list->numHwLayers)) {
2272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        VideoOverlay::draw(ctx, list, HWC_DISPLAY_PRIMARY);
2282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        MDPComp::draw(ctx, list);
2292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_sync(ctx, list, HWC_DISPLAY_PRIMARY);
2302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
2312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        //always. Last layer is always FB
2322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
2332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        if(list->hwLayers[last].compositionType == HWC_FRAMEBUFFER_TARGET) {
2342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ctx->mFbDev->post(ctx->mFbDev, list->hwLayers[last].handle);
2352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
2362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
2382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
2392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
2402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
2412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_display_contents_1_t* list) {
2422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if (LIKELY(list && list->numHwLayers)) {
2432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        hwc_sync(ctx, list, HWC_DISPLAY_EXTERNAL);
2442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t last = list->numHwLayers - 1;
2452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        if(list->hwLayers[last].compositionType == HWC_FRAMEBUFFER_TARGET &&
2462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive) {
2472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            //ctx->mExtDisplay->post(list->hwLayers[last].handle);
2482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
2492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
2512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
2522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
253660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
254660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
255660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
256befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
257befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
258befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
2592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (uint32_t i = 0; i < numDisplays; i++) {
260660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
2612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch(i) {
2622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_PRIMARY:
2632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_primary(ctx, list);
2642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            case HWC_DISPLAY_EXTERNAL:
2652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = hwc_set_external(ctx, list);
2662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            default:
2672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                ret = -EINVAL;
268660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
2692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
2702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if(!ctx->overlayInUse)
2712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        ctx->mOverlay->setState(ovutils::OV_CLOSED);
2722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
2732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return ret;
2742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
275ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
2762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
2772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t* configs, size_t* numConfigs) {
2782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int ret = 0;
2792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
2802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
2812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if(*numConfigs == 1)
2822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *configs = 0;
2832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch(disp) {
2842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_PRIMARY:
2852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ret = 0;
2862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
2872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_EXTERNAL:
2882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            //Hack until hotplug is supported.
2892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            //This makes framework ignore external display.
2902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ret = -1;
2912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
292660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
293befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
294befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
295befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
2962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
2972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
3002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //From HWComposer
3012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
3022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
3032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_WIDTH,
3042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_HEIGHT,
3052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_X,
3062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_DPI_Y,
3072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
3082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    };
3092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
3102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
3112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
3122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
3132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
3142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        switch (attributes[i]) {
3152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
3162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
3172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_WIDTH:
3192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
3202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGD("%s width = %d",__FUNCTION__, ctx->dpyAttr[disp].xres);
3212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_HEIGHT:
3232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
3242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGD("%s height = %d",__FUNCTION__, ctx->dpyAttr[disp].yres);
3252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_X:
3272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].xdpi;
3282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        case HWC_DISPLAY_DPI_Y:
3302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            values[i] = ctx->dpyAttr[disp].ydpi;
3312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
3322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        default:
3332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            ALOGE("Unknown display attribute %d",
3342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                    attributes[i]);
3352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            return -EINVAL;
3362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        }
3372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
3382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return 0;
3392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
3402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
341befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
342befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
343befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
3441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
345befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
346befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
347befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
348befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
349befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
350befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
351befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
352befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
353befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
354befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
355befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
356befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
357befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
358befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
359befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
360befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
361befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
3621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
364befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
3651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
3672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
3682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_1;
3692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
3702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.common.close        = hwc_device_close;
3712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.prepare             = hwc_prepare;
3722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.set                 = hwc_set;
3732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.eventControl        = hwc_eventControl;
3742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.blank               = hwc_blank;
3752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.query               = hwc_query;
3762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
3772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.dump                = NULL;
3782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
3792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
3802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        *device = &dev->device.common;
381befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
382befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
383befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
384befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
385