hwc.cpp revision 01f9a13e06f5b25788dfb042d20583ce2f974579
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 */
20b53fd3580ca9bd45e980c320daeb112e5d4f922aNaseer Ahmed#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
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>
315ceb9c6a763418d5e0cf5da4e74b7a7c733fb4b1Saurabh Shah#include <overlayWriteback.h>
3296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed#include <mdp_version.h>
3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "hwc_utils.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"
38d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include "hwc_ad.h"
3916292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed#include "profiler.h"
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedusing namespace qhwc;
425fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shahusing namespace overlay;
435fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah
44d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#define VSYNC_DEBUG 0
45e156621d50bb4d064da7ad914414d3bf33545930Ramkumar Radhakrishnan#define BLANK_DEBUG 1
4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module,
4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                           const char* name,
4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                           struct hw_device_t** device);
5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = {
5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    open: hwc_device_open
5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = {
5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    common: {
5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        tag: HARDWARE_MODULE_TAG,
5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        version_major: 2,
5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        version_minor: 0,
6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        id: HWC_HARDWARE_MODULE_ID,
6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        name: "Qualcomm Hardware Composer Module",
6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        author: "CodeAurora Forum",
6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        methods: &hwc_module_methods,
6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dso: 0,
6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        reserved: {0},
6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
6829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Save callback functions registered to HWC
7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
725b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev,
7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                              hwc_procs_t const* procs)
7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
750f9c397181604f28d15c9273de42f97ae2b4c613Iliyan Malchev    ALOGI("%s", __FUNCTION__);
7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(!ctx) {
7829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("%s: Invalid context", __FUNCTION__);
7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return;
8029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
813be78d9816da84e48a40232165189f9deb16808fJesse Hall    ctx->proc = procs;
823be78d9816da84e48a40232165189f9deb16808fJesse Hall
83ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    // Now that we have the functions needed, kick off
84ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    // the uevent & vsync threads
853be78d9816da84e48a40232165189f9deb16808fJesse Hall    init_uevent_thread(ctx);
86ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    init_vsync_thread(ctx);
8729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
8829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
89649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah//Helper
9089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays,
9189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed                  hwc_display_contents_1_t** displays) {
923a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < MAX_DISPLAYS; i++) {
9389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        hwc_display_contents_1_t *list = displays[i];
9489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        // XXX:SurfaceFlinger no longer guarantees that this
9589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        // value is reset on every prepare. However, for the layer
9689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        // cache we need to reset it.
9789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        // We can probably rethink that later on
9889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        if (LIKELY(list && list->numHwLayers > 1)) {
9989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed            for(uint32_t j = 0; j < list->numHwLayers; j++) {
10089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed                if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
10189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed                    list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
10289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed            }
10389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        }
1046457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1056457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(ctx->mFBUpdate[i])
1066457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ctx->mFBUpdate[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    }
112d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
113d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    ctx->mAD->reset();
1143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
1153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
11665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed//clear prev layer prop flags and realloc for current frame
1176ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shahstatic void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) {
11865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    if(ctx->layerProp[dpy]) {
11965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed       delete[] ctx->layerProp[dpy];
12065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed       ctx->layerProp[dpy] = NULL;
12165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    }
1226ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah    ctx->layerProp[dpy] = new LayerProp[numAppLayers];
12365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed}
12465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
1254f4c03bfb459159490795165a191e01c564e5788Saurabh Shahstatic void handleGeomChange(hwc_context_t *ctx, int dpy,
1264f4c03bfb459159490795165a191e01c564e5788Saurabh Shah        hwc_display_contents_1_t *list) {
1274f4c03bfb459159490795165a191e01c564e5788Saurabh Shah    if(list->flags & HWC_GEOMETRY_CHANGED) {
1284f4c03bfb459159490795165a191e01c564e5788Saurabh Shah        ctx->mOverlay->forceSet(dpy);
1294f4c03bfb459159490795165a191e01c564e5788Saurabh Shah    }
1304f4c03bfb459159490795165a191e01c564e5788Saurabh Shah}
1314f4c03bfb459159490795165a191e01c564e5788Saurabh Shah
13293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaranstatic int display_commit(hwc_context_t *ctx, int dpy) {
13393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    int fbFd = ctx->dpyAttr[dpy].fd;
13493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if(fbFd == -1) {
13593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        ALOGE("%s: Invalid FB fd for display: %d", __FUNCTION__, dpy);
13693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        return -1;
13793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    }
13893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
13993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    struct mdp_display_commit commit_info;
14093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    memset(&commit_info, 0, sizeof(struct mdp_display_commit));
14193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    commit_info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
14293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if(ioctl(fbFd, MSMFB_DISPLAY_COMMIT, &commit_info) == -1) {
14393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran       ALOGE("%s: MSMFB_DISPLAY_COMMIT for primary failed", __FUNCTION__);
14493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran       return -errno;
14593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    }
14693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    return 0;
14793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran}
14893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
1493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev,
1503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        hwc_display_contents_1_t *list) {
1513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
1526457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
1536ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
1546ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah            ctx->dpyAttr[dpy].isActive) {
1556ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
1564f4c03bfb459159490795165a191e01c564e5788Saurabh Shah        handleGeomChange(ctx, dpy, list);
15786623d7d5106cd568a64be4e51be7ee77f078e08Saurabh Shah        uint32_t last = list->numHwLayers - 1;
1581a8cda0b2cb535656eb18bf5dc07a02fcddec9abSaurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
1591a8cda0b2cb535656eb18bf5dc07a02fcddec9abSaurabh Shah        if(fbLayer->handle) {
1606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            setListStats(ctx, list, dpy);
16163740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
16263740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                const int fbZ = 0;
16363740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
16463740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah            }
165e67c709079b4da35667a3bbc5a00d54530a83a87Terence Hampson            if (ctx->mMDP.version < qdutils::MDP_V4_0) {
16663740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                if(ctx->mCopyBit[dpy])
167e67c709079b4da35667a3bbc5a00d54530a83a87Terence Hampson                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
168e67c709079b4da35667a3bbc5a00d54530a83a87Terence Hampson            }
1693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        }
1703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
1713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return 0;
1723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
1733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
1743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev,
1753a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar        hwc_display_contents_1_t *list, int dpy) {
176843b225b518ca5495aab3a4a5eddba5fb60381ecRaj kamal
1773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
178c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
1796ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah    if (LIKELY(list && list->numHwLayers > 1) &&
1806ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah            ctx->dpyAttr[dpy].isActive &&
1816ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah            ctx->dpyAttr[dpy].connected) {
1826ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        reset_layer_prop(ctx, dpy, list->numHwLayers - 1);
1834f4c03bfb459159490795165a191e01c564e5788Saurabh Shah        handleGeomChange(ctx, dpy, list);
184c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        uint32_t last = list->numHwLayers - 1;
1856ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
1863a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar        if(!ctx->dpyAttr[dpy].isPause) {
1873a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            if(fbLayer->handle) {
188fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah                ctx->dpyAttr[dpy].isConfiguring = false;
1893a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar                setListStats(ctx, list, dpy);
19063740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
19163740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                    const int fbZ = 0;
19263740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                    ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ);
19363740d39c9a8140e7a26f24e8069e75f73d1a32dSaurabh Shah                }
19485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
19585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                /* Temporarily commenting out C2D until we support partial
19685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                   copybit composition for mixed mode MDP
19785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
19885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                if((fbZOrder >= 0) && ctx->mCopyBit[dpy])
1993a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar                    ctx->mCopyBit[dpy]->prepare(ctx, list, dpy);
20085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                */
2013a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            }
2023a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar        } else {
2033a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            // External Display is in Pause state.
2043a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            // ToDo:
2053a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            // Mark all application layers as OVERLAY so that
2063a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            // GPU will not compose. This is done for power
2073a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar            // optimization
208c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        }
2093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
2103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return 0;
211649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah}
212649cda6710c01fbc4259f8ab61aff2cdb05b242cSaurabh Shah
2132ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmedstatic int hwc_prepare_virtual(hwc_composer_device_1 *dev,
2142ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                               hwc_display_contents_1_t *list, int dpy) {
2152ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    //XXX: Fix when framework support is added
2162ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    return 0;
2172ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed}
2182ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed
2195b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays,
2205b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                       hwc_display_contents_1_t** displays)
22129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
2223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int ret = 0;
22329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
2240ddfa307452987336b5ec22967ba701c221f8402Saurabh Shah    //Will be unlocked at the end of set
22501f9a13e06f5b25788dfb042d20583ce2f974579Saurabh Shah    ctx->mDrawLock.lock();
22689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    reset(ctx, numDisplays, displays);
22756f610dd235b577725198e9341caae92379fdf23Saurabh Shah
228d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    ctx->mOverlay->configBegin();
22936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ctx->mRotMgr->configBegin();
2305ceb9c6a763418d5e0cf5da4e74b7a7c733fb4b1Saurabh Shah    overlay::Writeback::configBegin();
2315ceb9c6a763418d5e0cf5da4e74b7a7c733fb4b1Saurabh Shah
2325fe3925fe5a04f1fe519f64e973a1e5da4932d03Saurabh Shah    Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
23356f610dd235b577725198e9341caae92379fdf23Saurabh Shah
2342ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    for (int32_t i = numDisplays - 1; i >= 0; i--) {
23565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        hwc_display_contents_1_t *list = displays[i];
23665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        switch(i) {
23765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            case HWC_DISPLAY_PRIMARY:
23865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed                ret = hwc_prepare_primary(dev, list);
23965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed                break;
24065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            case HWC_DISPLAY_EXTERNAL:
2413a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar                ret = hwc_prepare_external(dev, list, i);
24265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed                break;
2432ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed            case HWC_DISPLAY_VIRTUAL:
2442ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                ret = hwc_prepare_virtual(dev, list, i);
2452ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                break;
24665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            default:
24765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed                ret = -EINVAL;
24829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
24929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
250d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
2516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ctx->mOverlay->configDone();
25236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ctx->mRotMgr->configDone();
2535ceb9c6a763418d5e0cf5da4e74b7a7c733fb4b1Saurabh Shah    overlay::Writeback::configDone();
25436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
2553e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return ret;
25629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
25729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2585b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
25905207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed                             int event, int enable)
26072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{
26172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    int ret = 0;
26272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
26372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    switch(event) {
26472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        case HWC_EVENT_VSYNC:
265742ad624e555511b687879e1b3256ee21bf7f9bfNaseer Ahmed            if(!ctx->dpyAttr[dpy].isActive) {
266742ad624e555511b687879e1b3256ee21bf7f9bfNaseer Ahmed                ALOGE("Display is blanked - Cannot %s vsync",
267742ad624e555511b687879e1b3256ee21bf7f9bfNaseer Ahmed                        enable ? "enable" : "disable");
268742ad624e555511b687879e1b3256ee21bf7f9bfNaseer Ahmed                return -EINVAL;
269742ad624e555511b687879e1b3256ee21bf7f9bfNaseer Ahmed            }
270742ad624e555511b687879e1b3256ee21bf7f9bfNaseer Ahmed
27105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed            if (ctx->vstate.enable == enable)
2721ef881ceed7b39b4034adba23368c2006bfd074cOmprakash Dhyade                break;
27305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed            ret = hwc_vsync_control(ctx, dpy, enable);
274c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed            if(ret == 0)
27505207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed                ctx->vstate.enable = !!enable;
276eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev            ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
27705207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed                      (enable)?"ENABLED":"DISABLED");
278eac8965bf481a17c6bca291c0864d0eb3c0eac07Iliyan Malchev            break;
27972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        default:
28072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed            ret = -EINVAL;
28172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    }
28272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    return ret;
28372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
28472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
2855b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank)
2865b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed{
2876195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    ATRACE_CALL();
288934790c2fc35a02925f7abd872f16d3baa628712Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
28993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
29001f9a13e06f5b25788dfb042d20583ce2f974579Saurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
2913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int ret = 0;
292814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__,
29305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed          blank==1 ? "Blanking":"Unblanking", dpy);
2947538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R    if(blank) {
2957538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R        // free up all the overlay pipes in use
2967538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R        // when we get a blank for either display
2977538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R        // makes sure that all pipes are freed
2987538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R        ctx->mOverlay->configBegin();
2997538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R        ctx->mOverlay->configDone();
3007538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R        ctx->mRotMgr->clear();
3015ceb9c6a763418d5e0cf5da4e74b7a7c733fb4b1Saurabh Shah        overlay::Writeback::clear();
3027538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R    }
3033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    switch(dpy) {
3043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_PRIMARY:
3053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            if(blank) {
3067538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,
3077538c70d6707dbe6acfdf621d5abf2ae4ff8f9b8Arun Kumar K.R                            FB_BLANK_POWERDOWN);
3083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            } else {
30993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran                ret = ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK,FB_BLANK_UNBLANK);
3103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            }
3113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
3123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_EXTERNAL:
3133a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar        case HWC_DISPLAY_VIRTUAL:
3143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            if(blank) {
31593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran                // call external framebuffer commit on blank,
31693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran                // so that any pipe unsets gets committed
31793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran                if (display_commit(ctx, dpy) < 0) {
3180e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R                    ret = -1;
31985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                    ALOGE("%s:post failed for external display !! ",
32085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          __FUNCTION__);
3210e1c2eacd284d16c49908c11187ad3703b227cafArun Kumar K.R                }
3223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            } else {
3233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            }
3243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
3253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        default:
3263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            return -EINVAL;
3273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
328abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R    // Enable HPD here, as during bootup unblank is called
329abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R    // when SF is completely initialized
330abc785f17cdec8760e948f5691e435de8760f368Arun Kumar K.R    ctx->mExtDisplay->setHPD(1);
33105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed    if(ret == 0){
33205207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed        ctx->dpyAttr[dpy].isActive = !blank;
33305207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed    } else {
33405207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed        ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__,
33505207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed              blank==1 ? "blanking":"unblanking", dpy, strerror(errno));
3363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        return ret;
3375b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    }
33805207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed
339814812663bf173ab5aecd06a228b4a3afcce9798Naseer Ahmed    ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__,
34005207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed          blank==1 ? "blanking":"unblanking", dpy);
3415b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    return 0;
3425b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed}
3435b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed
3445b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev,
34572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed                     int param, int* value)
34672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{
34772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
3483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int supported = HWC_DISPLAY_PRIMARY_BIT;
34972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
35072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    switch (param) {
35172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    case HWC_BACKGROUND_LAYER_SUPPORTED:
35272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        // Not supported for now
35372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        value[0] = 0;
35472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        break;
3553e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    case HWC_DISPLAY_TYPES_SUPPORTED:
356c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        if(ctx->mMDP.hasOverlay)
357c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            supported |= HWC_DISPLAY_EXTERNAL_BIT;
3583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        value[0] = supported;
3593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        break;
36072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    default:
36172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        return -EINVAL;
36272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    }
36372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    return 0;
36472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
36572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
36672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
36793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
3683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) {
3696195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    ATRACE_CALL();
370eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah    int ret = 0;
3716457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    const int dpy = HWC_DISPLAY_PRIMARY;
372eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah
373a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) {
374c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        uint32_t last = list->numHwLayers - 1;
375c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
3766c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
3776195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        bool copybitDone = false;
3786c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        if(ctx->mCopyBit[dpy])
3796195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
380a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
381a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
38285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
38385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
38436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
38565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            ret = -1;
38665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        }
38765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
3883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        //TODO We dont check for SKIP flag on this layer because we need PAN
3893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        //always. Last layer is always FB
3906ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
3916195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        if(copybitDone) {
3926195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
3936195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        }
3946ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah
3956ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        if(hnd) {
3966ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
3976ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah                ALOGE("%s: FBUpdate draw failed", __FUNCTION__);
3986ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah                ret = -1;
39965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed            }
400677311f0bc4a8716e86880d29a6b8051e4389da1Saurabh Shah        }
40193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
40293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        if (display_commit(ctx, dpy) < 0) {
40393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran            ALOGE("%s: display commit fail!", __FUNCTION__);
40476739f6c3dc9867ff6374c18c96a4eb056678238Ramkumar Radhakrishnan            ret = -1;
4053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        }
4063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
4070859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
4080859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah    closeAcquireFds(list);
409eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah    return ret;
4103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
4113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
4123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic int hwc_set_external(hwc_context_t *ctx,
4136195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed                            hwc_display_contents_1_t* list, int dpy)
4146195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed{
4156195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    ATRACE_CALL();
416eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah    int ret = 0;
417c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
418a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar    if (LIKELY(list) && ctx->dpyAttr[dpy].isActive &&
4193a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar        !ctx->dpyAttr[dpy].isPause &&
4206457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ctx->dpyAttr[dpy].connected) {
4213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        uint32_t last = list->numHwLayers - 1;
422c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
4236c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        int fd = -1; //FenceFD from the Copybit(valid in async mode)
4246195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        bool copybitDone = false;
4256c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        if(ctx->mCopyBit[dpy])
4266195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed            copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd);
427c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
428a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar        if(list->numHwLayers > 1)
429a6a534a85c27f23f74d12da1423c7dfacdc90662Amara Venkata Mastan Manoj Kumar            hwc_sync(ctx, list, dpy, fd);
430c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
43185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
43285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            ALOGE("%s: MDPComp draw failed", __FUNCTION__);
433eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah            ret = -1;
434eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah        }
435c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
4366ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        private_handle_t *hnd = (private_handle_t *)fbLayer->handle;
4376195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        if(copybitDone) {
4386195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed            hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer();
4396195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        }
4406195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
4416ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah        if(hnd) {
4426195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed            if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) {
443d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
444eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah                ret = -1;
445eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah            }
446eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah        }
44793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
44893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        if (display_commit(ctx, dpy) < 0) {
44993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran            ALOGE("%s: display commit fail!", __FUNCTION__);
4506ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah            ret = -1;
4513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        }
4523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
4530859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
4540859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah    closeAcquireFds(list);
455eaf679142b75c55735e33bdd9ddd26d8294c4070Saurabh Shah    return ret;
4563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
4573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
4582ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmedstatic int hwc_set_virtual(hwc_context_t *ctx,
4592ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                           hwc_display_contents_1_t* list, int dpy)
4602ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed{
4612ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    //XXX: Implement set.
4622ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    closeAcquireFds(list);
463665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall    if (list) {
464665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall        // SF assumes HWC waits for the acquire fence and returns a new fence
465665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall        // that signals when we're done. Since we don't wait, and also don't
466665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall        // touch the buffer, we can just handle the acquire fence back to SF
467665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall        // as the retire fence.
468665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall        list->retireFenceFd = list->outbufAcquireFenceFd;
469665dfb63994cc0a0040e685ed750673e2bc5ed0dJesse Hall    }
4702ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    return 0;
4712ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed}
4722ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed
4732ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed
4745b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev,
4755b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                   size_t numDisplays,
4765b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed                   hwc_display_contents_1_t** displays)
47729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
47829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int ret = 0;
47929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
4802ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    for (uint32_t i = 0; i < numDisplays; i++) {
4815b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        hwc_display_contents_1_t* list = displays[i];
4823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        switch(i) {
4833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            case HWC_DISPLAY_PRIMARY:
4843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                ret = hwc_set_primary(ctx, list);
485c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                break;
4863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            case HWC_DISPLAY_EXTERNAL:
4873a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar                ret = hwc_set_external(ctx, list, i);
488c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                break;
4892ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed            case HWC_DISPLAY_VIRTUAL:
4902ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                ret = hwc_set_virtual(ctx, list, i);
4912ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                break;
4923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            default:
4933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                ret = -EINVAL;
4945b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed        }
4953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
49616292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed    // This is only indicative of how many times SurfaceFlinger posts
49716292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed    // frames to the display.
49816292d0097fa8f455a2a7b10b6af5144b7def9ddNaseer Ahmed    CALC_FPS();
4994e9a6fcae996778da1343e41693788f27af450faSaurabh Shah    MDPComp::resetIdleFallBack();
50004af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah    ctx->mVideoTransFlag = false;
5010ddfa307452987336b5ec22967ba701c221f8402Saurabh Shah    //Was locked at the beginning of prepare
50201f9a13e06f5b25788dfb042d20583ce2f974579Saurabh Shah    ctx->mDrawLock.unlock();
5033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return ret;
5043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
505f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
5063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp,
5073e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        uint32_t* configs, size_t* numConfigs) {
5083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int ret = 0;
509c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
5103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //in 1.1 there is no way to choose a config, report as config id # 0
5113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //This config is passed to getDisplayAttributes. Ignore for now.
5123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    switch(disp) {
5133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_PRIMARY:
514c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            if(*numConfigs > 0) {
515c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                configs[0] = 0;
516c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                *numConfigs = 1;
517c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            }
518c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ret = 0; //NO_ERROR
5193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_EXTERNAL:
521c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ret = -1; //Not connected
522c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            if(ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected) {
523c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                ret = 0; //NO_ERROR
524c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                if(*numConfigs > 0) {
525c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                    configs[0] = 0;
526c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                    *numConfigs = 1;
527c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                }
528c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            }
5293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5305b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    }
53129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return ret;
53229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
53329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp,
5353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        uint32_t config, const uint32_t* attributes, int32_t* values) {
5363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
5373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    hwc_context_t* ctx = (hwc_context_t*)(dev);
538c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //If hotpluggable displays are inactive return error
539c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    if(disp == HWC_DISPLAY_EXTERNAL && !ctx->dpyAttr[disp].connected) {
540c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        return -1;
541c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    }
542c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
5433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //From HWComposer
5443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    static const uint32_t DISPLAY_ATTRIBUTES[] = {
5453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        HWC_DISPLAY_VSYNC_PERIOD,
5463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        HWC_DISPLAY_WIDTH,
5473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        HWC_DISPLAY_HEIGHT,
5483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        HWC_DISPLAY_DPI_X,
5493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        HWC_DISPLAY_DPI_Y,
5503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        HWC_DISPLAY_NO_ATTRIBUTE,
5513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    };
5523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
5533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) /
5543e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            sizeof(DISPLAY_ATTRIBUTES)[0]);
5553e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
5563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) {
5573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        switch (attributes[i]) {
5583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_VSYNC_PERIOD:
5593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            values[i] = ctx->dpyAttr[disp].vsync_period;
5603e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5613e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_WIDTH:
5623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            values[i] = ctx->dpyAttr[disp].xres;
563c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp,
564c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                    ctx->dpyAttr[disp].xres);
5653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_HEIGHT:
5673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            values[i] = ctx->dpyAttr[disp].yres;
568c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp,
569c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                    ctx->dpyAttr[disp].yres);
5703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_DPI_X:
5727b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0);
5733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_DPI_Y:
5757b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed            values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0);
5763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
5773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        default:
5783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            ALOGE("Unknown display attribute %d",
5793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    attributes[i]);
5803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            return -EINVAL;
5813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        }
5823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
5833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return 0;
5843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
5853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
5863b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len)
5873b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed{
5883b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed    hwc_context_t* ctx = (hwc_context_t*)(dev);
58901f9a13e06f5b25788dfb042d20583ce2f974579Saurabh Shah    Locker::Autolock _l(ctx->mDrawLock);
590f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    android::String8 aBuf("");
591f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    dumpsys_log(aBuf, "Qualcomm HWC state:\n");
592f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    dumpsys_log(aBuf, "  MDPVersion=%d\n", ctx->mMDP.version);
593f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    dumpsys_log(aBuf, "  DisplayPanel=%c\n", ctx->mMDP.panel);
59485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    for(int dpy = 0; dpy < MAX_DISPLAYS; dpy++) {
59585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(ctx->mMDPComp[dpy])
59685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            ctx->mMDPComp[dpy]->dump(aBuf);
59785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    }
598f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    char ovDump[2048] = {'\0'};
599f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    ctx->mOverlay->getDump(ovDump, 2048);
600f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    dumpsys_log(aBuf, ovDump);
60136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ovDump[0] = '\0';
60289cadba6f59425c741d9f376a1f407fcb3bae675Saurabh Shah    ctx->mRotMgr->getDump(ovDump, 1024);
60336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    dumpsys_log(aBuf, ovDump);
604f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    strlcpy(buff, aBuf.string(), buff_len);
6053b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed}
6063b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed
60729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev)
60829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
60929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(!dev) {
61072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        ALOGE("%s: NULL device pointer", __FUNCTION__);
61129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return -1;
61229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
61329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    closeContext((hwc_context_t*)dev);
61429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    free(dev);
61529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
61629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return 0;
61729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
61829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
61929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name,
62029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                           struct hw_device_t** device)
62129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
62229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int status = -EINVAL;
62329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
62429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
62529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        struct hwc_context_t *dev;
62629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        dev = (hwc_context_t*)malloc(sizeof(*dev));
62729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        memset(dev, 0, sizeof(*dev));
62872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
62972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        //Initialize hwc context
63029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        initContext(dev);
63172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
63272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        //Setup HWC methods
6333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.common.tag          = HARDWARE_DEVICE_TAG;
634a5b5aebd86ed595990435692e7e7ede31aeb63dcSaurabh Shah        dev->device.common.version      = HWC_DEVICE_API_VERSION_1_3;
6353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.common.module       = const_cast<hw_module_t*>(module);
6363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.common.close        = hwc_device_close;
6373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.prepare             = hwc_prepare;
6383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.set                 = hwc_set;
6393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.eventControl        = hwc_eventControl;
6403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.blank               = hwc_blank;
6413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.query               = hwc_query;
6423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.registerProcs       = hwc_registerProcs;
6433b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed        dev->device.dump                = hwc_dump;
6443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.getDisplayConfigs   = hwc_getDisplayConfigs;
6453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        dev->device.getDisplayAttributes = hwc_getDisplayAttributes;
6463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        *device = &dev->device.common;
64729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        status = 0;
64829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
64929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return status;
65029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
651