hwc.cpp revision 56f610dd235b577725198e9341caae92379fdf23
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License.
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <fcntl.h>
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <errno.h>
2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <cutils/log.h>
2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <cutils/atomic.h>
2372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <EGL/egl.h>
2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <overlay.h>
2672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <fb_priv.h>
2796c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed#include <mdp_version.h>
2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "hwc_utils.h"
2972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include "hwc_qbuf.h"
30f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#include "hwc_video.h"
310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include "hwc_uimirror.h"
3231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include "hwc_copybit.h"
3356f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "external.h"
347c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed#include "hwc_mdpcomp.h"
354c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed#include "hwc_extonly.h"
3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedusing namespace qhwc;
3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                           const char* name,
4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                           struct hw_device_t** device);
4229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    open: hwc_device_open
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    common: {
4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        tag: HARDWARE_MODULE_TAG,
5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        version_major: 2,
5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        version_minor: 0,
5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        name: "Qualcomm Hardware Composer Module",
5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        author: "CodeAurora Forum",
5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        methods: &hwc_module_methods,
5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dso: 0,
5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        reserved: {0},
5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Save callback functions registered to HWC
6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
645b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                              hwc_procs_t const* procs)
6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
6829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(!ctx) {
6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return;
7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
723be78d9816da84e48a40232165189f9deb16808fJesse Hall    ctx->proc = procs;
733be78d9816da84e48a40232165189f9deb16808fJesse Hall
743be78d9816da84e48a40232165189f9deb16808fJesse Hall    // don't start listening for events until we can do something with them
753be78d9816da84e48a40232165189f9deb16808fJesse Hall    init_uevent_thread(ctx);
7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
785b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
795b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                       hwc_display_contents_1_t** displays)
8029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
8129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
82f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    ctx->overlayInUse = false;
83f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
8456f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //reset for this draw round
8556f610dd235b577725198e9341caae92379fdf23Saurabh Shah    VideoOverlay::reset();
8656f610dd235b577725198e9341caae92379fdf23Saurabh Shah    ExtOnly::reset();
8756f610dd235b577725198e9341caae92379fdf23Saurabh Shah    UIMirrorOverlay::reset();
8856f610dd235b577725198e9341caae92379fdf23Saurabh Shah
8956f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //If securing of h/w in progress skip comp using overlay.
9056f610dd235b577725198e9341caae92379fdf23Saurabh Shah    if(ctx->mSecuring == true) return 0;
9156f610dd235b577725198e9341caae92379fdf23Saurabh Shah
929171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah    for (uint32_t i = 0; i < numDisplays; i++) {
939171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah        hwc_display_contents_1_t *list = displays[i];
945b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        //XXX: Actually handle the multiple displays
959171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah        if (LIKELY(list && list->numHwLayers)) {
969171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah            ctx->dpys[i] = list->dpy;
975b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed
989171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah            if(ctx->isPoweredDown)
999171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah                ALOGW("SF called %s after a POWERDOWN", __FUNCTION__);
1009171ec698c218df6eec5c91fe438f8b5ae4ff79fSaurabh Shah
1015b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            getLayerStats(ctx, list);
1025b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            if(VideoOverlay::prepare(ctx, list)) {
1035b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->overlayInUse = true;
1045b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                //Nothing here
1055b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            } else if(ExtOnly::prepare(ctx, list)) {
1065b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->overlayInUse = true;
1075b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            } else if(UIMirrorOverlay::prepare(ctx, list)) {
1085b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->overlayInUse = true;
1095b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            } else if(MDPComp::configure(dev, list)) {
1105b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->overlayInUse = true;
1115b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            } else if (0) {
1125b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                //Other features
1135b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->overlayInUse = true;
1145b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            } else { // Else set this flag to false, otherwise video cases
1155b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                // fail in non-overlay targets.
1165b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->overlayInUse = false;
1175b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            }
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
11929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
1200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return 0;
12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1245b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
12572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed                             int event, int enabled)
12672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{
12772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    int ret = 0;
12872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
12972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
13072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed                ctx->mFbDev->common.module);
1315b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    //XXX: Handle dpy
13272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    switch(event) {
13372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        case HWC_EVENT_VSYNC:
13472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed            if(ioctl(m->framebuffer->fd, MSMFB_OVERLAY_VSYNC_CTRL, &enabled) < 0)
13572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed                ret = -errno;
136f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed
137f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed            if(ctx->mExtDisplay->getExternalDisplay()) {
138f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed                ret = ctx->mExtDisplay->enableHDMIVsync(enabled);
139f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed            }
14072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed           break;
14172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        default:
14272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed            ret = -EINVAL;
14372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    }
14472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    return ret;
14572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
14672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
1475b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
1485b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed{
1495b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    //XXX: Handle based on dpy
150934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
151934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
152934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed        ctx->mFbDev->common.module);
1535b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    if(blank) {
1545b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        ctx->mOverlay->setState(ovutils::OV_CLOSED);
1555b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        ctx->qbuf->unlockAllPrevious();
156aa537df10d8350d20b9a1bfed8d3f73104634d73Saurabh Shah        ALOGD("HWC Calling POWERDOWN ...");
157934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed        ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_POWERDOWN);
15880692ef5648ecd21ad24c505a8ee6a364e4084fdIliyan Malchev        ALOGD("HWC Done POWERDOWN ...");
159aa537df10d8350d20b9a1bfed8d3f73104634d73Saurabh Shah        ctx->isPoweredDown = true;
160934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed    } else {
161aa537df10d8350d20b9a1bfed8d3f73104634d73Saurabh Shah        ALOGD("HWC Calling UNBLANK ...");
162934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed        ioctl(m->framebuffer->fd, FBIOBLANK, FB_BLANK_UNBLANK);
16380692ef5648ecd21ad24c505a8ee6a364e4084fdIliyan Malchev        ALOGD("HWC Done UNBLANK ...");
164aa537df10d8350d20b9a1bfed8d3f73104634d73Saurabh Shah        ctx->isPoweredDown = false;
1655b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    }
1665b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    return 0;
1675b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed}
1685b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed
1695b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
17072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed                     int param, int* value)
17172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{
17272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
17372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    private_module_t* m = reinterpret_cast<private_module_t*>(
17472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        ctx->mFbDev->common.module);
17572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
17672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    switch (param) {
17772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
17872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        // Not supported for now
17972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        value[0] = 0;
18072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        break;
18172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    case HWC_VSYNC_PERIOD:
1822e2798c71ad66cef2bd82967058c88f85d3501a8Saurabh Shah        value[0] = m->fps;
18372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        ALOGI("fps: %d", value[0]);
18472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        break;
18572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    default:
18672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        return -EINVAL;
18772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    }
18872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    return 0;
18972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
19072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
19172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
1925b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
1935b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                   size_t numDisplays,
1945b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                   hwc_display_contents_1_t** displays)
19529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
19629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int ret = 0;
19729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
1985b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    for (uint32_t i = 0; i <numDisplays; i++) {
1995b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
2005b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        //XXX: Actually handle the multiple displays
2015b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        if (LIKELY(list)) {
2025b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            VideoOverlay::draw(ctx, list);
2035b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            ExtOnly::draw(ctx, list);
2045b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            MDPComp::draw(ctx, list);
2055b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            EGLBoolean success = eglSwapBuffers((EGLDisplay)list->dpy,
2065b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                                                (EGLSurface)list->sur);
207fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah            wait4fbPost(ctx);
208fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah            //Can draw to HDMI only when fb_post is reached
2095b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            UIMirrorOverlay::draw(ctx);
210fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah            //HDMI commit and primary commit (PAN) happening in parallel
2115b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            if(ctx->mExtDisplay->getExternalDisplay())
2125b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                ctx->mExtDisplay->commit();
213fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah            //Virtual barrier for threads to finish
214fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah            wait4Pan(ctx);
2155b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        } else {
2165b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            ctx->mOverlay->setState(ovutils::OV_CLOSED);
21783523d815791832a90cd689d1796522589ade7feSaurabh Shah            ctx->qbuf->unlockAll();
2185b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        }
219f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
2205b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        if(!ctx->overlayInUse)
2215b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed            ctx->mOverlay->setState(ovutils::OV_CLOSED);
2225b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    }
223df727717e8430a4ea2252747f15d40dfe07d0737Saurabh Shah    ctx->qbuf->unlockAllPrevious();
22429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return ret;
22529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
22629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
22729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
22829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
22929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(!dev) {
23072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
23129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return -1;
23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
23329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    closeContext((hwc_context_t*)dev);
23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    free(dev);
23529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return 0;
23729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
24029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                           struct hw_device_t** device)
24129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
24229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int status = -EINVAL;
24329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
24429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
24529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        struct hwc_context_t *dev;
24629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
24729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        memset(dev, 0, sizeof(*dev));
24872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
24972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        //Initialize hwc context
25029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        initContext(dev);
25172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
25272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        //Setup HWC methods
25329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev->device.common.tag     = HARDWARE_DEVICE_TAG;
2545b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        dev->device.common.version = HWC_DEVICE_API_VERSION_1_0;
25529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev->device.common.module  = const_cast<hw_module_t*>(module);
25629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev->device.common.close   = hwc_device_close;
25729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev->device.prepare        = hwc_prepare;
25829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev->device.set            = hwc_set;
2593be78d9816da84e48a40232165189f9deb16808fJesse Hall        dev->device.eventControl   = hwc_eventControl;
2603be78d9816da84e48a40232165189f9deb16808fJesse Hall        dev->device.blank          = hwc_blank;
26172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        dev->device.query          = hwc_query;
2623be78d9816da84e48a40232165189f9deb16808fJesse Hall        dev->device.registerProcs  = hwc_registerProcs;
26329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        *device                    = &dev->device.common;
26429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        status = 0;
26529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
26629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return status;
26729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
268