hwc.cpp revision 0ba4c1d6ac1b48697b6464f6450665836e50baeb
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 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed common: { 59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed tag: HARDWARE_MODULE_TAG, 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 2, 61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: HWC_HARDWARE_MODULE_ID, 63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "Qualcomm Hardware Composer Module", 64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "CodeAurora Forum", 65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: &hwc_module_methods, 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dso: 0, 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved: {0}, 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 71bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on 72361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their 73361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL. 74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */ 75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 76bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) { 77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive) 78361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return HWC_DISPLAY_VIRTUAL; 79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return dpy; 80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC 84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 85660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_procs_t const* procs) 87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 888eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev ALOGI("%s", __FUNCTION__); 89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!ctx) { 91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return; 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 94359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc = procs; 95359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall 96aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // Now that we have the functions needed, kick off 97aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // the uevent & vsync threads 98359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall init_uevent_thread(ctx); 99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed init_vsync_thread(ctx); 100befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 10225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper 1039f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays, 1049f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t** displays) { 1050df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 1079f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // XXX:SurfaceFlinger no longer guarantees that this 1089f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // value is reset on every prepare. However, for the layer 1099f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // cache we need to reset it. 1109f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // We can probably rethink that later on 1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if (LIKELY(list && list->numHwLayers > 1)) { 1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed for(uint32_t j = 0; j < list->numHwLayers; j++) { 1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1169f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 117640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 118640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(ctx->mFBUpdate[i]) 119640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mFBUpdate[i]->reset(); 1204019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[i]) 1214019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R ctx->mCopyBit[i]->reset(); 122bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar if(ctx->mLayerRotMap[i]) 123bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar ctx->mLayerRotMap[i]->reset(); 1242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 125f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 126f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah ctx->mAD->reset(); 1278eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah MDPComp::reset(); 1282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 1292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 13016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame 13154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 13216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(ctx->layerProp[dpy]) { 13316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed delete[] ctx->layerProp[dpy]; 13416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ctx->layerProp[dpy] = NULL; 13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 13654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 13816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 139eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shahstatic void handleGeomChange(hwc_context_t *ctx, int dpy, 140eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah hwc_display_contents_1_t *list) { 1410ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson /* No point to calling overlay_set on MDP3 */ 1420ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson if(list->flags & HWC_GEOMETRY_CHANGED && 1430ba4c1d6ac1b48697b6464f6450665836e50baebTerence Hampson ctx->mMDP.version >= qdutils::MDP_V4_0) { 144eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah ctx->mOverlay->forceSet(dpy); 145eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah } 146eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah} 147eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah 1482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 1503156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 152640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 15354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 15454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 15554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 156eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 157074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah uint32_t last = list->numHwLayers - 1; 1586e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1596e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah if(fbLayer->handle) { 160640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah setListStats(ctx, list, dpy); 161c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 162c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed ctx->mVPUClient->prepare(ctx, list); 163c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah const int fbZ = 0; 166699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 167699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 1689ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson if (ctx->mMDP.version < qdutils::MDP_V4_0) { 169699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(ctx->mCopyBit[dpy]) 1709ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1719ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson } 1722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 1752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 1762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 1772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 178361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 1793156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 1802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 181361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 18276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 18354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 18554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 18654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 187eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 18876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 18954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 19090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 19190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(fbLayer->handle) { 192361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isConfiguring = false; 19390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar setListStats(ctx, list, dpy); 194699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 195699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah const int fbZ = 0; 196699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 197699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 198f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 199a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(ctx->listStats[dpy].isDisplayAnimating) { 200a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // Mark all app layers as HWC_OVERLAY for external during 201a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // animation, so that SF doesnt draw it on FB 202a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 203a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan hwc_layer_1_t *layer = &list->hwLayers[i]; 204a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan layer->compositionType = HWC_OVERLAY; 205a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 206a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } 20890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 20990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // External Display is in Pause state. 21090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // ToDo: 21190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // Mark all application layers as OVERLAY so that 21290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // GPU will not compose. This is done for power 21390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // optimization 21476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 2152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 21725322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 21825322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 219361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev, 220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 2213156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 224361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_VIRTUAL; 225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 226361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if (LIKELY(list && list->numHwLayers > 1) && 227361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isActive && 228361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].connected) { 229361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 230eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 231361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran uint32_t last = list->numHwLayers - 1; 232361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 233361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!ctx->dpyAttr[dpy].isPause) { 234361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(fbLayer->handle) { 235361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isConfiguring = false; 236361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran setListStats(ctx, list, dpy); 237361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 238361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int fbZ = 0; 239361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 240361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 241361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 242361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->listStats[dpy].isDisplayAnimating) { 243361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Mark all app layers as HWC_OVERLAY for virtual during 244361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // animation, so that SF doesnt draw it on FB 245361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 246361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 247361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran layer->compositionType = HWC_OVERLAY; 248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 250361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 251361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else { 252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Virtual Display is in Pause state. 253361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // ToDo: 254361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Mark all application layers as OVERLAY so that 255361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // GPU will not compose. This is done for power 256361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // optimization 257361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 258361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 259361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return 0; 260361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 261361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 262361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 263660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 264660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 2662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 267befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 2687351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 2691a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 2709f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed reset(ctx, numDisplays, displays); 271bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 27247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 273327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 27476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 27576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 27611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 277bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 27890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (int32_t i = numDisplays; i >= 0; i--) { 27916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 280bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 281361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 28216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 28316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 28416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 28516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 286361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 287361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 28890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 289361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_virtual(dev, list); 29016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 29116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 29216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 293befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 294befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 29547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 296640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 297327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 29876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 299327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 3002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 301befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 302befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 303660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 30455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 3051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3063156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 3081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 3101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 3124267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 31355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 31410d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 31555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 316dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 31755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 318dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 319f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 320a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 321a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 3221a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 323a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 324a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // will be used in hwc_video::configure to disable 325a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // rotation animation on external display 326a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 327a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 328a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 329f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 3301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 3321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 3331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 3341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 3351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 336660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 337660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 33804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 3391ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 340c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 3411a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 342361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 343bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 344bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* In case of non-hybrid WFD session, we are fooling SF by 345bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * piggybacking on HDMI display ID for virtual. 346bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 347bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * of Google API's. 348bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 349bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal dpy = getDpyforExternalDisplay(ctx,dpy); 350bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 351f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 35255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 353905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 354905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 355905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 356905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 357905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 358905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 359905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 36076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::clear(); 361905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 3622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 363361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK; 365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to handle blank event(%d) for Primary!!", 367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, blank ); 368361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -1; 369361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 370361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 371361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!blank) { 372361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Enable HPD here, as during bootup unblank is called 373361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 374361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 375361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 376361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 377bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 378bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 379bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(ctx->mVirtualonExtActive) { 380bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* if mVirtualonExtActive is true, display hal will 381bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * receive unblank calls for non-hybrid WFD solution 382bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * since we piggyback on HDMI. 383bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 384bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal of Google API's */ 385bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal break; 386bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal } 387bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal case HWC_DISPLAY_VIRTUAL: 388bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* There are two ways to reach this block of code. 389bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 390bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL 391bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and ctx->mVirtualonExtActive is true. In this case, non-hybrid 392bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD is active. If so, getDpyforExternalDisplay will return dpy 393bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal as HWC_DISPLAY_VIRTUAL. 394bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 395bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_PRIMARY 396bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and since SF is not aware of VIRTUAL DISPLAY being handle by HWC, 397bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal it wont send blank / unblank events for it. We piggyback on 398bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal PRIMARY DISPLAY events to release mdp pipes and 399bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal activate/deactivate VIRTUAL DISPLAY. 400bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 401bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: This separate case statement is not needed once we have 402bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD client working on top of Google API's. 403bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 404bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 405361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 406361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 407bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) { 4088f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar int dpy = HWC_DISPLAY_VIRTUAL; 4098f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4108f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for virtual!", __FUNCTION__); 4118f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4128f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 4138f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 414361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 415361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 416361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 417361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 418361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(blank) { 4198f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4208f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for external!", __FUNCTION__); 4218f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4228f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 423361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 424bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 425361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 426361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 427361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 428660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 42955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 430f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 431361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran blank ? "blanking":"unblanking", dpy); 4328f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 433660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 434660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 435660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 4361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 4371589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 4381589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 4392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 4401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 4421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 4431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 4441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 4451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 4462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 44776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(ctx->mMDP.hasOverlay) 44876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 4492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 4502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 4511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 4531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 4551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4571589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 458c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 46004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4613475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 462640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 463e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 46476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 46576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4664019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 46704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 4684019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 46904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 470e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 471e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 472f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 473c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 474c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 475c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 476c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 478327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 47916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 48016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 481c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 482c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed ctx->mVPUClient->draw(ctx, list); 483c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 48416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 4852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 4862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 48754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 48804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed if(copybitDone) { 48904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 49004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 49154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 49254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 49354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 49454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 49554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 49616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 4972a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 498c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 499bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, 500bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[dpy].roi)) { 5018f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 50250c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 5032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 505a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 506a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5073475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 5102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 511361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 51204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 51304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 5143475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 51576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 516361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 517361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 518361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 519e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 5204d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 5214d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 5224d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar uint32_t last = list->numHwLayers - 1; 5234d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5244d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 5254d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 5264d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 5274d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 52876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5294d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 5304d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 53176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5324d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 5334d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 5344d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 535eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 5364d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 5374d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 5384d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5394d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 54004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 5414d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 5424d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 5434d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5444d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 5454d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 5464d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 5474d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 5484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 5494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 5504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 5514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 5534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 5544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 5554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5563475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 5573475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 558c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5598f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 5608f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 56154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 5622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 564a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 565a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5663475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 569361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_set_virtual(hwc_context_t *ctx, 570361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 571361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{ 572361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ATRACE_CALL(); 573361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0; 5749730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi 575361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_VIRTUAL; 576361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5779730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi 578361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 5799730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ctx->dpyAttr[dpy].connected && 5809730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi !ctx->dpyAttr[dpy].isPause) { 5819730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi uint32_t last = list->numHwLayers - 1; 5829730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5839730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi int fd = -1; //FenceFD from the Copybit(valid in async mode) 5849730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi bool copybitDone = false; 5859730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(ctx->mCopyBit[dpy]) 5869730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 587361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5889730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(list->numHwLayers > 1) 5899730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_sync(ctx, list, dpy, fd); 590361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 591361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Dump the layers for virtual 592361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->mHwcDebug[dpy]) 593361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mHwcDebug[dpy]->dumpLayers(list); 594361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5959730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 5969730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ALOGE("%s: MDPComp draw failed", __FUNCTION__); 5979730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ret = -1; 5989730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } 599361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6009730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi int extOnlyLayerIndex = 6019730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ctx->listStats[dpy].extOnlyLayerIndex; 602361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6039730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 6049730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(extOnlyLayerIndex!= -1) { 6059730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 6069730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hnd = (private_handle_t *)extLayer->handle; 6079730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } else if(copybitDone) { 6089730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 6099730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } 610361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6119730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(hnd && !isYuvBuffer(hnd)) { 6129730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 6139730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 6149730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ret = -1; 615361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 616361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 617361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 6188f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 6198f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 620361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = -1; 621361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 622361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 623361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 624361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran closeAcquireFds(list); 625361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 626bf5438200b5c0cf81cb008481e951760df83b161Dileep Kumar Reddi if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) { 627361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // SF assumes HWC waits for the acquire fence and returns a new fence 628361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // that signals when we're done. Since we don't wait, and also don't 629361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // touch the buffer, we can just handle the acquire fence back to SF 630361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // as the retire fence. 631361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran list->retireFenceFd = list->outbufAcquireFenceFd; 632361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 633361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 634361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return ret; 635361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 636361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 637361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 638660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 639660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 640660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 641befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 642befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 643befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 64490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (uint32_t i = 0; i <= numDisplays; i++) { 645660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 646bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 6482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 6492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 65076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 652361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 653361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 65490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 655361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_virtual(ctx, list); 65676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 6582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 659660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 6602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 66195eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 66295eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 66395eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 66433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 66556d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 6667351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 6671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 6682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 6692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 670ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 6712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 6722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 6732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 67476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 675bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 68076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 68176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 68276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 68376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 68476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 6862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 6870df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 68876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 6890df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 69076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 69176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 69276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 69376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 69476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 69576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 6962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 697660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 698befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 699befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 700befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 7032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 705bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7060df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 707361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 70876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 70976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 71076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 7222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 7232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 7252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 7262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 7272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 7282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 73176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 73276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 73676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 7382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 74079e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 74379e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 7442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 7492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 7522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 7532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 75493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 75593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 75693138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7571a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 758a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 759a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 760a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 761a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 7620df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 763f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 764f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 766a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 767a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 768a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 769327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 7704762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 771327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 772a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 77393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 77493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 775befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 776befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 777befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 7781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 779befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 780befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 781befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 782befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 783befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 784befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 785befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 786befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 787befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 788befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 789befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 790befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 791befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 792befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 793befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 794befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 795befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 7961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 7971589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 798befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 7991589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8001589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 8012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 80212a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed dev->device.common.version = HWC_DEVICE_API_VERSION_1_2; 8032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 8042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 8052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 8062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 8072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 8082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 8092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 8102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 81193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 8122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 8132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 8142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 815befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 816befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 817befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 818befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 819