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