1d80659c540b719660c7af9f530445268bc409db6Saurabh Shah/*
2d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* Copyright (c) 2013 The Linux Foundation. All rights reserved.
3d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*
4d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* Redistribution and use in source and binary forms, with or without
5d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* modification, are permitted provided that the following conditions are
6d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* met:
7d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*    * Redistributions of source code must retain the above copyright
8d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*      notice, this list of conditions and the following disclaimer.
9d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*    * Redistributions in binary form must reproduce the above
10d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*      copyright notice, this list of conditions and the following
11d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*      disclaimer in the documentation and/or other materials provided
12d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*      with the distribution.
13d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*    * Neither the name of The Linux Foundation. nor the names of its
14d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*      contributors may be used to endorse or promote products derived
15d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*      from this software without specific prior written permission.
16d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*
17d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27d80659c540b719660c7af9f530445268bc409db6Saurabh Shah* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d80659c540b719660c7af9f530445268bc409db6Saurabh Shah*/
29d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
30d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include <unistd.h>
31d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include <overlay.h>
32d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include <overlayUtils.h>
33d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include <overlayWriteback.h>
34d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include <mdp_version.h>
35d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include "hwc_ad.h"
36d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#include "hwc_utils.h"
37d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
38d80659c540b719660c7af9f530445268bc409db6Saurabh Shah#define DEBUG 0
39d80659c540b719660c7af9f530445268bc409db6Saurabh Shahusing namespace overlay;
40d80659c540b719660c7af9f530445268bc409db6Saurabh Shahusing namespace overlay::utils;
41d80659c540b719660c7af9f530445268bc409db6Saurabh Shahnamespace qhwc {
42d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
43d80659c540b719660c7af9f530445268bc409db6Saurabh Shah//Opens writeback framebuffer and returns fd.
44d80659c540b719660c7af9f530445268bc409db6Saurabh Shahstatic int openWbFb() {
45d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int wbFd = -1;
46d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    //Check opening which FB would connect LM to WB
47d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    const int wbFbNum = Overlay::getFbForDpy(Overlay::DPY_WRITEBACK);
48d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(wbFbNum >= 0) {
49d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        char wbFbPath[256];
50d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        snprintf (wbFbPath, sizeof(wbFbPath),
51d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                "/sys/class/graphics/fb%d", wbFbNum);
52d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        //Opening writeback fb first time would create ad node if the device
53d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        //supports adaptive display
54d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        wbFd = open(wbFbPath, O_RDONLY);
55d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(wbFd < 0) {
56d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGE("%s: Failed to open /sys/class/graphics/fb%d with error %s",
57d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                    __func__, wbFbNum, strerror(errno));
58d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
59d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    } else {
60d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGD_IF(DEBUG, "%s: No writeback available", __func__);
61d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
62d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    return wbFd;
63d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
64d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
65d80659c540b719660c7af9f530445268bc409db6Saurabh Shahstatic inline void closeWbFb(int& fd) {
66d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(fd >= 0) {
67d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        close(fd);
68d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        fd = -1;
69d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    } else {
70d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s: Invalid fd %d", __func__, fd);
71d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
72d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
73d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
74d80659c540b719660c7af9f530445268bc409db6Saurabh Shah//Helper to write data to ad node
75d80659c540b719660c7af9f530445268bc409db6Saurabh Shahstatic void adWrite(const int& value) {
76d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    const int wbFbNum = Overlay::getFbForDpy(Overlay::DPY_WRITEBACK);
77d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    char wbFbPath[256];
78d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    snprintf (wbFbPath, sizeof(wbFbPath),
79d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            "/sys/class/graphics/fb%d/ad", wbFbNum);
80d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int adFd = open(wbFbPath, O_WRONLY);
81d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(adFd >= 0) {
82d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        char opStr[4] = "";
83d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        snprintf(opStr, sizeof(opStr), "%d", value);
84d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        int ret = write(adFd, opStr, strlen(opStr));
85d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(ret < 0) {
86d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGE("%s: Failed to write %d with error %s",
87d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                    __func__, value, strerror(errno));
88d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        } else if (ret == 0){
89d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGE("%s Nothing written to ad", __func__);
90d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        } else {
91d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGD_IF(DEBUG, "%s: Wrote %d to ad", __func__, value);
92d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
93d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        close(adFd);
94d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    } else {
95d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s: Failed to open /sys/class/graphics/fb%d/ad with error %s",
96d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                __func__, wbFbNum, strerror(errno));
97d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
98d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
99d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
100d80659c540b719660c7af9f530445268bc409db6Saurabh Shah//Helper to read data from ad node
101d80659c540b719660c7af9f530445268bc409db6Saurabh Shahstatic int adRead() {
102d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    const int wbFbNum = Overlay::getFbForDpy(Overlay::DPY_WRITEBACK);
103d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int ret = -1;
104d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    char wbFbPath[256];
105d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    snprintf (wbFbPath, sizeof(wbFbPath),
106d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            "/sys/class/graphics/fb%d/ad", wbFbNum);
107d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int adFd = open(wbFbPath, O_RDONLY);
108d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(adFd >= 0) {
109d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        char opStr[4] = {'\0'};
110d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(read(adFd, opStr, strlen(opStr)) >= 0) {
111d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            //Should return -1, 0 or 1
112d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ret = atoi(opStr);
113d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGD_IF(DEBUG, "%s: Read %d from ad", __func__, ret);
114d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        } else {
115d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGE("%s: Read from ad node failed with error %s", __func__,
116d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                    strerror(errno));
117d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
118d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        close(adFd);
119d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    } else {
120e43bb379c4b8f336800551a1ed22e60b52e7887cNaseer Ahmed        ALOGD("%s: /sys/class/graphics/fb%d/ad could not be opened : %s",
121d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                __func__, wbFbNum, strerror(errno));
122d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
123d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    return ret;
124d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
125d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
126d80659c540b719660c7af9f530445268bc409db6Saurabh ShahAssertiveDisplay::AssertiveDisplay() :mWbFd(-1), mDoable(false),
127d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mFeatureEnabled(false), mDest(overlay::utils::OV_INVALID) {
128d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int fd = openWbFb();
129d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(fd >= 0) {
130d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        //-1 means feature is disabled on device
131d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        // 0 means feature exists but turned off, will be turned on by hwc
132d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        // 1 means feature is turned on by hwc
133d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(adRead() >= 0) {
134d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ALOGD_IF(DEBUG, "Assertive display feature supported");
135d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            mFeatureEnabled = true;
136d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
137d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        closeWbFb(fd);
138d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
139d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
140d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
141d80659c540b719660c7af9f530445268bc409db6Saurabh Shahvoid AssertiveDisplay::markDoable(hwc_context_t *ctx,
142d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        const hwc_display_contents_1_t* list) {
143d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    mDoable = false;
144d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(mFeatureEnabled &&
145b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah        !isSecondaryConnected(ctx) &&
146d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ctx->listStats[HWC_DISPLAY_PRIMARY].yuvCount == 1) {
147d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        int nYuvIndex = ctx->listStats[HWC_DISPLAY_PRIMARY].yuvIndices[0];
148d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        const hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex];
149d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
150d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(hnd && hnd->width <= qdutils::MAX_DISPLAY_DIM) {
151d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            mDoable = true;
152d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
153d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
154d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
155d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
156d80659c540b719660c7af9f530445268bc409db6Saurabh Shahbool AssertiveDisplay::prepare(hwc_context_t *ctx,
157d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        const hwc_rect_t& crop,
158d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        const Whf& whf,
159d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        const private_handle_t *hnd) {
160d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(!isDoable()) {
161d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(isModeOn()) {
162d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            //Cleanup one time during this switch
163d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            const int off = 0;
164d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            adWrite(off);
165d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            closeWbFb(mWbFd);
166d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
167d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
168d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
169d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
170d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    ovutils::eDest dest = ctx->mOverlay->nextPipe(ovutils::OV_MDP_PIPE_VG,
171d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            overlay::Overlay::DPY_WRITEBACK, Overlay::MIXER_DEFAULT);
172d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(dest == OV_INVALID) {
173d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s failed: No VG pipe available", __func__);
174d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mDoable = false;
175d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
176d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
177d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
178d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    overlay::Writeback *wb = overlay::Writeback::getInstance();
179d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
180d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(!wb->configureDpyInfo(hnd->width, hnd->height)) {
181d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s: config display failed", __func__);
182d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mDoable = false;
183d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
184d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
185d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
186d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int tmpW, tmpH, size;
187d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    int format = ovutils::getHALFormat(wb->getOutputFormat());
188d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(format < 0) {
189d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s invalid format %d", __func__, format);
190d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mDoable = false;
191d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
192d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
193d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
194d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    size = getBufferSizeAndDimensions(hnd->width, hnd->height,
195d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                format, tmpW, tmpH);
196d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
197d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(!wb->configureMemory(size, isSecureBuffer(hnd))) {
198d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s: config memory failed", __func__);
199d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mDoable = false;
200d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
201d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
202d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
203d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    eMdpFlags mdpFlags = OV_MDP_FLAGS_NONE;
204d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(isSecureBuffer(hnd)) {
205d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ovutils::setMdpFlags(mdpFlags,
206d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
207d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
208d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
209d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    PipeArgs parg(mdpFlags, whf, ZORDER_0, IS_FG_OFF,
210d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ROT_FLAGS_NONE,
211d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ovutils::DEFAULT_PLANE_ALPHA,
212d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            ovutils::OVERLAY_BLENDING_OPAQUE);
213d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    hwc_rect_t dst = crop; //input same as output
214d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
215d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(configMdp(ctx->mOverlay, parg, OVERLAY_TRANSFORM_0, crop, dst, NULL,
216d80659c540b719660c7af9f530445268bc409db6Saurabh Shah                dest) < 0) {
217d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s: configMdp failed", __func__);
218d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mDoable = false;
219d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
220d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
221d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
222d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    mDest = dest;
223d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(!isModeOn()) {
224d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        mWbFd = openWbFb();
225d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        if(mWbFd >= 0) {
226d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            //write to sysfs, one time during this switch
227d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            const int on = 1;
228d80659c540b719660c7af9f530445268bc409db6Saurabh Shah            adWrite(on);
229d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        }
230d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
231d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    return true;
232d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
233d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
234d80659c540b719660c7af9f530445268bc409db6Saurabh Shahbool AssertiveDisplay::draw(hwc_context_t *ctx, int fd, uint32_t offset) {
235d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(!isDoable() || !isModeOn()) {
236d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
237d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
238d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
239d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if (!ctx->mOverlay->queueBuffer(fd, offset, mDest)) {
240d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        ALOGE("%s: queueBuffer failed", __func__);
241d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
242d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
243d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
244d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    overlay::Writeback *wb = overlay::Writeback::getInstance();
245d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    if(!wb->writeSync()) {
246d80659c540b719660c7af9f530445268bc409db6Saurabh Shah        return false;
247d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    }
248d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
249d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    return true;
250d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
251d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
252d80659c540b719660c7af9f530445268bc409db6Saurabh Shahint AssertiveDisplay::getDstFd(hwc_context_t *ctx) const {
253d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    overlay::Writeback *wb = overlay::Writeback::getInstance();
254d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    return wb->getDstFd();
255d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
256d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
257d80659c540b719660c7af9f530445268bc409db6Saurabh Shahuint32_t AssertiveDisplay::getDstOffset(hwc_context_t *ctx) const {
258d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    overlay::Writeback *wb = overlay::Writeback::getInstance();
259d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    return wb->getOffset();
260d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
261d80659c540b719660c7af9f530445268bc409db6Saurabh Shah
262d80659c540b719660c7af9f530445268bc409db6Saurabh Shah}
263