hwc.cpp revision c4aeb6a47160792212f22edecdf1ed45e5f575f3
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 33ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 54019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained 64019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * for attribution purposes only. 74019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * 8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License. 10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at 11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and 18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License. 19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 203156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL) 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h> 22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h> 23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h> 25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/atomic.h> 261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <EGL/egl.h> 2704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed#include <utils/Trace.h> 28c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran#include <sys/ioctl.h> 291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <overlay.h> 30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 3176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include <overlayWriteback.h> 32b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h> 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h" 3447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h" 3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h" 36c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan#include "hwc_dump_layers.h" 37bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 384019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h" 39f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h" 4095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed#include "profiler.h" 41c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#include "hwc_vpuclient.h" 42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc; 4411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 4511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0 472a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const char* name, 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device); 52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed open: hwc_device_open 55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 5727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev); 5827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed common: { 61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed tag: HARDWARE_MODULE_TAG, 62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 2, 63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: HWC_HARDWARE_MODULE_ID, 65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "Qualcomm Hardware Composer Module", 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "CodeAurora Forum", 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: &hwc_module_methods, 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dso: 0, 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved: {0}, 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 73bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on 74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their 75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL. 76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */ 77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 78bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) { 79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive) 80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return HWC_DISPLAY_VIRTUAL; 81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return dpy; 82361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 83361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 87660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_procs_t const* procs) 89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 908eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev ALOGI("%s", __FUNCTION__); 91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!ctx) { 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return; 95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 96359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc = procs; 97359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall 98aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // Now that we have the functions needed, kick off 99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // the uevent & vsync threads 100359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall init_uevent_thread(ctx); 101aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed init_vsync_thread(ctx); 102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 10425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper 1059f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays, 1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t** displays) { 1070df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 1089f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 1099f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // XXX:SurfaceFlinger no longer guarantees that this 1109f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // value is reset on every prepare. However, for the layer 1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // cache we need to reset it. 1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // We can probably rethink that later on 1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if (LIKELY(list && list->numHwLayers > 1)) { 1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed for(uint32_t j = 0; j < list->numHwLayers; j++) { 1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 1169f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 1179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1189f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 119640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 120640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(ctx->mFBUpdate[i]) 121640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mFBUpdate[i]->reset(); 1224019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[i]) 1234019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R ctx->mCopyBit[i]->reset(); 124bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar if(ctx->mLayerRotMap[i]) 125bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar ctx->mLayerRotMap[i]->reset(); 1262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 127f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 128f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah ctx->mAD->reset(); 1298eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah MDPComp::reset(); 1302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 1312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 13216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame 13354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 13416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(ctx->layerProp[dpy]) { 13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed delete[] ctx->layerProp[dpy]; 13616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ctx->layerProp[dpy] = NULL; 13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 13854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 13916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 14016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 141eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shahstatic void handleGeomChange(hwc_context_t *ctx, int dpy, 142eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah hwc_display_contents_1_t *list) { 1430ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson /* No point to calling overlay_set on MDP3 */ 1440ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson if(list->flags & HWC_GEOMETRY_CHANGED && 1450ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson ctx->mMDP.version >= qdutils::MDP_V4_0) { 146eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah ctx->mOverlay->forceSet(dpy); 147eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah } 148eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah} 149eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah 1502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 1523156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 1532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 154640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 15554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 15654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 15754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 158eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 159c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 160c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 161c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mVPUClient->prepare(ctx, list); 162c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 163c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 164c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 165c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 166c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 167c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if (ctx->mMDP.version < qdutils::MDP_V4_0) { 168c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mCopyBit[dpy]) 169c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 1732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 1742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 1752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 176361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 1773156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 1782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 179361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 18076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 18154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 18254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 18354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 185eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 18690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 187c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->dpyAttr[dpy].isConfiguring = false; 188c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 189c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 190c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 191c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 192c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 194c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->listStats[dpy].isDisplayAnimating) { 195c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah // Mark all app layers as HWC_OVERLAY for external during 196c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah // animation, so that SF doesnt draw it on FB 197c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 198c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah hwc_layer_1_t *layer = &list->hwLayers[i]; 199c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah layer->compositionType = HWC_OVERLAY; 200a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 20190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } 20290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 20390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // External Display is in Pause state. 20490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // ToDo: 20590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // Mark all application layers as OVERLAY so that 20690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // GPU will not compose. This is done for power 20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // optimization 20876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 2092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 21125322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 21225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 213361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev, 214361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 2153156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 216361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 218361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_VIRTUAL; 219361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if (LIKELY(list && list->numHwLayers > 1) && 221361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isActive && 222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].connected) { 223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 224eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!ctx->dpyAttr[dpy].isPause) { 226c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->dpyAttr[dpy].isConfiguring = false; 227c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 228c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 229c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 230c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 231c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 232361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 233c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->listStats[dpy].isDisplayAnimating) { 234c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah // Mark all app layers as HWC_OVERLAY for virtual during 235c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah // animation, so that SF doesnt draw it on FB 236c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 237c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah hwc_layer_1_t *layer = &list->hwLayers[i]; 238c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah layer->compositionType = HWC_OVERLAY; 239361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 240361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 241361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else { 242361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Virtual Display is in Pause state. 243361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // ToDo: 244361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Mark all application layers as OVERLAY so that 245361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // GPU will not compose. This is done for power 246361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // optimization 247361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return 0; 250361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 251361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 253660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 254660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 255befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 2562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 257befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 25827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 25927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ctx->mPanelResetStatus) { 26027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__); 26127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran reset_panel(dev); 26227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 26327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 2647351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 2651a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 2669f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed reset(ctx, numDisplays, displays); 267bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 26847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 269327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 27076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 27176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 27290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (int32_t i = numDisplays; i >= 0; i--) { 27316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 274bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 275361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 27616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 27716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 27816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 27916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 280361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 281361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 28290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 283361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_virtual(dev, list); 28416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 28516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 28616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 287befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 28947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 290640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 291327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 29276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 293327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 2942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 295befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 296befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 297660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 29855290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 2991589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3003156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3011589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 3021589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 3041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 30555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 3064267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 30755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 30810d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 30955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 310dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 312dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 313f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 314a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 315a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 3161a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 317a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 318a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // will be used in hwc_video::configure to disable 319a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // rotation animation on external display 320a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 321a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 322a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 323f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 3241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 3251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 3261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 3271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 3281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 3291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 330660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 331660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 33204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 3331ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 334c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 3351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 336361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 337bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 338bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* In case of non-hybrid WFD session, we are fooling SF by 339bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * piggybacking on HDMI display ID for virtual. 340bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 341bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * of Google API's. 342bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 343bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal dpy = getDpyforExternalDisplay(ctx,dpy); 344bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 345f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 34655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 347905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 348905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 349905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 350905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 351905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 352905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 353905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 35476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::clear(); 355905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 3562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK; 359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 360361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to handle blank event(%d) for Primary!!", 361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, blank ); 362361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -1; 363361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!blank) { 366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Enable HPD here, as during bootup unblank is called 367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 368361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 369361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 370361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 371bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 372bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 373bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(ctx->mVirtualonExtActive) { 374bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* if mVirtualonExtActive is true, display hal will 375bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * receive unblank calls for non-hybrid WFD solution 376bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * since we piggyback on HDMI. 377bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 378bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal of Google API's */ 379bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal break; 380bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal } 381bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal case HWC_DISPLAY_VIRTUAL: 382bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* There are two ways to reach this block of code. 383bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 384bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL 385bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and ctx->mVirtualonExtActive is true. In this case, non-hybrid 386bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD is active. If so, getDpyforExternalDisplay will return dpy 387bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal as HWC_DISPLAY_VIRTUAL. 388bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 389bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_PRIMARY 390bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and since SF is not aware of VIRTUAL DISPLAY being handle by HWC, 391bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal it wont send blank / unblank events for it. We piggyback on 392bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal PRIMARY DISPLAY events to release mdp pipes and 393bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal activate/deactivate VIRTUAL DISPLAY. 394bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 395bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: This separate case statement is not needed once we have 396bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD client working on top of Google API's. 397bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 398bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 399361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 400361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 401bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) { 4028f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar int dpy = HWC_DISPLAY_VIRTUAL; 4038f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4048f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for virtual!", __FUNCTION__); 4058f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4068f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 4078f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 408361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 409361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 410361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 411361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 412361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(blank) { 4138f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4148f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for external!", __FUNCTION__); 4158f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4168f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 417361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 418bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 419361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 420361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 421361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 422660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 42355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 424f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 425361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran blank ? "blanking":"unblanking", dpy); 4268f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 427660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 428660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 42927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev) 43027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{ 43127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran int ret = 0; 43227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 43327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 43427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (!ctx->mPanelResetStatus) 43527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran return; 43627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 43727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__); 43827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1); 43927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 44027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to BLANK: %s", __FUNCTION__, 44127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 44227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 44327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 44427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__); 44527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0); 44627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 44727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__, 44827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 44927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 45027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1); 45127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 45227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ctx->mPanelResetStatus = false; 45327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran} 45427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 45527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 456660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 4571589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 4581589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 4591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 4602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 4611589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 4631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 4641589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 4651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 4661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 4672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 46876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(ctx->mMDP.hasOverlay) 46976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 4712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 472f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan case HWC_FORMAT_RB_SWAP: 473f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan value[0] = 1; 474f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan break; 475905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan case HWC_COLOR_FILL: 476905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan value[0] = 1; 477905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan break; 4781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 4801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4811589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 4821589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4831589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 485c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 48704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4883475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 489640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 490e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 49176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 49276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4934019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 49404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 4954019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 49604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 497e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 498e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 499f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 500c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 501c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 502c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 503c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 504f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 505327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 50616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 50716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 508c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 509c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed ctx->mVPUClient->draw(ctx, list); 510c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 51116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 5122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 5132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 51454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 51504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed if(copybitDone) { 51604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 51704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 51854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 51954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 52054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 52154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 52254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 52316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 5242a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 525c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 526bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, 527bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[dpy].roi)) { 5288f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 52950c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 5302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 532a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 533a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5343475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 5372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 538361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 53904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 54004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 5413475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 54276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 543361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 544361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 545361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 546e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 5474d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 5484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 5494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar uint32_t last = list->numHwLayers - 1; 5504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 5524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 5534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 5544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 55576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 5574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 55876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 5604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 5614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 562eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 5634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 5644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 5654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 56704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 5684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 5694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 5704d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5714d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 5724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 5734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 5744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 5754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 5764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 5774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 5784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 5804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 5814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 5824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5833475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 5843475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 585c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 5878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 58854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 5892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 591a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 592a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5933475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 596361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_set_virtual(hwc_context_t *ctx, 597361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 598361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{ 599361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ATRACE_CALL(); 600361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0; 6019730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi 602361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_VIRTUAL; 603361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6049730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi 605361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 6069730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ctx->dpyAttr[dpy].connected && 6079730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi !ctx->dpyAttr[dpy].isPause) { 6089730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi uint32_t last = list->numHwLayers - 1; 6099730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 6109730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi int fd = -1; //FenceFD from the Copybit(valid in async mode) 6119730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi bool copybitDone = false; 6129730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(ctx->mCopyBit[dpy]) 6139730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 614361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6159730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(list->numHwLayers > 1) 6169730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_sync(ctx, list, dpy, fd); 617361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 618361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Dump the layers for virtual 619361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->mHwcDebug[dpy]) 620361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mHwcDebug[dpy]->dumpLayers(list); 621361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6229730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 6239730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ALOGE("%s: MDPComp draw failed", __FUNCTION__); 6249730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ret = -1; 6259730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } 626361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6279730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi int extOnlyLayerIndex = 6289730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ctx->listStats[dpy].extOnlyLayerIndex; 629361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6309730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 6319730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(extOnlyLayerIndex!= -1) { 6329730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 6339730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hnd = (private_handle_t *)extLayer->handle; 6349730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } else if(copybitDone) { 6359730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 6369730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } 637361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6389730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(hnd && !isYuvBuffer(hnd)) { 6399730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 6409730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 6419730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ret = -1; 642361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 643361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 644361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6458f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 6468f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = -1; 648361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 649361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 650361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 651361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran closeAcquireFds(list); 652361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 653bf5438200b5c0cf81cb008481e951760df83b161Dileep Kumar Reddi if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) { 654361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // SF assumes HWC waits for the acquire fence and returns a new fence 655361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // that signals when we're done. Since we don't wait, and also don't 656361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // touch the buffer, we can just handle the acquire fence back to SF 657361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // as the retire fence. 658361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran list->retireFenceFd = list->outbufAcquireFenceFd; 659361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 660361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 661361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return ret; 662361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 663361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 664361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 665660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 666660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 667660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 668befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 669befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 670befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 67190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (uint32_t i = 0; i <= numDisplays; i++) { 672660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 673bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 674361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 67776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 679361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 680361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 68190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 682361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_virtual(ctx, list); 68376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 686660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 68895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 68995eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 69095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 69133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 69256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 6933aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah if(ctx->mRotMgr->getNumActiveSessions() == 0) 6943aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 6957351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 6961a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 6972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 699ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 70376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 704bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 7062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 70976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 71076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 71176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 71276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 71376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 7160df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 71776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 7180df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 71976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 72076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 72176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 72276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 72376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 72476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 7252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 726660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 727befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 728befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 729befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 7322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 734bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7350df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 736361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 73876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 73976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 7432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 7442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 7452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 7462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 7492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 7512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 7522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 7542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 7552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 7562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 7572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 7592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 76076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 76176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 7622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 7642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 76576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 76676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 76979e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 77279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 7812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 78393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 78493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 78593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7861a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 787a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 788a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 789a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 790a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 7910df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 792f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 793f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 794f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 795a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 796a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 797a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 798327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 7994762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 800327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 801d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah ovDump[0] = '\0'; 802ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah if(Writeback::getDump(ovDump, 1024)) { 803ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah dumpsys_log(aBuf, ovDump); 804ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah ovDump[0] = '\0'; 805ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah } 806a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 80793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 80893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 809befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 810befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 811befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 8121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 813befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 814befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 815befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 816befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 817befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 818befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 819befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 820befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 821befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 822befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 823befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 824befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 825befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 826befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 827befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 828befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 829befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 8301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 832befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 8331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 8352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 8368f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_3; 8372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 8382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 8392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 8402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 8412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 8422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 8432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 8442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 84593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 8462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 8472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 8482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 849befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 850befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 851befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 852befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 853