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