1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2010 The Android Open Source Project 3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are retained 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * for attribution purposes only. 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL) 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <fcntl.h> 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <errno.h> 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/log.h> 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/atomic.h> 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <EGL/egl.h> 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Trace.h> 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/ioctl.h> 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlay.h> 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlayRotator.h> 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlayWriteback.h> 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <mdp_version.h> 33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_utils.h" 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_fbupdate.h" 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_mdpcomp.h" 36a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_dump_layers.h" 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "external.h" 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_copybit.h" 39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_ad.h" 40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "profiler.h" 41a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_virtual.h" 42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qhwc; 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay; 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define VSYNC_DEBUG 0 47adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed#define POWER_MODE_DEBUG 1 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_device_open(const struct hw_module_t* module, 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const char* name, 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct hw_device_t** device); 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic struct hw_module_methods_t hwc_module_methods = { 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson open: hwc_device_open 55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; 56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 57a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void reset_panel(struct hwc_composer_device_1* dev); 58a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonhwc_module_t HAL_MODULE_INFO_SYM = { 60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson common: { 61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tag: HARDWARE_MODULE_TAG, 62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson version_major: 2, 63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson version_minor: 0, 64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson id: HWC_HARDWARE_MODULE_ID, 65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson name: "Qualcomm Hardware Composer Module", 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson author: "CodeAurora Forum", 67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson methods: &hwc_module_methods, 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dso: 0, 69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson reserved: {0}, 70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; 72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 73a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on 74a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * HDMI display ID for virtual. This helper is needed to differentiate their 75a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * paths in HAL. 76a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * TODO: Not needed once we have WFD client working on top of Google API's */ 77a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 78a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) { 79a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive) 80a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return HWC_DISPLAY_VIRTUAL; 81a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return dpy; 82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 83a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Save callback functions registered to HWC 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_procs_t const* procs) 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGI("%s", __FUNCTION__); 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!ctx) { 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Invalid context", __FUNCTION__); 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->proc = procs; 97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Now that we have the functions needed, kick off 99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // the uevent & vsync threads 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson init_uevent_thread(ctx); 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson init_vsync_thread(ctx); 102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 104b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void setPaddingRound(hwc_context_t *ctx, int numDisplays, 105b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t** displays) { 106a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->isPaddingRound = false; 107b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal for(int i = 0; i < numDisplays; i++) { 108b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t *list = displays[i]; 109b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 110b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if((ctx->mPrevHwLayerCount[i] == 1 or 111b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->mPrevHwLayerCount[i] == 0) and 112b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal (list->numHwLayers > 1)) { 113b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal /* If the previous cycle for dpy 'i' has 0 AppLayers and the 114b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal * current cycle has atleast 1 AppLayer, padding round needs 115b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal * to be invoked in current cycle on all the active displays 116b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal * to free up the resources. 117b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal */ 118b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->isPaddingRound = true; 119b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 120b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers; 121b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } else { 122b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->mPrevHwLayerCount[i] = 0; 123b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 124b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 125b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal} 126b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 127b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal/* Based on certain conditions, isPaddingRound will be set 128b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal * to make this function self-contained */ 129b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void setDMAState(hwc_context_t *ctx, int numDisplays, 130b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t** displays) { 131b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 132b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if(ctx->mRotMgr->getNumActiveSessions() == 0) 133b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 134a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1354db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan for(int dpy = 0; dpy < numDisplays; dpy++) { 1364db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan hwc_display_contents_1_t *list = displays[dpy]; 137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (LIKELY(list && list->numHwLayers > 0)) { 1384db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan for(size_t layerIndex = 0; layerIndex < list->numHwLayers; 1394db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan layerIndex++) { 1404db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan if(list->hwLayers[layerIndex].compositionType != 1414db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan HWC_FRAMEBUFFER_TARGET) 142b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal { 1434db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan hwc_layer_1_t const* layer = &list->hwLayers[layerIndex]; 144b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal private_handle_t *hnd = (private_handle_t *)layer->handle; 145b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 1464a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan /* If a layer requires rotation, set the DMA state 147b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal * to BLOCK_MODE */ 148b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 1494a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if (canUseRotator(ctx, dpy) && 1504a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan has90Transform(layer) && isRotationDoable(ctx, hnd)) { 1514418482cd51e8343e7efd978ccdd17c616d1d78aRaj Kamal if(not ctx->mOverlay->isDMAMultiplexingSupported()) { 152b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if(ctx->mOverlay->isPipeTypeAttached( 153b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal overlay::utils::OV_MDP_PIPE_DMA)) 154b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->isPaddingRound = true; 155b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 156b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 157b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 158b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 159b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 1604db776587a9dfc744b00e2969a57f4b496794006Ramkumar Radhakrishnan if(dpy) { 161b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal /* Uncomment the below code for testing purpose. 162b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal Assuming the orientation value is in terms of HAL_TRANSFORM, 163b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal this needs mapping to HAL, if its in different convention */ 164b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 165b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal /* char value[PROPERTY_VALUE_MAX]; 166b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal property_get("sys.ext_orientation", value, "0"); 167b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->mExtOrientation = atoi(value);*/ 168b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 169b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if(ctx->mExtOrientation || ctx->mBufferMirrorMode) { 170b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if(ctx->mOverlay->isPipeTypeAttached( 171b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal overlay::utils::OV_MDP_PIPE_DMA)) { 172b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->isPaddingRound = true; 173b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 174b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 175b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 177b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 178b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 179b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal} 180a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 181b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays, 182b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t** displays) { 183b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 184b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal ctx->numActiveDisplays = 0; 185b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal for(int i = 0; i < numDisplays; i++) { 186b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t *list = displays[i]; 187b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* For display devices like SSD and screenrecord, we cannot 189a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * rely on isActive and connected attributes of dpyAttr to 190a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * determine if the displaydevice is active. Hence in case if 191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * the layer-list is non-null and numHwLayers > 0, we assume 192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * the display device to be active. 193a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 194a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->numActiveDisplays += 1; 195b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 196b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal } 197b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal} 198a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 199b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamalstatic void reset(hwc_context_t *ctx, int numDisplays, 200b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t** displays) { 201b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 202b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 203b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal for(int i = 0; i < numDisplays; i++) { 204b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal hwc_display_contents_1_t *list = displays[i]; 205b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal // XXX:SurfaceFlinger no longer guarantees that this 206b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal // value is reset on every prepare. However, for the layer 207b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal // cache we need to reset it. 208b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal // We can probably rethink that later on 209b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 210b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal for(size_t j = 0; j < list->numHwLayers; j++) { 211b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 212b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 213a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 214b126ad667c4b58794f6a8ab68e5439242117ba72Raj Kamal 215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 21744d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal if(ctx->mMDPComp[i]) 21844d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal ctx->mMDPComp[i]->reset(); 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mFBUpdate[i]) 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mFBUpdate[i]->reset(); 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mCopyBit[i]) 222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mCopyBit[i]->reset(); 223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mLayerRotMap[i]) 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[i]->reset(); 225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mAD->reset(); 228a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHWCVirtual) 229a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHWCVirtual->destroy(ctx, numDisplays, displays); 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 232a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy, 233a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_display_contents_1_t *list) { 2342c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi uint32_t origXres = ctx->dpyAttr[dpy].xres; 2352c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi uint32_t origYres = ctx->dpyAttr[dpy].yres; 2362c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi uint32_t newXres = ctx->dpyAttr[dpy].xres_new; 2372c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi uint32_t newYres = ctx->dpyAttr[dpy].yres_new; 2382c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi float xresRatio = (float)origXres / (float)newXres; 2392c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi float yresRatio = (float)origYres / (float)newYres; 240a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for (size_t i = 0; i < list->numHwLayers; i++) { 241a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[i]; 242a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& displayFrame = layer->displayFrame; 243a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 2444217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu uint32_t layerWidth = displayFrame.right - displayFrame.left; 2454217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu uint32_t layerHeight = displayFrame.bottom - displayFrame.top; 2464217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.left = (int)(xresRatio * (float)displayFrame.left); 2474217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.top = (int)(yresRatio * (float)displayFrame.top); 2484217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.right = (int)((float)displayFrame.left + 2494217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu (float)layerWidth * xresRatio); 2504217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.bottom = (int)((float)displayFrame.top + 2514217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu (float)layerHeight * yresRatio); 252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_display_contents_1_t *list) { 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int dpy = HWC_DISPLAY_PRIMARY; 260a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson bool fbComp = false; 261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (LIKELY(list && list->numHwLayers > 1) && 262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[dpy].isActive) { 263a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2642c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi if (ctx->dpyAttr[dpy].customFBSize && 2652c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi list->flags & HWC_GEOMETRY_CHANGED) 266a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scaleDisplayFrame(ctx, dpy, list); 267a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2684217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson setListStats(ctx, list, dpy); 270a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 271201e4c9a80c1adb32ac8271a95721aa838c4d9feNaseer Ahmed fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0); 272a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 273a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (fbComp) { 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int fbZ = 0; 2757c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) { 2767c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah ctx->mOverlay->clear(dpy); 2777c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah ctx->mLayerRotMap[dpy]->clear(); 2787c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah } 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 280a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ctx->mMDP.version < qdutils::MDP_V4_0) { 282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mCopyBit[dpy]) 283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2851b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan setGPUHint(ctx, list); 286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_display_contents_1_t *list) { 292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int dpy = HWC_DISPLAY_EXTERNAL; 295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (LIKELY(list && list->numHwLayers > 1) && 297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[dpy].isActive && 298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[dpy].connected) { 2994217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!ctx->dpyAttr[dpy].isPause) { 301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[dpy].isConfiguring = false; 302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson setListStats(ctx, list, dpy); 303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 304ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int fbZ = 0; 3057c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) 3067c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah { 3077c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah ctx->mOverlay->clear(dpy); 3087c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah ctx->mLayerRotMap[dpy]->clear(); 3097c8e00ad467f166f17072604822e4d5517f02890Saurabh Shah } 310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 312a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* External Display is in Pause state. 313a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Mark all application layers as OVERLAY so that 314a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * GPU will not compose. 315a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 316a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) { 317a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[i]; 318a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->compositionType = HWC_OVERLAY; 319a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_display_contents_1_t** displays) 327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 330a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 331a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (ctx->mPanelResetStatus) { 332a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__); 333a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson reset_panel(dev); 334a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 335a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Will be unlocked at the end of set 337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mDrawLock.lock(); 338cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain setPaddingRound(ctx, (int)numDisplays, displays); 339cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain setDMAState(ctx, (int)numDisplays, displays); 340cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain setNumActiveDisplays(ctx, (int)numDisplays, displays); 3414217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu reset(ctx, (int)numDisplays, displays); 342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay->configBegin(); 344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mRotMgr->configBegin(); 345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Writeback::configBegin(); 346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 3474217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) { 348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_display_contents_1_t *list = displays[i]; 349a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dpy = getDpyforExternalDisplay(ctx, i); 350a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson switch(dpy) { 351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_PRIMARY: 352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = hwc_prepare_primary(dev, list); 353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_EXTERNAL: 355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = hwc_prepare_external(dev, list); 356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_VIRTUAL: 358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHWCVirtual) 359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ret = ctx->mHWCVirtual->prepare(dev, list); 360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -EINVAL; 363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay->configDone(); 367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mRotMgr->configDone(); 368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Writeback::configDone(); 369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int event, int enable) 375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(event) { 380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_EVENT_VSYNC: 381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ctx->vstate.enable == enable) 382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = hwc_vsync_control(ctx, dpy, enable); 384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ret == 0) 385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->vstate.enable = !!enable; 386ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (enable)?"ENABLED":"DISABLED"); 388ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 389a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef QCOM_BSP 390a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_EVENT_ORIENTATION: 391a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY) { 392a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Locker::Autolock _l(ctx->mDrawLock); 393a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // store the primary display orientation 394a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->deviceOrientation = enable; 395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 396a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson break; 397a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 399ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -EINVAL; 400ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 404adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmedstatic int hwc_setPowerMode(struct hwc_composer_device_1* dev, int dpy, 405adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed int mode) 406ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 407ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 408ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int ret = 0, value = 0; 410a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 411adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed Locker::Autolock _l(ctx->mDrawLock); 412adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGD_IF(POWER_MODE_DEBUG, "%s: Setting mode %d on display: %d", 413adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed __FUNCTION__, mode, dpy); 414adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed 415adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed switch(mode) { 416adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed case HWC_POWER_MODE_OFF: 417adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // free up all the overlay pipes in use 418adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // when we get a blank for either display 419adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // makes sure that all pipes are freed 420adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ctx->mOverlay->configBegin(); 421adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ctx->mOverlay->configDone(); 422adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ctx->mRotMgr->clear(); 423adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // If VDS is connected, do not clear WB object as it 424adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // will end up detaching IOMMU. This is required 425adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // to send black frame to WFD sink on power suspend. 426adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // Note: With this change, we keep the WriteBack object 427adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // alive on power suspend for AD use case. 428adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed value = FB_BLANK_POWERDOWN; 429adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed break; 430adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed case HWC_POWER_MODE_DOZE: 431adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed case HWC_POWER_MODE_DOZE_SUSPEND: 432adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed value = FB_BLANK_VSYNC_SUSPEND; 433adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed break; 434adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed case HWC_POWER_MODE_NORMAL: 435adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed value = FB_BLANK_UNBLANK; 436adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed break; 437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 438adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed 439ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(dpy) { 440a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_DISPLAY_PRIMARY: 441a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 442adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGE("%s: ioctl FBIOBLANK failed for Primary with error %s" 443adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed " value %d", __FUNCTION__, strerror(errno), value); 444adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed return -errno; 445a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 446a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 447adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed if(mode == HWC_POWER_MODE_NORMAL) { 448adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed // Enable HPD here, as during bootup POWER_MODE_NORMAL is set 449a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // when SF is completely initialized 450a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->setHPD(1); 451a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 452a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 453adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF); 454adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed //Deliberate fall through since there is no explicit power mode for 455adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed //virtual displays. 456a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_DISPLAY_VIRTUAL: 457a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 458adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed const int dpy = HWC_DISPLAY_VIRTUAL; 459adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed if(mode == HWC_POWER_MODE_OFF and 460adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed (not ctx->dpyAttr[dpy].isPause)) { 461a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 462adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGE("%s: displayCommit failed for virtual", __FUNCTION__); 463ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 464ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 465ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 466adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF); 467a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 468a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson break; 469a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_DISPLAY_EXTERNAL: 470adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed if(mode == HWC_POWER_MODE_OFF) { 471a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 472adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGE("%s: displayCommit failed for external", __FUNCTION__); 473a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ret = -1; 474a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 475a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 476adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF); 477a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson break; 478a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson default: 479a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -EINVAL; 480ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 481ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 482adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGD_IF(POWER_MODE_DEBUG, "%s: Done setting mode %d on display %d", 483adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed __FUNCTION__, mode, dpy); 484a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ret; 485a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void reset_panel(struct hwc_composer_device_1* dev) 488a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 489a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int ret = 0; 490a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 491a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 492a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) { 493a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__); 494a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mPanelResetStatus = false; 495a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return; 496a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 497a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 498adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGD("%s: setting power mode off", __FUNCTION__); 499adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_OFF); 500a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (ret < 0) { 501a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: FBIOBLANK failed to BLANK: %s", __FUNCTION__, 502adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed strerror(errno)); 503a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 504a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 505adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ALOGD("%s: setting power mode normal and enabling vsync", __FUNCTION__); 506adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_NORMAL); 507a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (ret < 0) { 508a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__, 509adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed strerror(errno)); 510a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 511a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1); 512a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 513a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mPanelResetStatus = false; 514ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 515ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 516a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 517ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_query(struct hwc_composer_device_1* dev, 518ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int param, int* value) 519ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 520ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 521ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int supported = HWC_DISPLAY_PRIMARY_BIT; 522ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 523ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch (param) { 524ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BACKGROUND_LAYER_SUPPORTED: 525ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Not supported for now 526ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson value[0] = 0; 527ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 528a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_DISPLAY_TYPES_SUPPORTED: 529ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDP.hasOverlay) { 530ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson supported |= HWC_DISPLAY_VIRTUAL_BIT; 5310fdae193307fb17bb537598ab62682edd5138b72radhakrishna if(!(qdutils::MDPVersion::getInstance().is8x26() || 5323fdd1867c6a39a4397ea74370c0d895be30b0e76Prabhanjan Kandula qdutils::MDPVersion::getInstance().is8x16() || 5333fdd1867c6a39a4397ea74370c0d895be30b0e76Prabhanjan Kandula qdutils::MDPVersion::getInstance().is8x39())) 534ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson supported |= HWC_DISPLAY_EXTERNAL_BIT; 535ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 536ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson value[0] = supported; 537ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 538a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_FORMAT_RB_SWAP: 539a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson value[0] = 1; 540a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson break; 541a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_COLOR_FILL: 542a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson value[0] = 1; 543a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson break; 544ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 545ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -EINVAL; 546ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 547ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 548ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 549ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 550ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 551ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 552ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 553ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 554ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 555ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int dpy = HWC_DISPLAY_PRIMARY; 556ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 5574217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu size_t last = list->numHwLayers - 1; 558ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 559ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fd = -1; //FenceFD from the Copybit(valid in async mode) 560ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool copybitDone = false; 56180cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan 56280cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (ctx->mCopyBit[dpy]) { 56380cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (ctx->mMDP.version < qdutils::MDP_V4_0) 56480cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 56580cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan else 56680cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan fd = ctx->mMDPComp[dpy]->drawOverlap(ctx, list); 56780cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan } 56880cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan 569ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->numHwLayers > 1) 570ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_sync(ctx, list, dpy, fd); 571ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 572a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Dump the layers for primary 573a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHwcDebug[dpy]) 574a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHwcDebug[dpy]->dumpLayers(list); 575a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 576201e4c9a80c1adb32ac8271a95721aa838c4d9feNaseer Ahmed if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 577ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: MDPComp draw failed", __FUNCTION__); 578ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 579ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 580ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 581ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //TODO We dont check for SKIP flag on this layer because we need PAN 582ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //always. Last layer is always FB 583ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 584a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) { 585ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 586ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 587ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 588bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh if(isAbcInUse(ctx) == true) { 589bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh int index = ctx->listStats[dpy].renderBufIndexforABC; 590bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh hwc_layer_1_t *tempLayer = &list->hwLayers[index]; 591bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh hnd = (private_handle_t *)tempLayer->handle; 592bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh } 593bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh 594ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(hnd) { 595ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 596ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 597ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 598ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 599ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 600ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 6016f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran int lSplit = getLeftSplit(ctx, dpy); 60234a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran qhwc::ovutils::Dim lRoi = qhwc::ovutils::Dim( 6036f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].lRoi.left, 6046f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].lRoi.top, 6056f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].lRoi.right - ctx->listStats[dpy].lRoi.left, 60634a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran ctx->listStats[dpy].lRoi.bottom - ctx->listStats[dpy].lRoi.top); 6076f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 60834a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran qhwc::ovutils::Dim rRoi = qhwc::ovutils::Dim( 6096f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].rRoi.left - lSplit, 6106f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].rRoi.top, 6116f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].rRoi.right - ctx->listStats[dpy].rRoi.left, 61234a0e26b9f296c4a55f3f081d32e1abe6e1e47abJeykumar Sankaran ctx->listStats[dpy].rRoi.bottom - ctx->listStats[dpy].rRoi.top); 6136f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 6146f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, lRoi, rRoi)) { 615a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 616ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 617ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 618a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 619ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 620ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 621a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson closeAcquireFds(list); 622ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 623ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 624ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 625ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_set_external(hwc_context_t *ctx, 626a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_display_contents_1_t* list) 627ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 628ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 629ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 630a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 631ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int dpy = HWC_DISPLAY_EXTERNAL; 632ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 633a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 634ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 635a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].connected && 636a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !ctx->dpyAttr[dpy].isPause) { 6374217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu size_t last = list->numHwLayers - 1; 638ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 639ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fd = -1; //FenceFD from the Copybit(valid in async mode) 640ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool copybitDone = false; 641ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mCopyBit[dpy]) 642ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 643ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 644ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->numHwLayers > 1) 645ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_sync(ctx, list, dpy, fd); 646ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 647a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Dump the layers for external 648a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHwcDebug[dpy]) 649a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHwcDebug[dpy]->dumpLayers(list); 650a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 651ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 652ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: MDPComp draw failed", __FUNCTION__); 653ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 654ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 655ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 656a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOnlyLayerIndex = 657a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].extOnlyLayerIndex; 658a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 659ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 660a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOnlyLayerIndex!= -1) { 661a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 662a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hnd = (private_handle_t *)extLayer->handle; 663a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else if(copybitDone) { 664ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 665ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 666ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 667a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(hnd && !isYuvBuffer(hnd)) { 668ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 669ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 670ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 671ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 672ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 673ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 674a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 675a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 676ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; 677ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 678ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 679ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 680a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson closeAcquireFds(list); 681ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 682ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 683ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 684ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_set(hwc_composer_device_1 *dev, 685ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson size_t numDisplays, 686ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_display_contents_1_t** displays) 687ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 688ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 689ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 6904217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu for (int i = 0; i < (int)numDisplays; i++) { 691ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_display_contents_1_t* list = displays[i]; 692a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dpy = getDpyforExternalDisplay(ctx, i); 693a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson switch(dpy) { 694ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_PRIMARY: 695ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = hwc_set_primary(ctx, list); 696ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 697ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_EXTERNAL: 698ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = hwc_set_external(ctx, list); 699ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 700ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_VIRTUAL: 701a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHWCVirtual) 702a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ret = ctx->mHWCVirtual->set(ctx, list); 703ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 704ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 705ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -EINVAL; 706ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 707ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 708ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // This is only indicative of how many times SurfaceFlinger posts 709ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // frames to the display. 710ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson CALC_FPS(); 711ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MDPComp::resetIdleFallBack(); 712ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mVideoTransFlag = false; 713ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Was locked at the beginning of prepare 714ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mDrawLock.unlock(); 715ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 716ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 717ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 718ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 719ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t* configs, size_t* numConfigs) { 720ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 721ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 722a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson disp = getDpyforExternalDisplay(ctx, disp); 723adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed //Currently we allow only 1 config, reported as config id # 0 724adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed //This config is passed in to getDisplayAttributes. Ignored for now. 725ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(disp) { 726ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_PRIMARY: 727ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(*numConfigs > 0) { 728ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson configs[0] = 0; 729ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *numConfigs = 1; 730ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 731ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = 0; //NO_ERROR 732ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 733ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_EXTERNAL: 734a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HWC_DISPLAY_VIRTUAL: 735ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = -1; //Not connected 736a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[disp].connected) { 737ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = 0; //NO_ERROR 738ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(*numConfigs > 0) { 739ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson configs[0] = 0; 740ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *numConfigs = 1; 741ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 742ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 743ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 744ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 745ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 746ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 747ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 748ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 749a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t /*config*/, const uint32_t* attributes, int32_t* values) { 750ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 751ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 752a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson disp = getDpyforExternalDisplay(ctx, disp); 753a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 754a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 755ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 756ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 757ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 758ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //From HWComposer 759ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static const uint32_t DISPLAY_ATTRIBUTES[] = { 760ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson HWC_DISPLAY_VSYNC_PERIOD, 761ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson HWC_DISPLAY_WIDTH, 762ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson HWC_DISPLAY_HEIGHT, 763ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson HWC_DISPLAY_DPI_X, 764ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson HWC_DISPLAY_DPI_Y, 765ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson HWC_DISPLAY_NO_ATTRIBUTE, 766ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson }; 767ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 7684217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 769ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson sizeof(DISPLAY_ATTRIBUTES)[0]); 770ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 771ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 772ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch (attributes[i]) { 773ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_VSYNC_PERIOD: 774ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson values[i] = ctx->dpyAttr[disp].vsync_period; 775ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 776ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_WIDTH: 7772c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi if (ctx->dpyAttr[disp].customFBSize) 7782c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi values[i] = ctx->dpyAttr[disp].xres_new; 7792c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi else 7802c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi values[i] = ctx->dpyAttr[disp].xres; 7812c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi 782ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 7832c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi values[i]); 784ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 785ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_HEIGHT: 7862c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi if (ctx->dpyAttr[disp].customFBSize) 7872c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi values[i] = ctx->dpyAttr[disp].yres_new; 7882c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi else 7892c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi values[i] = ctx->dpyAttr[disp].yres; 790ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 7912c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi values[i]); 792ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 793ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_DPI_X: 794ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 795ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 796ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_DISPLAY_DPI_Y: 797ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 798ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 799ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 800ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Unknown display attribute %d", 801ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson attributes[i]); 802ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -EINVAL; 803ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 804ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 805ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 806ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 807ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 808ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 809ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 810ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_context_t* ctx = (hwc_context_t*)(dev); 811ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Locker::Autolock _l(ctx->mDrawLock); 812ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson android::String8 aBuf(""); 813ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 814ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 815ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 816ced6b79c3e1b60b05e2e054e709b1f9a2b6b304cNaseer Ahmed if(ctx->vstate.fakevsync) 817ced6b79c3e1b60b05e2e054e709b1f9a2b6b304cNaseer Ahmed dumpsys_log(aBuf, " Vsync is being faked!!\n"); 818a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 819ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDPComp[dpy]) 820463feeb515f0cc7454eac70ae8bb96df4b852a38Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf, ctx); 821ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 822ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char ovDump[2048] = {'\0'}; 823ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay->getDump(ovDump, 2048); 824ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dumpsys_log(aBuf, ovDump); 825ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovDump[0] = '\0'; 826ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mRotMgr->getDump(ovDump, 1024); 827ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dumpsys_log(aBuf, ovDump); 828ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovDump[0] = '\0'; 829ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(Writeback::getDump(ovDump, 1024)) { 830ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dumpsys_log(aBuf, ovDump); 831ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovDump[0] = '\0'; 832ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 833ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strlcpy(buff, aBuf.string(), buff_len); 834ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 835ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 836adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmedint hwc_getActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/) { 837adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed //Supports only the default config (0th index) for now 838adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed return 0; 839adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed} 840adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed 841adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmedint hwc_setActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/, 842adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed int index) { 843adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed //Supports only the default config (0th index) for now 844adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed return (index == 0) ? index : -EINVAL; 845adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed} 846adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed 847ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_device_close(struct hw_device_t *dev) 848ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 849ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!dev) { 850ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: NULL device pointer", __FUNCTION__); 851ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 852ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 853ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson closeContext((hwc_context_t*)dev); 854ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson free(dev); 855ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 856ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 857ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 858ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 859ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 860ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct hw_device_t** device) 861ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 862ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int status = -EINVAL; 863ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 864ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 865ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct hwc_context_t *dev; 866ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev = (hwc_context_t*)malloc(sizeof(*dev)); 867a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dev == NULL) 868a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return status; 869ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(dev, 0, sizeof(*dev)); 870ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 871ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Initialize hwc context 872ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson initContext(dev); 873ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 874ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Setup HWC methods 875ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.common.tag = HARDWARE_DEVICE_TAG; 876adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed dev->device.common.version = HWC_DEVICE_API_VERSION_1_4; 877ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.common.module = const_cast<hw_module_t*>(module); 878ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.common.close = hwc_device_close; 879ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.prepare = hwc_prepare; 880ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.set = hwc_set; 881ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.eventControl = hwc_eventControl; 882adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed dev->device.setPowerMode = hwc_setPowerMode; 883ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.query = hwc_query; 884ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.registerProcs = hwc_registerProcs; 885ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.dump = hwc_dump; 886ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 887ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 888adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed dev->device.getActiveConfig = hwc_getActiveConfig; 889adc3f5944f63cd432cc2f52790ba80e82ec98c19Naseer Ahmed dev->device.setActiveConfig = hwc_setActiveConfig; 890ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *device = &dev->device.common; 891ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status = 0; 892ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 893ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return status; 894ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 895