hwc.cpp revision 1e2af0f047ca851e6063729239bc82c6b4a78b42
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 42814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed#define BLANK_DEBUG 0 4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed const char* name, 4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device); 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed open: hwc_device_open 5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed common: { 5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed tag: HARDWARE_MODULE_TAG, 5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed version_major: 2, 5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed version_minor: 0, 5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed id: HWC_HARDWARE_MODULE_ID, 5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed name: "Qualcomm Hardware Composer Module", 5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed author: "CodeAurora Forum", 6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed methods: &hwc_module_methods, 6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dso: 0, 6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed reserved: {0}, 6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Save callback functions registered to HWC 6829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 695b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_procs_t const* procs) 7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 720f9c397181604f28d15c9273de42f97ae2b4c613Iliyan Malchev ALOGI("%s", __FUNCTION__); 7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!ctx) { 7529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 783be78d9816da84e48a40232165189f9deb16808fJesse Hall ctx->proc = procs; 793be78d9816da84e48a40232165189f9deb16808fJesse Hall 80ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed // Now that we have the functions needed, kick off 81ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed // the uevent & vsync threads 823be78d9816da84e48a40232165189f9deb16808fJesse Hall init_uevent_thread(ctx); 83ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed init_vsync_thread(ctx); 8429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 86649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah//Helper 8789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays, 8889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed hwc_display_contents_1_t** displays) { 893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah memset(ctx->listStats, 0, sizeof(ctx->listStats)); 903a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar for(int i = 0; i < MAX_DISPLAYS; i++) { 9189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 9289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // XXX:SurfaceFlinger no longer guarantees that this 9389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // value is reset on every prepare. However, for the layer 9489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // cache we need to reset it. 9589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed // We can probably rethink that later on 9689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed if (LIKELY(list && list->numHwLayers > 1)) { 9789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed for(uint32_t j = 0; j < list->numHwLayers; j++) { 9889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 9989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 10089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed } 10189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed } 1026457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah 1036457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah if(ctx->mFBUpdate[i]) 1046457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->mFBUpdate[i]->reset(); 10536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(ctx->mVidOv[i]) 10636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mVidOv[i]->reset(); 1076c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[i]) 1086c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R ctx->mCopyBit[i]->reset(); 1091e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah if(ctx->mLayerRotMap[i]) 1101e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah ctx->mLayerRotMap[i]->reset(); 1113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 1133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 11465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed//clear prev layer prop flags and realloc for current frame 1156ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 11665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if(ctx->layerProp[dpy]) { 11765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed delete[] ctx->layerProp[dpy]; 11865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ctx->layerProp[dpy] = NULL; 11965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 1206ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 12165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed} 12265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 12393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaranstatic int display_commit(hwc_context_t *ctx, int dpy) { 12493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran int fbFd = ctx->dpyAttr[dpy].fd; 12593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if(fbFd == -1) { 12693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: Invalid FB fd for display: %d", __FUNCTION__, dpy); 12793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -1; 12893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran } 12993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 13093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran struct mdp_display_commit commit_info; 13193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran memset(&commit_info, 0, sizeof(struct mdp_display_commit)); 13293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY; 13393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if(ioctl(fbFd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) { 13493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__); 13593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -errno; 13693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran } 13793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return 0; 13893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran} 13993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 1403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_display_contents_1_t *list) { 1423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 1436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 14413389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed if(UNLIKELY(!ctx->mBasePipeSetup)) 14513389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed setupBasePipe(ctx); 1466ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 1476ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->dpyAttr[dpy].isActive) { 1486ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 14986623d7d5106cd568a64be4e51be7ee77f078e08Saurabh Shah uint32_t last = list->numHwLayers - 1; 1501a8cda0b2cb535656eb18bf5dc07a02fcddec9abSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1511a8cda0b2cb535656eb18bf5dc07a02fcddec9abSaurabh Shah if(fbLayer->handle) { 1526ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(list->numHwLayers > MAX_NUM_LAYERS) { 1536ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list); 1546ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah return 0; 1556ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah } 1566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah setListStats(ctx, list, dpy); 1576ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah bool ret = ctx->mMDPComp->prepare(ctx, list); 1586c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(!ret) { 1596c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R // IF MDPcomp fails use this route 16036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mVidOv[dpy]->prepare(ctx, list); 1616195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ctx->mFBUpdate[dpy]->prepare(ctx, list); 1626ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah // Use Copybit, when MDP comp fails 1636ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(ctx->mCopyBit[dpy]) 1646ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1656ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mLayerCache[dpy]->updateLayerCache(list); 16665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 1673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 1703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 1713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 1723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 1733a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar hwc_display_contents_1_t *list, int dpy) { 1743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 175c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 1766ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 1776ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->dpyAttr[dpy].isActive && 1786ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->dpyAttr[dpy].connected) { 1796ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 180c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah uint32_t last = list->numHwLayers - 1; 1816ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 1823a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 1833a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar if(fbLayer->handle) { 1846ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mExtDispConfiguring = false; 1856ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(list->numHwLayers > MAX_NUM_LAYERS) { 1866ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ctx->mFBUpdate[dpy]->prepare(ctx, list); 1876ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah return 0; 1886ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah } 1893a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar setListStats(ctx, list, dpy); 19036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mVidOv[dpy]->prepare(ctx, list); 1916195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ctx->mFBUpdate[dpy]->prepare(ctx, list); 1923a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ctx->mLayerCache[dpy]->updateLayerCache(list); 1933a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 1943a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 1953a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar } 1963a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar } else { 1973a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // External Display is in Pause state. 1983a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // ToDo: 1993a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // Mark all application layers as OVERLAY so that 2003a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // GPU will not compose. This is done for power 2013a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // optimization 202c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 2033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 205649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah} 206649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah 2075b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 2085b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t** displays) 20929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 2103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 21129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 212d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 21389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed reset(ctx, numDisplays, displays); 21456f610dd235b577725198e9341caae92379fdf23Saurabh Shah 215d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ctx->mOverlay->configBegin(); 21636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->configBegin(); 217f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran ctx->mNeedsRotator = false; 21856f610dd235b577725198e9341caae92379fdf23Saurabh Shah 2193a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar for (int32_t i = numDisplays; i >= 0; i--) { 22065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 22165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed switch(i) { 22265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed case HWC_DISPLAY_PRIMARY: 22365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = hwc_prepare_primary(dev, list); 22465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed break; 22565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed case HWC_DISPLAY_EXTERNAL: 2263a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 2273a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ret = hwc_prepare_external(dev, list, i); 22865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed break; 22965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed default: 23065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = -EINVAL; 23129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 233d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 2346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->mOverlay->configDone(); 23536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->configDone(); 23636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 2373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2405b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 24105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed int event, int enable) 24272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 24372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed int ret = 0; 24472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 245eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev pthread_mutex_lock(&ctx->vstate.lock); 24672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed switch(event) { 24772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed case HWC_EVENT_VSYNC: 24805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if (ctx->vstate.enable == enable) 2491ef881ceed7b39b4034adba23368c2006bfd074cOmprakash Dhyade break; 25005207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 25105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if(ret == 0) { 25205207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ctx->vstate.enable = !!enable; 25305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed pthread_cond_signal(&ctx->vstate.cond); 25405207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed } 255eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 25605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 257eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev break; 25872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed default: 25972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ret = -EINVAL; 26072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 261eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev pthread_mutex_unlock(&ctx->vstate.lock); 26272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return ret; 26372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 26472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 2655b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 2665b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed{ 2676195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 268934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 26993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 270d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 2713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 272814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 27305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 2747538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R if(blank) { 2757538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // free up all the overlay pipes in use 2767538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // when we get a blank for either display 2777538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // makes sure that all pipes are freed 2787538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mOverlay->configBegin(); 2797538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mOverlay->configDone(); 2807538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mRotMgr->clear(); 2817538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R } 2823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(dpy) { 2833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 2843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(blank) { 2857538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, 2867538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R FB_BLANK_POWERDOWN); 2873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } else { 28893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_UNBLANK); 2893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 2923a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 2933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(blank) { 29493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran // call external framebuffer commit on blank, 29593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran // so that any pipe unsets gets committed 29693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 2970e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R ret = -1; 29893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s:display_commit fail!! ", __FUNCTION__); 2990e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R } 3003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } else { 3013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 3033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 3043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return -EINVAL; 3053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 306abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R // Enable HPD here, as during bootup unblank is called 307abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R // when SF is completely initialized 308abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R ctx->mExtDisplay->setHPD(1); 30905207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if(ret == 0){ 31005207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ctx->dpyAttr[dpy].isActive = !blank; 31105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed } else { 31205207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__, 31305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy, strerror(errno)); 3143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 3155b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 31605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed 317814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 31805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy); 3195b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed return 0; 3205b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed} 3215b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed 3225b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 32372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed int param, int* value) 32472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 32572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 32772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 32872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed switch (param) { 32972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 33072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed // Not supported for now 33172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed value[0] = 0; 33272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed break; 3333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 334c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->mMDP.hasOverlay) 335c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 3363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah value[0] = supported; 3373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 33872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed default: 33972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return -EINVAL; 34072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 34172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return 0; 34272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 34372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 34472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 34593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 3463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 3476195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 348eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah int ret = 0; 3496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 350eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah 351a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 352c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah uint32_t last = list->numHwLayers - 1; 353c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 3546c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 3556195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed bool copybitDone = false; 3566c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[dpy]) 3576195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 358a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 359a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 36036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ctx->mVidOv[dpy]->draw(ctx, list)) { 36136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: VideoOverlay draw failed", __FUNCTION__); 362eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 363eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 364bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if (!ctx->mMDPComp->draw(ctx, list)) { 36536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 36665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = -1; 36765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 36865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 3693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 3703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //always. Last layer is always FB 3716ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 3726195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if(copybitDone) { 3736195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 3746195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed } 3756ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah 3766ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(hnd) { 3776ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 3786ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 3796ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ret = -1; 38065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 381677311f0bc4a8716e86880d29a6b8051e4389da1Saurabh Shah } 38293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 38393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 38493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 38593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -1; 3863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3880859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 3890859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah closeAcquireFds(list); 390eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah return ret; 3913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 3923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 3933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 3946195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hwc_display_contents_1_t* list, int dpy) 3956195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed{ 3966195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 397eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah int ret = 0; 398f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar Locker::Autolock _l(ctx->mExtSetLock); 399c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 400a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 4013a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause && 4026457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->dpyAttr[dpy].connected) { 4033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t last = list->numHwLayers - 1; 404c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4056c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 4066195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed bool copybitDone = false; 4076c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[dpy]) 4086195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 409c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 410a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 411a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 412c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 41336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ctx->mVidOv[dpy]->draw(ctx, list)) { 414eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ALOGE("%s: VideoOverlay::draw fail!", __FUNCTION__); 415eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 416eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 417c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 4186ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 4196195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if(copybitDone) { 4206195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 4216195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed } 4226195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed 4236ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(hnd) { 4246195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 425d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 426eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 427eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 428eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 42993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 43093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 43193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 4326ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ret = -1; 4333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 4343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 4350859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 4360859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah closeAcquireFds(list); 437eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah return ret; 4383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 4393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 4405b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 4415b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed size_t numDisplays, 4425b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t** displays) 44329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 44429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int ret = 0; 44529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 44632ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 4473a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar for (uint32_t i = 0; i <= numDisplays; i++) { 4485b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 4493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(i) { 4503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 4513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = hwc_set_primary(ctx, list); 452c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah break; 4533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 4543a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 4553a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar /* ToDo: We are using hwc_set_external path for both External and 4563a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar Virtual displays on HWC1.1. Eventually, we will have 4573a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar separate functions when we move to HWC1.2 4583a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar */ 4593a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ret = hwc_set_external(ctx, list, i); 460c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah break; 4613e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 4623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = -EINVAL; 4635b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 4643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 46516292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 46616292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed // frames to the display. 46716292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed CALC_FPS(); 4683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 4693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 470f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 4713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 4723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t* configs, size_t* numConfigs) { 4733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 474c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 4753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 4763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 4773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(disp) { 4783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 479c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(*numConfigs > 0) { 480c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah configs[0] = 0; 481c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah *numConfigs = 1; 482c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 483c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = 0; //NO_ERROR 4843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 4853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 486c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = -1; //Not connected 487c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) { 488c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = 0; //NO_ERROR 489c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(*numConfigs > 0) { 490c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah configs[0] = 0; 491c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah *numConfigs = 1; 492c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 493c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 4943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 4955b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 49629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return ret; 49729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 49829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 5003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 5013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 503c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah //If hotpluggable displays are inactive return error 504c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) { 505c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah return -1; 506c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 507c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 5083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //From HWComposer 5093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 5103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 5113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_WIDTH, 5123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_HEIGHT, 5133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_DPI_X, 5143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_DPI_Y, 5153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 5163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah }; 5173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 5193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 5203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 5223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (attributes[i]) { 5233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 5243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 5253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_WIDTH: 5273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].xres; 528c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 529c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ctx->dpyAttr[disp].xres); 5303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_HEIGHT: 5323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].yres; 533c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 534c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ctx->dpyAttr[disp].yres); 5353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_DPI_X: 5377b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 5383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_DPI_Y: 5407b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 5413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 5433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ALOGE("Unknown display attribute %d", 5443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah attributes[i]); 5453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return -EINVAL; 5463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 5493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 5503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5513b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 5523b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed{ 5533b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 554f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah android::String8 aBuf(""); 555f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 556f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 557f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 558f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ctx->mMDPComp->dump(aBuf); 559f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah char ovDump[2048] = {'\0'}; 560f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 561f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, ovDump); 56236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ovDump[0] = '\0'; 56336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->getDump(ovDump, 2048); 56436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah dumpsys_log(aBuf, ovDump); 565f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 5663b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed} 5673b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed 56829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 56929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 57029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!dev) { 57172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 57229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return -1; 57329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 57429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed closeContext((hwc_context_t*)dev); 57529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed free(dev); 57629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 57729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return 0; 57829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 57929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 58029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 58129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device) 58229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 58329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int status = -EINVAL; 58429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 58529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 58629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hwc_context_t *dev; 58729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 58829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed memset(dev, 0, sizeof(*dev)); 58972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 59072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed //Initialize hwc context 59129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed initContext(dev); 59272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 59372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed //Setup HWC methods 5943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 5953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_1; 5963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 5973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.close = hwc_device_close; 5983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.prepare = hwc_prepare; 5993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.set = hwc_set; 6003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.eventControl = hwc_eventControl; 6013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.blank = hwc_blank; 6023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.query = hwc_query; 6033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.registerProcs = hwc_registerProcs; 6043b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed dev->device.dump = hwc_dump; 6053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 6063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 6073e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah *device = &dev->device.common; 60829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed status = 0; 60929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 61029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return status; 61129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 612