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