hwc_virtual.cpp revision d7118ba43609fd9fcc792c69f07c1464b276f2ad
1140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan/* 2140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * Copyright (C) 2010 The Android Open Source Project 3140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 4140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * 5140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * Not a Contribution, Apache license notifications and license are retained 6140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * for attribution purposes only. 7140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * 8140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * Licensed under the Apache License, Version 2.0 (the "License"); 9140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * you may not use this file except in compliance with the License. 10140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * You may obtain a copy of the License at 11140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * 12140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * http://www.apache.org/licenses/LICENSE-2.0 13140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * 14140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * Unless required by applicable law or agreed to in writing, software 15140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * distributed under the License is distributed on an "AS IS" BASIS, 16140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * See the License for the specific language governing permissions and 18140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * limitations under the License. 19140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan */ 20140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include <fcntl.h> 21140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include <errno.h> 22140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 23140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include <cutils/log.h> 24140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include <utils/Trace.h> 25140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include <overlayWriteback.h> 26140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_utils.h" 27140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_fbupdate.h" 28140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_mdpcomp.h" 29140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_dump_layers.h" 30140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_copybit.h" 31140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_virtual.h" 32140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 33140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#define HWCVIRTUAL_LOG 0 34140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 35140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanusing namespace qhwc; 36140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanusing namespace overlay; 37140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 38140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar RadhakrishnanHWCVirtualBase* HWCVirtualBase::getObject() { 39140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan char property[PROPERTY_VALUE_MAX]; 40140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 41140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if((property_get("persist.hwc.enable_vds", property, NULL) > 0)) { 42140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(atoi(property) != 0) { 43140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGD_IF(HWCVIRTUAL_LOG, "%s: VDS is enabled for Virtual display", 44140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan __FUNCTION__); 45140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return new HWCVirtualVDS(); 46140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 47140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 48140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGD_IF(HWCVIRTUAL_LOG, "%s: V4L2 is enabled for Virtual display", 49140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan __FUNCTION__); 50140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return new HWCVirtualV4L2(); 51140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 52140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 53140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanvoid HWCVirtualVDS::init(hwc_context_t *ctx) { 54140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int dpy = HWC_DISPLAY_VIRTUAL; 55140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mFBUpdate[dpy] = 56140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan IFBUpdate::getObject(ctx, dpy); 57140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mMDPComp[dpy] = MDPComp::getObject(ctx, dpy); 58140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 59140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mFBUpdate[dpy]) 60140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mFBUpdate[dpy]->reset(); 61140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDPComp[dpy]) 62140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mMDPComp[dpy]->reset(); 63140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 64140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 65140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanvoid HWCVirtualVDS::destroy(hwc_context_t *ctx, size_t numDisplays, 66140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_display_contents_1_t** displays) { 67140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int dpy = HWC_DISPLAY_VIRTUAL; 68140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 69140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //Cleanup virtual display objs, since there is no explicit disconnect 70140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->dpyAttr[dpy].connected && 71140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan (numDisplays <= HWC_NUM_PHYSICAL_DISPLAY_TYPES || 72140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan displays[dpy] == NULL)) { 73140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].connected = false; 74140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 75140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mFBUpdate[dpy]) { 76140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan delete ctx->mFBUpdate[dpy]; 77140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mFBUpdate[dpy] = NULL; 78140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 79140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDPComp[dpy]) { 80140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan delete ctx->mMDPComp[dpy]; 81140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mMDPComp[dpy] = NULL; 82140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 83140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 84140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 85140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 86140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanint HWCVirtualVDS::prepare(hwc_composer_device_1 *dev, 87140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_display_contents_1_t *list) { 88140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ATRACE_CALL(); 89140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //XXX: Fix when framework support is added 90140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_context_t* ctx = (hwc_context_t*)(dev); 91140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int dpy = HWC_DISPLAY_VIRTUAL; 92140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 93d7118ba43609fd9fcc792c69f07c1464b276f2adTatenda Chipeperekwa if (list && list->numHwLayers > 0) { 94140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 95140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan uint32_t last = list->numHwLayers - 1; 96140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 97140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int fbWidth = 0, fbHeight = 0; 98140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan getLayerResolution(fbLayer, fbWidth, fbHeight); 99140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].xres = fbWidth; 100140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].yres = fbHeight; 101140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 102140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->dpyAttr[dpy].connected == false) { 103140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].connected = true; 104140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan init(ctx); 105140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //First round, just setup and return so primary can free pipes 106140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return 0; 107140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 108140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 109140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].isConfiguring = false; 110140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].fd = Writeback::getInstance()->getFbFd(); 111140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan Writeback::getInstance()->configureDpyInfo(fbWidth, fbHeight); 112140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan setListStats(ctx, list, dpy); 113140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 114140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 115140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int fbZ = 0; 116140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 117140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 118140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 119140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return 0; 120140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 121140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 122140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanint HWCVirtualVDS::set(hwc_context_t *ctx, hwc_display_contents_1_t *list) { 123140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ATRACE_CALL(); 124140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int ret = 0; 125140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int dpy = HWC_DISPLAY_VIRTUAL; 126140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 127d7118ba43609fd9fcc792c69f07c1464b276f2adTatenda Chipeperekwa if (list && list->outbuf && list->numHwLayers > 0) { 128140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan uint32_t last = list->numHwLayers - 1; 129140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 130140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 131140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(fbLayer->handle && !isSecondaryConfiguring(ctx) && 132140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan !ctx->mMDPComp[dpy]->isGLESOnlyComp()) { 133140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan private_handle_t *ohnd = (private_handle_t *)list->outbuf; 134140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan Writeback::getInstance()->setOutputFormat( 135140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan utils::getMdpFormat(ohnd->format)); 136140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 137140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int fd = -1; //FenceFD from the Copybit 138140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_sync(ctx, list, dpy, fd); 139140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 140140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 141140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGE("%s: MDPComp draw failed", __FUNCTION__); 142140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = -1; 143140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 144140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (!ctx->mFBUpdate[dpy]->draw(ctx, 145140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan (private_handle_t *)fbLayer->handle)) { 146140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 147140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = -1; 148140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 149140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 150140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan Writeback::getInstance()->queueBuffer(ohnd->fd, ohnd->offset); 151140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 152140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGE("%s: display commit fail!", __FUNCTION__); 153140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = -1; 154140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 155140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 156140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } else if(list->outbufAcquireFenceFd >= 0) { 157140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //If we dont handle the frame, set retireFenceFd to outbufFenceFd, 158140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //which will make sure, the framework waits on it and closes it. 159140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //The other way is to wait on outbufFenceFd ourselves, close it and 160140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //set retireFenceFd to -1. Since we want hwc to be async, choosing 161140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //the former. 162140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan //Also dup because, the closeAcquireFds() will close the outbufFence 163140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan list->retireFenceFd = dup(list->outbufAcquireFenceFd); 164140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 165140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 166140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 167140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan closeAcquireFds(list); 168140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return ret; 169140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 170140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 171140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan/* Implementation for HWCVirtualV4L2 class */ 172140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 173140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanint HWCVirtualV4L2::prepare(hwc_composer_device_1 *dev, 174140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_display_contents_1_t *list) { 175140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ATRACE_CALL(); 176140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 177140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_context_t* ctx = (hwc_context_t*)(dev); 178140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int dpy = HWC_DISPLAY_VIRTUAL; 179140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 180140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (LIKELY(list && list->numHwLayers > 1) && 181140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].isActive && 182140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].connected) { 183140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 184140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(!ctx->dpyAttr[dpy].isPause) { 185140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].isConfiguring = false; 186140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan setListStats(ctx, list, dpy); 187140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 188140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int fbZ = 0; 189140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mFBUpdate[dpy]->prepare(ctx, list, fbZ); 190140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 191140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } else { 192140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan /* Virtual Display is in Pause state. 193140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * Mark all application layers as OVERLAY so that 194140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan * GPU will not compose. 195140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan */ 196140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) { 197140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_layer_1_t *layer = &list->hwLayers[i]; 198140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan layer->compositionType = HWC_OVERLAY; 199140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 200140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 201140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 202140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return 0; 203140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 204140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 205140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanint HWCVirtualV4L2::set(hwc_context_t *ctx, hwc_display_contents_1_t *list) { 206140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ATRACE_CALL(); 207140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int ret = 0; 208140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 209140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan const int dpy = HWC_DISPLAY_VIRTUAL; 210140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 211140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 212140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[dpy].connected && 213140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan !ctx->dpyAttr[dpy].isPause) { 214140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan uint32_t last = list->numHwLayers - 1; 215140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 216140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int fd = -1; //FenceFD from the Copybit(valid in async mode) 217140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan bool copybitDone = false; 218140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mCopyBit[dpy]) 219140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 220140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 221140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(list->numHwLayers > 1) 222140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_sync(ctx, list, dpy, fd); 223140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 224140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan // Dump the layers for virtual 225140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 226140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 227140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 228140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 229140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGE("%s: MDPComp draw failed", __FUNCTION__); 230140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = -1; 231140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 232140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 233140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan int extOnlyLayerIndex = 234140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->listStats[dpy].extOnlyLayerIndex; 235140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 236140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 237140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(extOnlyLayerIndex!= -1) { 238140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 239140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hnd = (private_handle_t *)extLayer->handle; 240140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } else if(copybitDone) { 241140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 242140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 243140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 244140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(hnd && !isYuvBuffer(hnd)) { 245140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 246140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 247140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = -1; 248140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 249140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 250140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 251140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 252140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 253140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = -1; 254140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 255140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 256140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 257140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan closeAcquireFds(list); 258140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 259140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if (list && !ctx->mVirtualonExtActive && (list->retireFenceFd < 0) ) { 260140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan // SF assumes HWC waits for the acquire fence and returns a new fence 261140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan // that signals when we're done. Since we don't wait, and also don't 262140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan // touch the buffer, we can just handle the acquire fence back to SF 263140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan // as the retire fence. 264140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan list->retireFenceFd = list->outbufAcquireFenceFd; 265140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 266140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 267140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return ret; 268140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 269