hwc.cpp revision 665dfb63994cc0a0040e685ed750673e2bc5ed0d
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 2072ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmedstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev, 2082ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed hwc_display_contents_1_t *list, int dpy) { 2092ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed //XXX: Fix when framework support is added 2102ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed return 0; 2112ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed} 2122ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed 2135b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 2145b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t** displays) 21529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 2163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 21729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 218d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 21989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed reset(ctx, numDisplays, displays); 22056f610dd235b577725198e9341caae92379fdf23Saurabh Shah 221d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ctx->mOverlay->configBegin(); 22236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->configBegin(); 223f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran ctx->mNeedsRotator = false; 22456f610dd235b577725198e9341caae92379fdf23Saurabh Shah 2252ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed for (int32_t i = numDisplays - 1; i >= 0; i--) { 22665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 22765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed switch(i) { 22865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed case HWC_DISPLAY_PRIMARY: 22965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = hwc_prepare_primary(dev, list); 23065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed break; 23165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed case HWC_DISPLAY_EXTERNAL: 2323a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ret = hwc_prepare_external(dev, list, i); 23365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed break; 2342ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed case HWC_DISPLAY_VIRTUAL: 2352ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed ret = hwc_prepare_virtual(dev, list, i); 2362ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed break; 23765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed default: 23865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = -EINVAL; 23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 24029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 241d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed 2426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->mOverlay->configDone(); 24336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->configDone(); 24436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 2453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 24629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 24729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2485b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 24905207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed int event, int enable) 25072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 25172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed int ret = 0; 25272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 253eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev pthread_mutex_lock(&ctx->vstate.lock); 25472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed switch(event) { 25572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed case HWC_EVENT_VSYNC: 25605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if (ctx->vstate.enable == enable) 2571ef881ceed7b39b4034adba23368c2006bfd074cOmprakash Dhyade break; 25805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 25905207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if(ret == 0) { 26005207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ctx->vstate.enable = !!enable; 26105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed pthread_cond_signal(&ctx->vstate.cond); 26205207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed } 263eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 26405207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 265eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev break; 26672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed default: 26772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ret = -EINVAL; 26872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 269eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev pthread_mutex_unlock(&ctx->vstate.lock); 27072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return ret; 27172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 27272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 2735b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 2745b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed{ 2756195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 276934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 27793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 278d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 2793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 280814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 28105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 2827538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R if(blank) { 2837538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // free up all the overlay pipes in use 2847538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // when we get a blank for either display 2857538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R // makes sure that all pipes are freed 2867538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mOverlay->configBegin(); 2877538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mOverlay->configDone(); 2887538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ctx->mRotMgr->clear(); 2897538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R } 2903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(dpy) { 2913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 2923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(blank) { 2937538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, 2947538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R FB_BLANK_POWERDOWN); 2953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } else { 29693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_UNBLANK); 2973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 3003a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 3013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(blank) { 30293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran // call external framebuffer commit on blank, 30393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran // so that any pipe unsets gets committed 30493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 3050e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R ret = -1; 30693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s:display_commit fail!! ", __FUNCTION__); 3070e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R } 3083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } else { 3093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 3113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 3123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return -EINVAL; 3133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 314abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R // Enable HPD here, as during bootup unblank is called 315abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R // when SF is completely initialized 316abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R ctx->mExtDisplay->setHPD(1); 31705207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed if(ret == 0){ 31805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ctx->dpyAttr[dpy].isActive = !blank; 31905207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed } else { 32005207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__, 32105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy, strerror(errno)); 3223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 3235b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 32405207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed 325814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 32605207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed blank==1 ? "blanking":"unblanking", dpy); 3275b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed return 0; 3285b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed} 3295b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed 3305b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 33172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed int param, int* value) 33272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 33372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 33572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 33672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed switch (param) { 33772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 33872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed // Not supported for now 33972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed value[0] = 0; 34072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed break; 3413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 342c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->mMDP.hasOverlay) 343c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah supported |= HWC_DISPLAY_EXTERNAL_BIT; 3443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah value[0] = supported; 3453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 34672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed default: 34772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return -EINVAL; 34872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 34972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed return 0; 35072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 35172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 35272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 35393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 3543e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 3556195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 356eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah int ret = 0; 3576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 358eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah 359a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 360c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah uint32_t last = list->numHwLayers - 1; 361c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 3626c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 3636195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed bool copybitDone = false; 3646c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[dpy]) 3656195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 366a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 367a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 36836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ctx->mVidOv[dpy]->draw(ctx, list)) { 36936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: VideoOverlay draw failed", __FUNCTION__); 370eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 371eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 372bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if (!ctx->mMDPComp->draw(ctx, list)) { 37336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 37465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ret = -1; 37565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 37665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 3773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 3783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //always. Last layer is always FB 3796ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 3806195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if(copybitDone) { 3816195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 3826195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed } 3836ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah 3846ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(hnd) { 3856ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 3866ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 3876ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ret = -1; 38865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 389677311f0bc4a8716e86880d29a6b8051e4389da1Saurabh Shah } 39093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 39193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 39293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 39393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran return -1; 3943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3960859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 3970859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah closeAcquireFds(list); 398eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah return ret; 3993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 4003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 4013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 4026195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hwc_display_contents_1_t* list, int dpy) 4036195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed{ 4046195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed ATRACE_CALL(); 405eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah int ret = 0; 406f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar Locker::Autolock _l(ctx->mExtSetLock); 407c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 408a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 4093a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause && 4106457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah ctx->dpyAttr[dpy].connected) { 4113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t last = list->numHwLayers - 1; 412c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4136c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 4146195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed bool copybitDone = false; 4156c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R if(ctx->mCopyBit[dpy]) 4166195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 417c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 418a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 419a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 420c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 42136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ctx->mVidOv[dpy]->draw(ctx, list)) { 422eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ALOGE("%s: VideoOverlay::draw fail!", __FUNCTION__); 423eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 424eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 425c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 4266ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 4276195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if(copybitDone) { 4286195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 4296195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed } 4306195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed 4316ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah if(hnd) { 4326195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 433d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 434eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah ret = -1; 435eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 436eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah } 43793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran 43893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran if (display_commit(ctx, dpy) < 0) { 43993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran ALOGE("%s: display commit fail!", __FUNCTION__); 4406ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah ret = -1; 4413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 4423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 4430859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 4440859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah closeAcquireFds(list); 445eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah return ret; 4463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 4473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 4482ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmedstatic int hwc_set_virtual(hwc_context_t *ctx, 4492ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed hwc_display_contents_1_t* list, int dpy) 4502ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed{ 4512ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed //XXX: Implement set. 4522ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed closeAcquireFds(list); 453665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall if (list) { 454665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall // SF assumes HWC waits for the acquire fence and returns a new fence 455665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall // that signals when we're done. Since we don't wait, and also don't 456665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall // touch the buffer, we can just handle the acquire fence back to SF 457665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall // as the retire fence. 458665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall list->retireFenceFd = list->outbufAcquireFenceFd; 459665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall } 4602ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed return 0; 4612ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed} 4622ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed 4632ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed 4645b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 4655b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed size_t numDisplays, 4665b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t** displays) 46729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 46829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int ret = 0; 46929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 47032ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed Locker::Autolock _l(ctx->mBlankLock); 4712ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed for (uint32_t i = 0; i < numDisplays; i++) { 4725b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 4733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(i) { 4743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 4753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = hwc_set_primary(ctx, list); 476c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah break; 4773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 4783a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar ret = hwc_set_external(ctx, list, i); 479c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah break; 4802ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed case HWC_DISPLAY_VIRTUAL: 4812ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed ret = hwc_set_virtual(ctx, list, i); 4822ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed break; 4833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 4843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = -EINVAL; 4855b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 4863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 48716292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 48816292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed // frames to the display. 48916292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed CALC_FPS(); 4903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return ret; 4913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 492f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 4933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 4943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t* configs, size_t* numConfigs) { 4953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int ret = 0; 496c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 4973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 4983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 4993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(disp) { 5003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 501c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(*numConfigs > 0) { 502c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah configs[0] = 0; 503c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah *numConfigs = 1; 504c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 505c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = 0; //NO_ERROR 5063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5073e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 508c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = -1; //Not connected 509c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) { 510c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ret = 0; //NO_ERROR 511c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(*numConfigs > 0) { 512c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah configs[0] = 0; 513c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah *numConfigs = 1; 514c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 515c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 5163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5175b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed } 51829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return ret; 51929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 52029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 5213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 5223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 5233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 525c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah //If hotpluggable displays are inactive return error 526c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) { 527c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah return -1; 528c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 529c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 5303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //From HWComposer 5313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 5323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 5333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_WIDTH, 5343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_HEIGHT, 5353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_DPI_X, 5363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_DPI_Y, 5373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 5383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah }; 5393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 5413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 5423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 5443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (attributes[i]) { 5453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 5463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 5473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_WIDTH: 5493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].xres; 550c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 551c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ctx->dpyAttr[disp].xres); 5523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_HEIGHT: 5543e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah values[i] = ctx->dpyAttr[disp].yres; 555c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 556c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ctx->dpyAttr[disp].yres); 5573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_DPI_X: 5597b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 5603e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5613e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_DPI_Y: 5627b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 5633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 5653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ALOGE("Unknown display attribute %d", 5663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah attributes[i]); 5673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return -EINVAL; 5683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return 0; 5713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 5723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 5733b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 5743b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed{ 5753b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 576f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah android::String8 aBuf(""); 577f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 578f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 579f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 580f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ctx->mMDPComp->dump(aBuf); 581f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah char ovDump[2048] = {'\0'}; 582f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 583f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah dumpsys_log(aBuf, ovDump); 58436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ovDump[0] = '\0'; 58536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ctx->mRotMgr->getDump(ovDump, 2048); 58636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah dumpsys_log(aBuf, ovDump); 587f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 5883b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed} 5893b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed 59029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 59129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 59229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if(!dev) { 59372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 59429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return -1; 59529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 59629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed closeContext((hwc_context_t*)dev); 59729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed free(dev); 59829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 59929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return 0; 60029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 60129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 60229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 60329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hw_device_t** device) 60429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 60529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed int status = -EINVAL; 60629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 60729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 60829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed struct hwc_context_t *dev; 60929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 61029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed memset(dev, 0, sizeof(*dev)); 61172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 61272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed //Initialize hwc context 61329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed initContext(dev); 61472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 61572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed //Setup HWC methods 6163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 61718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed dev->device.common.version = HWC_DEVICE_API_VERSION_1_2; 6183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 6193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.common.close = hwc_device_close; 6203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.prepare = hwc_prepare; 6213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.set = hwc_set; 6223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.eventControl = hwc_eventControl; 6233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.blank = hwc_blank; 6243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.query = hwc_query; 6253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.registerProcs = hwc_registerProcs; 6263b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed dev->device.dump = hwc_dump; 6273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 6283e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 6293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah *device = &dev->device.common; 63029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed status = 0; 63129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 63229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return status; 63329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 634