hwc.cpp revision 7538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project 30e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 56c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained 66c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * for attribution purposes only. 76c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License. 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License. 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 206195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed#define ATRACE_TAG ATRACE_TAG_GRAPHICS 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <fcntl.h> 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <errno.h> 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <cutils/log.h> 2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <cutils/atomic.h> 2672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <EGL/egl.h> 276195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed#include <utils/Trace.h> 2893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran#include <sys/ioctl.h> 2972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <overlay.h> 3036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include <overlayRotator.h> 3196c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed#include <mdp_version.h> 3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "hwc_utils.h" 33f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#include "hwc_video.h" 34d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include "hwc_fbupdate.h" 3565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed#include "hwc_mdpcomp.h" 3656f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "external.h" 376c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R#include "hwc_copybit.h" 3816292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed#include "profiler.h" 3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedusing namespace qhwc; 41d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#define VSYNC_DEBUG 0 4229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed const char* name, 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device); 4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed open: hwc_device_open 4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed common: { 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed tag: HARDWARE_MODULE_TAG, 5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed version_major: 2, 5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed version_minor: 0, 5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed id: HWC_HARDWARE_MODULE_ID, 5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed name: "Qualcomm Hardware Composer Module", 5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed author: "CodeAurora Forum", 5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed methods: &hwc_module_methods, 6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dso: 0, 6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed reserved: {0}, 6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Save callback functions registered to HWC 6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 685b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_procs_t const* procs) 7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 710f9c397181604f28d15c9273de42f97ae2b4c613Iliyan Malchev ALOGI("%s", __FUNCTION__); 7229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!ctx) { 7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 7529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 773be78d9816da84e48a40232165189f9deb16808fJesse Hall ctx->proc = procs; 783be78d9816da84e48a40232165189f9deb16808fJesse Hall 79ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed // Now that we have the functions needed, kick off 80ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed // the uevent & vsync threads 813be78d9816da84e48a40232165189f9deb16808fJesse Hall init_uevent_thread(ctx); 82ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed init_vsync_thread(ctx); 8329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 8429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 85649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah//Helper 8689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays, 8789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed hwc_display_contents_1_t** displays) { 883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah memset(ctx->listStats, 0, sizeof(ctx->listStats)); 893a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar for(int i = 0; i < MAX_DISPLAYS; i++) { 9089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 9189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // XXX:SurfaceFlinger no longer guarantees that this 9289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // value is reset on every prepare. However, for the layer 9389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // cache we need to reset it. 9489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // We can probably rethink that later on 9589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed if (LIKELY(list && list->numHwLayers > 1)) { 9689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed for(uint32_t j = 0; j < list->numHwLayers; j++) { 9789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 9889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 9989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed } 10089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed } 1016457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah 1026457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah if(ctx->mFBUpdate[i]) 1036457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->mFBUpdate[i]->reset(); 10436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(ctx->mVidOv[i]) 10536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mVidOv[i]->reset(); 1066c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[i]) 1076c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R ctx->mCopyBit[i]->reset(); 1083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 1103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 11165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed//clear prev layer prop flags and realloc for current frame 1126ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 11365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if(ctx->layerProp[dpy]) { 11465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed delete[] ctx->layerProp[dpy]; 11565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ctx->layerProp[dpy] = NULL; 11665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 1176ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 11865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed} 11965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 12093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaranstatic int display_commit(hwc_context_t *ctx, int dpy) { 12193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran int fbFd = ctx->dpyAttr[dpy].fd; 12293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if(fbFd == -1) { 12393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: Invalid FB fd for display: %d", __FUNCTION__, dpy); 12493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -1; 12593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran } 12693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 12793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran struct mdp_display_commit commit_info; 12893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran memset(&commit_info, 0, sizeof(struct mdp_display_commit)); 12993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY; 13093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if(ioctl(fbFd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) { 13193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__); 13293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -errno; 13393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran } 13493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return 0; 13593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran} 13693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 1373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_display_contents_1_t *list) { 1393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 1406457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 1416ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 1426ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->dpyAttr[dpy].isActive) { 1436ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 14486623d7d5106cd568a64be4e51be7ee77f078e08Saurabh Shah uint32_t last = list->numHwLayers - 1; 1451a8cda0b2cb535656eb18bf5dc07a02fcddec9abSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1461a8cda0b2cb535656eb18bf5dc07a02fcddec9abSaurabh Shah if(fbLayer->handle) { 1476ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(list->numHwLayers > MAX_NUM_LAYERS) { 1486ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list); 1496ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah return 0; 1506ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah } 1516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah setListStats(ctx, list, dpy); 1526ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah bool ret = ctx->mMDPComp->prepare(ctx, list); 1536c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(!ret) { 1546c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R // IF MDPcomp fails use this route 15536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mVidOv[dpy]->prepare(ctx, list); 1566195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ctx->mFBUpdate[dpy]->prepare(ctx, list); 1576ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah // Use Copybit, when MDP comp fails 1586ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(ctx->mCopyBit[dpy]) 1596ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1606ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mLayerCache[dpy]->updateLayerCache(list); 16165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 1623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 1653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 1663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 1673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 1683a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar hwc_display_contents_1_t *list, int dpy) { 1693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 170c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 1716ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 1726ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->dpyAttr[dpy].isActive && 1736ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->dpyAttr[dpy].connected) { 1746ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 175c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah uint32_t last = list->numHwLayers - 1; 1766ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1773a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 1783a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar if(fbLayer->handle) { 1796ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mExtDispConfiguring = false; 1806ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(list->numHwLayers > MAX_NUM_LAYERS) { 1816ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list); 1826ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah return 0; 1836ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah } 1843a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar setListStats(ctx, list, dpy); 18536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mVidOv[dpy]->prepare(ctx, list); 1866195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ctx->mFBUpdate[dpy]->prepare(ctx, list); 1873a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ctx->mLayerCache[dpy]->updateLayerCache(list); 1883a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 1893a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1903a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar } 1913a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar } else { 1923a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // External Display is in Pause state. 1933a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // ToDo: 1943a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // Mark all application layers as OVERLAY so that 1953a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // GPU will not compose. This is done for power 1963a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // optimization 197c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 1983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 200649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah} 201649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah 2025b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 2035b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t** displays) 20429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 2053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 20629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 207d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 20889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed reset(ctx, numDisplays, displays); 20956f610dd235b577725198e9341caae92379fdf23Saurabh Shah 210d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ctx->mOverlay->configBegin(); 21136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->configBegin(); 212f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran ctx->mNeedsRotator = false; 21356f610dd235b577725198e9341caae92379fdf23Saurabh Shah 2143a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar for (int32_t i = numDisplays; i >= 0; i--) { 21565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 21665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed switch(i) { 21765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed case HWC_DISPLAY_PRIMARY: 21865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = hwc_prepare_primary(dev, list); 21965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed break; 22065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed case HWC_DISPLAY_EXTERNAL: 2213a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 2223a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ret = hwc_prepare_external(dev, list, i); 22365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed break; 22465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed default: 22565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = -EINVAL; 22629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 22729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 228d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 2296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->mOverlay->configDone(); 23036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->configDone(); 23136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 2323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 23329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2355b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 23605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed int event, int enable) 23772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 23872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed int ret = 0; 23972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 240eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev pthread_mutex_lock(&ctx->vstate.lock); 24172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed switch(event) { 24272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed case HWC_EVENT_VSYNC: 24305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if (ctx->vstate.enable == enable) 2441ef881ceed7b39b4034adba23368c2006bfd074cOmprakash Dhyade break; 24505207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 24605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if(ret == 0) { 24705207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ctx->vstate.enable = !!enable; 24805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed pthread_cond_signal(&ctx->vstate.cond); 24905207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed } 250eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 25105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 252eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev break; 25372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed default: 25472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ret = -EINVAL; 25572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 256eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev pthread_mutex_unlock(&ctx->vstate.lock); 25772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return ret; 25872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 25972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 2605b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 2615b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed{ 2626195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 263934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 26493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 265d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 2663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 26705207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ALOGD("%s: %s display: %d", __FUNCTION__, 26805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 2697538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R if(blank) { 2707538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // free up all the overlay pipes in use 2717538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // when we get a blank for either display 2727538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // makes sure that all pipes are freed 2737538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mOverlay->configBegin(); 2747538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mOverlay->configDone(); 2757538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mRotMgr->clear(); 2767538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R } 2773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(dpy) { 2783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 2793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(blank) { 2807538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, 2817538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R FB_BLANK_POWERDOWN); 2823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } else { 28393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_UNBLANK); 2843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 2873a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 2883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(blank) { 28993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran // call external framebuffer commit on blank, 29093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran // so that any pipe unsets gets committed 29193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 2920e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R ret = -1; 29393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s:display_commit fail!! ", __FUNCTION__); 2940e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R } 2953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } else { 2963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 2993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return -EINVAL; 3003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 301abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R // Enable HPD here, as during bootup unblank is called 302abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R // when SF is completely initialized 303abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R ctx->mExtDisplay->setHPD(1); 30405207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if(ret == 0){ 30505207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ctx->dpyAttr[dpy].isActive = !blank; 30605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed } else { 30705207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__, 30805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy, strerror(errno)); 3093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 3105b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 31105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed 31205207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ALOGD("%s: Done %s display: %d", __FUNCTION__, 31305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy); 3145b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed return 0; 3155b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed} 3165b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed 3175b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 31872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed int param, int* value) 31972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 32072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 32272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 32372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed switch (param) { 32472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 32572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed // Not supported for now 32672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed value[0] = 0; 32772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed break; 3283e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 329c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->mMDP.hasOverlay) 330c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 3313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah value[0] = supported; 3323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 33372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed default: 33472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return -EINVAL; 33572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 33672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return 0; 33772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 33872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 33972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 34093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 3413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 3426195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 343eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah int ret = 0; 3446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 345eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah 346a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 347c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah uint32_t last = list->numHwLayers - 1; 348c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 3496c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 3506195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed bool copybitDone = false; 3516c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[dpy]) 3526195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 353a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 354a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 35536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ctx->mVidOv[dpy]->draw(ctx, list)) { 35636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: VideoOverlay draw failed", __FUNCTION__); 357eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 358eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 359bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if (!ctx->mMDPComp->draw(ctx, list)) { 36036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 36165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = -1; 36265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 36365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 3643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 3653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //always. Last layer is always FB 3666ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 3676195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if(copybitDone) { 3686195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 3696195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed } 3706ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah 3716ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(hnd) { 3726ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 3736ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 3746ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ret = -1; 37565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 376677311f0bc4a8716e86880d29a6b8051e4389da1Saurabh Shah } 37793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 37893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 37993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 38093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -1; 3813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3830859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 3840859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah closeAcquireFds(list); 385eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah return ret; 3863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 3873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 3883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 3896195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hwc_display_contents_1_t* list, int dpy) 3906195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed{ 3916195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 392eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah int ret = 0; 393f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar Locker::Autolock _l(ctx->mExtSetLock); 394c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 395a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 3963a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause && 3976457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->dpyAttr[dpy].connected) { 3983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t last = list->numHwLayers - 1; 399c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4006c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 4016195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed bool copybitDone = false; 4026c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[dpy]) 4036195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 404c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 405a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 406a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 407c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 40836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ctx->mVidOv[dpy]->draw(ctx, list)) { 409eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ALOGE("%s: VideoOverlay::draw fail!", __FUNCTION__); 410eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 411eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 412c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 4136ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 4146195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if(copybitDone) { 4156195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 4166195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed } 4176195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed 4186ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(hnd) { 4196195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 420d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 421eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 422eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 423eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 42493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 42593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 42693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 4276ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ret = -1; 4283e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 4293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 4300859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 4310859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah closeAcquireFds(list); 432eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah return ret; 4333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 4343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 4355b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 4365b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed size_t numDisplays, 4375b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t** displays) 43829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 43929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int ret = 0; 44029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 44132ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 4423a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar for (uint32_t i = 0; i <= numDisplays; i++) { 4435b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 4443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(i) { 4453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 4463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = hwc_set_primary(ctx, list); 447c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah break; 4483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 4493a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 4503a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar /* ToDo: We are using hwc_set_external path for both External and 4513a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar Virtual displays on HWC1.1. Eventually, we will have 4523a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar separate functions when we move to HWC1.2 4533a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar */ 4543a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ret = hwc_set_external(ctx, list, i); 455c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah break; 4563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 4573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = -EINVAL; 4585b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 4593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 46016292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 46116292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed // frames to the display. 46216292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed CALC_FPS(); 4633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 4643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 465f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 4663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 4673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t* configs, size_t* numConfigs) { 4683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 469c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 4703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 4713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 4723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(disp) { 4733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 474c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(*numConfigs > 0) { 475c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah configs[0] = 0; 476c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah *numConfigs = 1; 477c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 478c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = 0; //NO_ERROR 4793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 4803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 481c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = -1; //Not connected 482c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) { 483c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = 0; //NO_ERROR 484c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(*numConfigs > 0) { 485c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah configs[0] = 0; 486c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah *numConfigs = 1; 487c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 488c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 4893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 4905b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 49129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return ret; 49229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 49329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 4953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 4963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 4973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 498c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah //If hotpluggable displays are inactive return error 499c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) { 500c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah return -1; 501c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 502c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 5033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //From HWComposer 5043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 5053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 5063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_WIDTH, 5073e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_HEIGHT, 5083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_DPI_X, 5093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_DPI_Y, 5103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 5113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah }; 5123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 5143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 5153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 5173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (attributes[i]) { 5183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 5193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 5203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_WIDTH: 5223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].xres; 523c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 524c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ctx->dpyAttr[disp].xres); 5253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_HEIGHT: 5273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].yres; 528c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 529c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ctx->dpyAttr[disp].yres); 5303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_DPI_X: 5327b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 5333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_DPI_Y: 5357b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 5363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 5383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ALOGE("Unknown display attribute %d", 5393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah attributes[i]); 5403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return -EINVAL; 5413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 5443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 5453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5463b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 5473b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed{ 5483b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 549f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah android::String8 aBuf(""); 550f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 551f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 552f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 553f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ctx->mMDPComp->dump(aBuf); 554f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah char ovDump[2048] = {'\0'}; 555f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 556f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, ovDump); 55736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ovDump[0] = '\0'; 55836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->getDump(ovDump, 2048); 55936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah dumpsys_log(aBuf, ovDump); 560f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 5613b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed} 5623b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed 56329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 56429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 56529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!dev) { 56672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 56729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return -1; 56829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 56929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed closeContext((hwc_context_t*)dev); 57029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed free(dev); 57129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 57229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return 0; 57329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 57429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 57529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 57629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device) 57729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 57829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int status = -EINVAL; 57929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 58029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 58129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hwc_context_t *dev; 58229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 58329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed memset(dev, 0, sizeof(*dev)); 58472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 58572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed //Initialize hwc context 58629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed initContext(dev); 58772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 58872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed //Setup HWC methods 5893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 5903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_1; 5913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 5923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.close = hwc_device_close; 5933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.prepare = hwc_prepare; 5943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.set = hwc_set; 5953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.eventControl = hwc_eventControl; 5963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.blank = hwc_blank; 5973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.query = hwc_query; 5983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.registerProcs = hwc_registerProcs; 5993b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed dev->device.dump = hwc_dump; 6003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 6013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 6023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah *device = &dev->device.common; 60329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed status = 0; 60429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 60529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return status; 60629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 607