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