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