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