hwc.cpp revision f1e233034ba5bc96e32861fa98a5504aad06415b
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 */ 2004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed#define ATRACE_TAG ATRACE_TAG_GRAPHICS 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> 31b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h> 32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h" 3347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h" 3416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h" 35c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan#include "hwc_dump_layers.h" 36bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 374019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h" 3895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed#include "profiler.h" 39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc; 4111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 4211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 4347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0 442a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1 45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const char* name, 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device); 49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed open: hwc_device_open 52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed common: { 56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed tag: HARDWARE_MODULE_TAG, 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 2, 58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: HWC_HARDWARE_MODULE_ID, 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "Qualcomm Hardware Composer Module", 61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "CodeAurora Forum", 62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: &hwc_module_methods, 63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dso: 0, 64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved: {0}, 65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 71660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_procs_t const* procs) 73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 748eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev ALOGI("%s", __FUNCTION__); 75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!ctx) { 77befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 78befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return; 79befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 80359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc = procs; 81359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall 82aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // Now that we have the functions needed, kick off 83aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // the uevent & vsync threads 84359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall init_uevent_thread(ctx); 85aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed init_vsync_thread(ctx); 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 8825322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper 899f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays, 909f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t** displays) { 912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah memset(ctx->listStats, 0, sizeof(ctx->listStats)); 9290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for(int i = 0; i < MAX_DISPLAYS; i++) { 939f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 949f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // XXX:SurfaceFlinger no longer guarantees that this 959f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // value is reset on every prepare. However, for the layer 969f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // cache we need to reset it. 979f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // We can probably rethink that later on 989f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if (LIKELY(list && list->numHwLayers > 1)) { 999f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed for(uint32_t j = 0; j < list->numHwLayers; j++) { 1009f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 1019f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 1029f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1039f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 104640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 105640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(ctx->mFBUpdate[i]) 106640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mFBUpdate[i]->reset(); 1074019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[i]) 1084019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R ctx->mCopyBit[i]->reset(); 1092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 1112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 11216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed//clear prev layer prop flags and realloc for current frame 11354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 11416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(ctx->layerProp[dpy]) { 11516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed delete[] ctx->layerProp[dpy]; 11616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ctx->layerProp[dpy] = NULL; 11716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 11854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 11916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 12016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 121c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaranstatic int display_commit(hwc_context_t *ctx, int dpy) { 122c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran struct mdp_display_commit commit_info; 123c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran memset(&commit_info, 0, sizeof(struct mdp_display_commit)); 124c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY; 125c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) { 126c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__); 127c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran return -errno; 128c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran } 129c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran return 0; 130c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran} 131c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 1322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 1342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 135640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 13654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 13754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 13854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 139074dab343c4cfc5c77511a77247d759b10089a94Saurabh Shah uint32_t last = list->numHwLayers - 1; 1406e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1416e458c9164c7891d0f869a58c0ea12280c23e9caSaurabh Shah if(fbLayer->handle) { 142640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah setListStats(ctx, list, dpy); 143f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list); 144f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(fbZOrder >= 0) 145f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder); 146f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1479ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson if (ctx->mMDP.version < qdutils::MDP_V4_0) { 1489ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson if((fbZOrder >= 0) && ctx->mCopyBit[dpy]) 1499ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1509ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson } 1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 1532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 1542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 1552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 1562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 15790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar hwc_display_contents_1_t *list, int dpy) { 1586e5f4943b740677ec2f124fda808f6fb2d715cdeRaj kamal 1592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 1606e5f4943b740677ec2f124fda808f6fb2d715cdeRaj kamal Locker::Autolock _l(ctx->mExtLock); 16176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 16254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 16354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 16454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 16554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 16676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 16754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 16890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 16990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(fbLayer->handle) { 17054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->mExtDispConfiguring = false; 17190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar setListStats(ctx, list, dpy); 172f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int fbZOrder = ctx->mMDPComp[dpy]->prepare(ctx, list); 173a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(ctx->deviceOrientation && 174a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->listStats[dpy].isDisplayAnimating) { 175a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan fbZOrder = 0; 176a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 177f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(fbZOrder >= 0) 178f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZOrder); 179f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 180f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Temporarily commenting out C2D until we support partial 181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran copybit composition for mixed mode MDP 182f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 183f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((fbZOrder >= 0) && ctx->mCopyBit[dpy]) 18490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 185f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran */ 186a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(ctx->listStats[dpy].isDisplayAnimating) { 187a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // Mark all app layers as HWC_OVERLAY for external during 188a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // animation, so that SF doesnt draw it on FB 189a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan for(int i = 0 ;i < ctx->listStats[dpy].numAppLayers; i++) { 190a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan hwc_layer_1_t *layer = &list->hwLayers[i]; 191a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan layer->compositionType = HWC_OVERLAY; 192a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 193a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 19490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } 19590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 19690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // External Display is in Pause state. 19790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // ToDo: 19890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // Mark all application layers as OVERLAY so that 19990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // GPU will not compose. This is done for power 20090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // optimization 20176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 2022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 20425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 20525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 206660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 207660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 208befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 2092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 210befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 21147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 2129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed reset(ctx, numDisplays, displays); 213bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 21447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 215327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 21611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 217bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 21890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (int32_t i = numDisplays; i >= 0; i--) { 21916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 22016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed switch(i) { 22116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 22216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 22316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 22416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 22590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 22690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar ret = hwc_prepare_external(dev, list, i); 22716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 22816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 22916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 230befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 231befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 23247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 233640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 234327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 235327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 2362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 237befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 238befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 239660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 24055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 2411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 2421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 2431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 24410d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 2451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 2461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 24755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 2484267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 24955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 25010d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 25155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 252dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 25355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 254dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 255f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 256a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 257a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 258a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 259a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // will be used in hwc_video::configure to disable 260a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // rotation animation on external display 261a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 262a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 263a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 264f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 2651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 2661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 2671589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 2681589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 2691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 2701589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 271660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 272660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 27304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 2741ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 275c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 27647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 2772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 278f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 27955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 280905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 281905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 282905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 283905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 284905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 285905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 286905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 287905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 2882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 2892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 2902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah if(blank) { 291c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_POWERDOWN); 2923fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan 2933fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) { 2943fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan // Surfaceflinger does not send Blank/unblank event to hwc 2953fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan // for virtual display, handle it explicitly when blank for 2963fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan // primary is invoked, so that any pipes unset get committed 297c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran if (display_commit(ctx, HWC_DISPLAY_VIRTUAL) < 0) { 2983fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan ret = -1; 2993fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan ALOGE("%s:post failed for virtual display !!", 3003fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan __FUNCTION__); 3013fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan } else { 3023fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 3033fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan } 3043fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan } 3052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } else { 306c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, FB_BLANK_UNBLANK); 3073fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected == true) { 3083fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 3093fa62188eb14c34b64fc95167162cb807de64336Ramkumar Radhakrishnan } 3102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 3112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 3122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 3132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah if(blank) { 314c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran // call external framebuffer commit on blank, 315c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran // so that any pipe unsets gets committed 316c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 3173ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R ret = -1; 318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s:post failed for external display !! ", 319f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 3203ffc467822ce99b148d842c13dc22e1889ba0241Arun Kumar K.R } 3212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } else { 3222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 3232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 3242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 3252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 3262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 32771005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R // Enable HPD here, as during bootup unblank is called 32871005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R // when SF is completely initialized 32971005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R ctx->mExtDisplay->setHPD(1); 33055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if(ret == 0){ 33155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->dpyAttr[dpy].isActive = !blank; 33255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed } else { 33355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__, 33455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy, strerror(errno)); 3352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 336660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 33755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 338f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 33955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy); 340660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed return 0; 341660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 342660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 343660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 3441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 3451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 3481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 3491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 3501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 3511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 3521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 3531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 3542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 35576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(ctx->mMDP.hasOverlay) 35676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 3572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 3582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 3591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 3601589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 3611589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 3621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 3631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 3641589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 3651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 366c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 3672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 36804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 3693475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 370640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 371e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 37276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 37376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 3744019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 37504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 3764019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 37704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 378e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 379e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 380f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 381c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 382c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 383c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 384c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 386327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 38716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 38816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 38916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 3902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 3912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 39254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 39304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed if(copybitDone) { 39404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 39504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 39654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 39754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 39854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 39954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 40054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 40116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 4022a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 403c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 404c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 405c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 40650c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 4072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 4082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 409a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 410a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 4113475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 4122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 4132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 4142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 41504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hwc_display_contents_1_t* list, int dpy) 41604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 41704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4183475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 4196e5f4943b740677ec2f124fda808f6fb2d715cdeRaj kamal Locker::Autolock _l(ctx->mExtLock); 42076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 421e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 42290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause && 423640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->dpyAttr[dpy].connected) { 4242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t last = list->numHwLayers - 1; 42576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4264019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 42704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 4284019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 42904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 43076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 431e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 432e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 43376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 434c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for external 435c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 436c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 437c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 438f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: MDPComp draw failed", __FUNCTION__); 4403475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah ret = -1; 4413475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 44276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 443eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R int extOnlyLayerIndex = 444eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R ctx->listStats[dpy].extOnlyLayerIndex; 445eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 44654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 447eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R if(extOnlyLayerIndex!= -1) { 448eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 449eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R hnd = (private_handle_t *)extLayer->handle; 450eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R } else if(copybitDone) { 45104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 45204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 45304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 454eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R if(hnd && !isYuvBuffer(hnd)) { 45504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 45647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 4573475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah ret = -1; 4583475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 4593475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 460c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 461c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 462c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 46354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 4642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 4652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 466a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 467a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 4683475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 4692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 4702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 471660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 472660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 473660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 474befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 475befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 476befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 47777d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 47890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar for (uint32_t i = 0; i <= numDisplays; i++) { 479660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 4802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(i) { 4812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 4822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 48376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 4842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 48590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 48690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar /* ToDo: We are using hwc_set_external path for both External and 48790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar Virtual displays on HWC1.1. Eventually, we will have 48890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar separate functions when we move to HWC1.2 48990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar */ 49090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar ret = hwc_set_external(ctx, list, i); 49176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 4922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 4932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 494660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 4952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 49695eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 49795eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 49895eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 49933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 5002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 5012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 502ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 5032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 5042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 5052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 50676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 5072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 5092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 5102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 51176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 51276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 51376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 51476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 51576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 5162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 5172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 51876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 51976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) { 52076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 52176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 52276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 52376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 52476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 52576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 5262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 527660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 528befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 529befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 530befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 5312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 5322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 5332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 5342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 53576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //If hotpluggable displays are inactive return error 53676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) { 53776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 53876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 53976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 5412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 5422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 5432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 5442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 5452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 5462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 5472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 5482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 5492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 5502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 5512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 5522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 5532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 5542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 5552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 5562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 5572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 5582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 5592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 56076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 56176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 5622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 5632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 5642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 56576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 56676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 5672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 5682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 56979e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 5702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 5712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 57279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 5732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 5742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 5752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 5762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 5772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 5782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 5812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 58393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 58493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 58593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 586a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 587a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 588a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 589a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int dpy = 0; dpy < MAX_DISPLAYS; dpy++) { 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 594a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 595a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 596a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 597327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 5984762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 599327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 600a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 60193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 60293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 603befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 604befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 605befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 6061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 607befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 608befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 609befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 610befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 611befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 612befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 613befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 614befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 615befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 616befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 617befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 618befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 619befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 620befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 621befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 622befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 623befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 6241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 6251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 626befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 6271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 6281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 6292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 6302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_1; 6312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 6362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 63993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 6412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 6422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 643befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 644befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 645befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 646befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 647