hwc.cpp revision 25322c7f78dfeb2c9c441dc0720dba6c639b198c
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"
291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include "hwc_qbuf.h"
30ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed#include "hwc_video.h"
31ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include "hwc_uimirror.h"
32bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#include "hwc_copybit.h"
33bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h"
355d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed#include "hwc_extonly.h"
36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc;
38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           const char* name,
41befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device);
42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    open: hwc_device_open
45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    common: {
49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        tag: HARDWARE_MODULE_TAG,
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_major: 2,
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        version_minor: 0,
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        name: "Qualcomm Hardware Composer Module",
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        author: "CodeAurora Forum",
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        methods: &hwc_module_methods,
56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dso: 0,
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        reserved: {0},
58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC
63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
64660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                              hwc_procs_t const* procs)
66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!ctx) {
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return;
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
72359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    ctx->proc = procs;
73359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall
74359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    // don't start listening for events until we can do something with them
75359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    init_uevent_thread(ctx);
76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
77befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
7825322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper
7925322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shahstatic void reset() {
8025322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    //reset for this draw round
8125322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    VideoOverlay::reset();
8225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    ExtOnly::reset();
8325322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    UIMirrorOverlay::reset();
8425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    ExtOnly::reset();
8525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    //TODO MDPComp
8625322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah}
8725322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah
88660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
89660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                       hwc_display_contents_1_t** displays)
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
92ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    ctx->overlayInUse = false;
93ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
9425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah    reset();
95bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
96bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    //If securing of h/w in progress skip comp using overlay.
97bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    if(ctx->mSecuring == true) return 0;
98bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
99ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah    for (uint32_t i = 0; i < numDisplays; i++) {
100ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah        hwc_display_contents_1_t *list = displays[i];
101660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        //XXX: Actually handle the multiple displays
102ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah        if (LIKELY(list && list->numHwLayers)) {
103ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah            ctx->dpys[i] = list->dpy;
104660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
105ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah            if(ctx->isPoweredDown)
106ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah                ALOGW("SF called %s after a POWERDOWN", __FUNCTION__);
107ade7461cd279f0ca3806e35a38862f2ef4fe8563Saurabh Shah
108660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            getLayerStats(ctx, list);
109660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            if(VideoOverlay::prepare(ctx, list)) {
110660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->overlayInUse = true;
111660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                //Nothing here
112660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            } else if(ExtOnly::prepare(ctx, list)) {
113660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->overlayInUse = true;
114660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            } else if(UIMirrorOverlay::prepare(ctx, list)) {
115660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->overlayInUse = true;
116660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            } else if(MDPComp::configure(dev, list)) {
117660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->overlayInUse = true;
118660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            } else if (0) {
119660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                //Other features
120660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->overlayInUse = true;
121660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            } else { // Else set this flag to false, otherwise video cases
122660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                // fail in non-overlay targets.
123660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->overlayInUse = false;
124660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            }
125befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        }
126befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
127ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
128befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
129befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
130befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
131660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
1321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                             int event, int enabled)
1331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
1341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int ret = 0;
1351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
1371589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                ctx->mFbDev->common.module);
138660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    //XXX: Handle dpy
1391589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch(event) {
1401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        case HWC_EVENT_VSYNC:
1411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            if(ioctl(m->framebuffer->fd, MSMFB_OVERLAY_VSYNC_CTRL, &enabled) < 0)
1421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                ret = -errno;
143080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed
144080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            if(ctx->mExtDisplay->getExternalDisplay()) {
145080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed                ret = ctx->mExtDisplay->enableHDMIVsync(enabled);
146080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            }
1471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed           break;
1481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        default:
1491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            ret = -EINVAL;
1501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
1511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return ret;
1521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
1531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
154660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
155660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{
156660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    //XXX: Handle based on dpy
1571ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1581ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
1591ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed        ctx->mFbDev->common.module);
160660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    if(blank) {
161660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        ctx->mOverlay->setState(ovutils::OV_CLOSED);
162660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        ctx->qbuf->unlockAllPrevious();
1631e396eddac16f39d5bd09dc9f6f8a704b468c2d3Saurabh Shah        ALOGD("HWC Calling POWERDOWN ...");
1641ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed        ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_POWERDOWN);
165d90585de4fc3946815c846ee97385d8b0183cf54Iliyan Malchev        ALOGD("HWC Done POWERDOWN ...");
1661e396eddac16f39d5bd09dc9f6f8a704b468c2d3Saurabh Shah        ctx->isPoweredDown = true;
1671ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed    } else {
1681e396eddac16f39d5bd09dc9f6f8a704b468c2d3Saurabh Shah        ALOGD("HWC Calling UNBLANK ...");
1691ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed        ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_UNBLANK);
170d90585de4fc3946815c846ee97385d8b0183cf54Iliyan Malchev        ALOGD("HWC Done UNBLANK ...");
1711e396eddac16f39d5bd09dc9f6f8a704b468c2d3Saurabh Shah        ctx->isPoweredDown = false;
172660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
173660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    return 0;
174660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed}
175660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed
176660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
1771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                     int param, int* value)
1781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
1791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
1811589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ctx->mFbDev->common.module);
1821589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
1831589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    switch (param) {
1841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
1851589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        // Not supported for now
1861589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        value[0] = 0;
1871589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
1881589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    case HWC_VSYNC_PERIOD:
18921fe85b5b8212ac43d81f5db4b2b30f71ac048e2Saurabh Shah        value[0] = m->fps;
1901589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGI("fps: %d", value[0]);
1911589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        break;
1921589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    default:
1931589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return -EINVAL;
1941589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
1951589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return 0;
1961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
1971589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
1981589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
199660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
200660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   size_t numDisplays,
201660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                   hwc_display_contents_1_t** displays)
202befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
203befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int ret = 0;
204befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
205660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    for (uint32_t i = 0; i <numDisplays; i++) {
206660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
207660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        //XXX: Actually handle the multiple displays
208660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        if (LIKELY(list)) {
209660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            VideoOverlay::draw(ctx, list);
210660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            ExtOnly::draw(ctx, list);
211660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            MDPComp::draw(ctx, list);
212660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            EGLBoolean success = eglSwapBuffers((EGLDisplay)list->dpy,
213660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                                                (EGLSurface)list->sur);
214a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah            wait4fbPost(ctx);
215a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah            //Can draw to HDMI only when fb_post is reached
216660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            UIMirrorOverlay::draw(ctx);
217a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah            //HDMI commit and primary commit (PAN) happening in parallel
218660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            if(ctx->mExtDisplay->getExternalDisplay())
219660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed                ctx->mExtDisplay->commit();
220a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah            //Virtual barrier for threads to finish
221a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah            wait4Pan(ctx);
222660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        } else {
223660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            ctx->mOverlay->setState(ovutils::OV_CLOSED);
2247eab0d105a7e7a83294bbf119d337b9246eb6979Saurabh Shah            ctx->qbuf->unlockAll();
225660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        }
226ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
227660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        if(!ctx->overlayInUse)
228660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed            ctx->mOverlay->setState(ovutils::OV_CLOSED);
229660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    }
23093fc2181d524746e8681e9c2b75d1a12f69351f6Saurabh Shah    ctx->qbuf->unlockAllPrevious();
231befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return ret;
232befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
233befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
234befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
235befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
236befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!dev) {
2371589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
238befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return -1;
239befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
240befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    closeContext((hwc_context_t*)dev);
241befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    free(dev);
242befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
243befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return 0;
244befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
245befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
246befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
247befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed                           struct hw_device_t** device)
248befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{
249befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int status = -EINVAL;
250befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
251befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
252befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        struct hwc_context_t *dev;
253befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
254befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        memset(dev, 0, sizeof(*dev));
2551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
2561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Initialize hwc context
257befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        initContext(dev);
2581589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
2591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        //Setup HWC methods
260befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev->device.common.tag     = HARDWARE_DEVICE_TAG;
261660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed        dev->device.common.version = HWC_DEVICE_API_VERSION_1_0;
262befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev->device.common.module  = const_cast<hw_module_t*>(module);
263befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev->device.common.close   = hwc_device_close;
264befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev->device.prepare        = hwc_prepare;
265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        dev->device.set            = hwc_set;
266359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall        dev->device.eventControl   = hwc_eventControl;
267359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall        dev->device.blank          = hwc_blank;
2681589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        dev->device.query          = hwc_query;
269359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall        dev->device.registerProcs  = hwc_registerProcs;
270befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        *device                    = &dev->device.common;
271befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        status = 0;
272befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
273befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return status;
274befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
275