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