hwc.cpp revision c439b604bcd6441e3706fdcaa5084ec58cbaf16d
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 71361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran/* In case of proprietary 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 76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int getHWCDpy(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) { 141eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah if(list->flags & HWC_GEOMETRY_CHANGED) { 142eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah ctx->mOverlay->forceSet(dpy); 143eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah } 144eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah} 145eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah 1462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 1483156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 1492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 150640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 15154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 15254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 15354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 154eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 155074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah uint32_t last = list->numHwLayers - 1; 1566e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1576e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah if(fbLayer->handle) { 158640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah setListStats(ctx, list, dpy); 159c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 160c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed ctx->mVPUClient->prepare(ctx, list); 161c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 162699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 163699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah const int fbZ = 0; 164699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 165699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 1669ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson if (ctx->mMDP.version < qdutils::MDP_V4_0) { 167699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(ctx->mCopyBit[dpy]) 1689ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1699ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson } 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); 18676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 18754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 18890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 18990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(fbLayer->handle) { 190361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isConfiguring = false; 19190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar setListStats(ctx, list, dpy); 192699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 193699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah const int fbZ = 0; 194699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 195699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 196f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 197a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(ctx->listStats[dpy].isDisplayAnimating) { 198a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // Mark all app layers as HWC_OVERLAY for external during 199a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // animation, so that SF doesnt draw it on FB 200a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 201a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan hwc_layer_1_t *layer = &list->hwLayers[i]; 202a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan layer->compositionType = HWC_OVERLAY; 203a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 204a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 20590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } 20690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 20790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // External Display is in Pause state. 20890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // ToDo: 20990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // Mark all application layers as OVERLAY so that 21090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // GPU will not compose. This is done for power 21190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // optimization 21276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 2132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 21525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 21625322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev, 218361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 2193156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 221361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_VIRTUAL; 223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 224361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if (LIKELY(list && list->numHwLayers > 1) && 225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isActive && 226361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].connected) { 227361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 228eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah handleGeomChange(ctx, dpy, list); 229361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran uint32_t last = list->numHwLayers - 1; 230361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 231361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!ctx->dpyAttr[dpy].isPause) { 232361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(fbLayer->handle) { 233361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isConfiguring = false; 234361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran setListStats(ctx, list, dpy); 235361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 236361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int fbZ = 0; 237361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 238361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 239361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 240361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->listStats[dpy].isDisplayAnimating) { 241361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Mark all app layers as HWC_OVERLAY for virtual during 242361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // animation, so that SF doesnt draw it on FB 243361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 244361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 245361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran layer->compositionType = HWC_OVERLAY; 246361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 247361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } else { 250361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Virtual Display is in Pause state. 251361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // ToDo: 252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Mark all application layers as OVERLAY so that 253361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // GPU will not compose. This is done for power 254361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // optimization 255361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 256361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 257361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return 0; 258361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 259361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 260361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 261660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 262660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 263befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 2642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 2667351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 2671a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 2689f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed reset(ctx, numDisplays, displays); 269bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 27047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 271327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 27276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 27376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 27411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 275bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 27690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (int32_t i = numDisplays; i >= 0; i--) { 27716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 278361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int dpy = getHWCDpy(ctx, i); 279361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 28016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 28116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 28216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 28316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 284361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 285361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 28690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 287361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_virtual(dev, list); 28816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 28916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 29016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 291befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 292befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 29347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 294640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 295327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 29676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 297327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 299befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 300befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 301660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 30255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 3031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3043156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 3061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 3081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 30955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 3104267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 31155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 31210d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 31355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 314dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 31555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 316dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 317f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 318a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 319a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 3201a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 321a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 322a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // will be used in hwc_video::configure to disable 323a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // rotation animation on external display 324a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 325a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 326a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 327f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 3281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 3291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 3301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 3321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 3331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 334660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 335660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 33604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 3371ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 338c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 3391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 340361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 341f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 34255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 343905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 344905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 345905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 346905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 347905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 348905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 349905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 35076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::clear(); 351905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 3522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 353361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 354361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK; 355361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 356361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to handle blank event(%d) for Primary!!", 357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, blank ); 358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -1; 359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 360361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!blank) { 362361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Enable HPD here, as during bootup unblank is called 363361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran /* Since SF is not aware of VIRTUAL DISPLAY being handle by HWC, 368361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * it wont send blank / unblank events for it. We piggyback on 369361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * PRIMARY DISPLAY events to release mdp pips and 370361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * activate/deactive VIRTUAL DISPLAY */ 371361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 372361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 3738f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(blank) { 3748f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar int dpy = HWC_DISPLAY_VIRTUAL; 3758f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 3768f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for virtual!", __FUNCTION__); 3778f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 3788f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 3798f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 380361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 381361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 382361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 383361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 384361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(blank) { 3858f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 3868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for external!", __FUNCTION__); 3878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 3888f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 389361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 390361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 391361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 392361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 393660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 39455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 395361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[dpy].isActive = !blank; 396361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 397f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran blank ? "blanking":"unblanking", dpy); 3998f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 400660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 401660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 402660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 4031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 4041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 4051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 4062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 4071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 4091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 4101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 4132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 41476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(ctx->mMDP.hasOverlay) 41576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 4162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 4172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 4181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 4201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4211589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 4221589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 425c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 42704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4283475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 429640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 430e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 43176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 43276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4334019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 43404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 4354019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 43604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 437e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 438e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 440c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 441c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 442c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 443c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 445327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 44616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 44716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 448c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 449c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed ctx->mVPUClient->draw(ctx, list); 450c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 45116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 4522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 4532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 45454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 45504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed if(copybitDone) { 45604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 45704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 45854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 45954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 46054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 46154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 46254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 46316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 4642a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 465c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4668f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4678f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 46850c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 4692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 471a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 472a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 4733475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 4742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 4752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 4762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 477361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 47804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 47904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4803475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 48176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 482361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 483361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 484361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 485e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 4864d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 4874d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 4884d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar uint32_t last = list->numHwLayers - 1; 4894d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4904d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 4914d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 4924d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 4934d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 49476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 4954d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 4964d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 49776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 4984d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 4994d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 5004d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 501eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 5024d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 5034d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 5044d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5054d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 50604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 5074d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 5084d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 5094d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5104d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 5114d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 5124d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 5134d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 5144d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 5154d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 5164d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 5174d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5184d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 5194d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 5204d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 5214d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5223475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 5233475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 524c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5258f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 5268f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 52754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 5282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 530a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 531a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5323475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 535361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int hwc_set_virtual(hwc_context_t *ctx, 536361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 537361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{ 538361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ATRACE_CALL(); 539361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0; 5409730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi 541361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_VIRTUAL; 542361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5439730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi 544361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 5459730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ctx->dpyAttr[dpy].connected && 5469730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi !ctx->dpyAttr[dpy].isPause) { 5479730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi uint32_t last = list->numHwLayers - 1; 5489730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5499730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi int fd = -1; //FenceFD from the Copybit(valid in async mode) 5509730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi bool copybitDone = false; 5519730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(ctx->mCopyBit[dpy]) 5529730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 553361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5549730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(list->numHwLayers > 1) 5559730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_sync(ctx, list, dpy, fd); 556361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 557361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Dump the layers for virtual 558361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->mHwcDebug[dpy]) 559361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mHwcDebug[dpy]->dumpLayers(list); 560361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5619730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 5629730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ALOGE("%s: MDPComp draw failed", __FUNCTION__); 5639730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ret = -1; 5649730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } 565361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5669730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi int extOnlyLayerIndex = 5679730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ctx->listStats[dpy].extOnlyLayerIndex; 568361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5699730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 5709730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(extOnlyLayerIndex!= -1) { 5719730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 5729730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hnd = (private_handle_t *)extLayer->handle; 5739730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } else if(copybitDone) { 5749730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 5759730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi } 576361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5779730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if(hnd && !isYuvBuffer(hnd)) { 5789730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 5799730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 5809730e4cbb73d6d80f647ea1f8d6705b4cf4e5c18Dileep Kumar Reddi ret = -1; 581361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 582361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 583361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 5848f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 5858f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 586361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = -1; 587361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 588361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 589361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 590361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran closeAcquireFds(list); 591361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 592bf5438200b5c0cf81cb008481e951760df83b161Dileep Kumar Reddi if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) { 593361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // SF assumes HWC waits for the acquire fence and returns a new fence 594361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // that signals when we're done. Since we don't wait, and also don't 595361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // touch the buffer, we can just handle the acquire fence back to SF 596361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // as the retire fence. 597361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran list->retireFenceFd = list->outbufAcquireFenceFd; 598361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 599361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 600361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return ret; 601361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 602361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 603361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 604660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 605660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 606660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 607befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 608befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 609befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 61090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (uint32_t i = 0; i <= numDisplays; i++) { 611660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 612361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int dpy = getHWCDpy(ctx, i); 613361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 6142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 6152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 61676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 618361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 619361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 62090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 621361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_virtual(ctx, list); 62276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 6242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 625660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 6262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 62795eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 62895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 62995eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 63033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 63156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 6327351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 6331a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 636ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 64076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 641361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran disp = getHWCDpy(ctx, disp); 6422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 6432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 6442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 6452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 64676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 64776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 64876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 64976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 65076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 6512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 6522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 6530df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 65476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 6550df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 65676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 65776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 65876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 65976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 66076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 66176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 6622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 663660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 664befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 665befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 666befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 6672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 6682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 6692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 671361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran disp = getHWCDpy(ctx, disp); 6720df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 673361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 67476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 67576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 67676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 6812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 6822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 6832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 6862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 6882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 6892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 6912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 6922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 6932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 6952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 6962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 69776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 69876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 70276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 70376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 70679e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 70979e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 72093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 72193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 72293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7231a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 724a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 725a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 726a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 727a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 7280df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 729f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 731f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 732a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 733a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 734a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 735327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 7364762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 737327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 738a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 73993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 74093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 741befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 7441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 745befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 746befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 747befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 748befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 749befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 750befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 751befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 752befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 753befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 754befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 755befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 756befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 757befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 758befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 759befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 760befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 7621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 7631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 764befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 7651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 7661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 76812a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed dev->device.common.version = HWC_DEVICE_API_VERSION_1_2; 7692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 77793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 781befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 782befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 783befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 784befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 785