107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*
207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2010 The Android Open Source Project
307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Not a Contribution, Apache license notifications and license are retained
607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * for attribution purposes only.
707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Licensed under the Apache License, Version 2.0 (the "License");
907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * you may not use this file except in compliance with the License.
1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * You may obtain a copy of the License at
1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *      http://www.apache.org/licenses/LICENSE-2.0
1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Unless required by applicable law or agreed to in writing, software
1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * distributed under the License is distributed on an "AS IS" BASIS,
1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * See the License for the specific language governing permissions and
1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * limitations under the License.
1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */
2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <fcntl.h>
2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <errno.h>
2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/log.h>
2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <overlayWriteback.h>
2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_utils.h"
2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_fbupdate.h"
2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_mdpcomp.h"
2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_dump_layers.h"
2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_copybit.h"
3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_virtual.h"
3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "sync/sync.h"
3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <utils/Trace.h>
3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define HWCVIRTUAL_LOG 0
3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniusing namespace qhwc;
3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniusing namespace overlay;
3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool HWCVirtualVDS::sVDDumpEnabled = false;
4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HWCVirtualVDS::init(hwc_context_t *ctx) {
4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    const int dpy = HWC_DISPLAY_VIRTUAL;
4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    mScalingWidth = 0, mScalingHeight = 0;
4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    initCompositionResources(ctx, dpy);
4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if(ctx->mFBUpdate[dpy])
4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->mFBUpdate[dpy]->reset();
4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if(ctx->mMDPComp[dpy])
4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->mMDPComp[dpy]->reset();
5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HWCVirtualVDS::destroy(hwc_context_t *ctx, size_t /*numDisplays*/,
5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                       hwc_display_contents_1_t** displays) {
5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int dpy = HWC_DISPLAY_VIRTUAL;
5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    //Cleanup virtual display objs, since there is no explicit disconnect
5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if(ctx->dpyAttr[dpy].connected && (displays[dpy] == NULL)) {
5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->dpyAttr[dpy].connected = false;
5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->dpyAttr[dpy].isPause = false;
6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        destroyCompositionResources(ctx, dpy);
6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        // signal synclock to indicate successful wfd teardown
6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->mWfdSyncLock.lock();
6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->mWfdSyncLock.signal();
6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->mWfdSyncLock.unlock();
6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint HWCVirtualVDS::prepare(hwc_composer_device_1 *dev,
7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwc_display_contents_1_t *list) {
7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ATRACE_CALL();
7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    //XXX: Fix when framework support is added
7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_context_t* ctx = (hwc_context_t*)(dev);
7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    const int dpy = HWC_DISPLAY_VIRTUAL;
7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (list && list->outbuf && list->numHwLayers > 0) {
7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1);
7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        uint32_t last = (uint32_t)list->numHwLayers - 1;
8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int fbWidth = 0, fbHeight = 0;
8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        getLayerResolution(fbLayer, fbWidth, fbHeight);
8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->dpyAttr[dpy].xres = fbWidth;
8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ctx->dpyAttr[dpy].yres = fbHeight;
8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if(ctx->dpyAttr[dpy].connected == false) {
8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->dpyAttr[dpy].connected = true;
8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->dpyAttr[dpy].isPause = false;
8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // We set the vsync period to the primary refresh rate, leaving
9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // it up to the consumer to decide how fast to consume frames.
9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->dpyAttr[dpy].vsync_period
9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                              = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period;
9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->dpyAttr[dpy].fbformat = HAL_PIXEL_FORMAT_RGBA_8888;
9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            init(ctx);
9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // Do one padding round for cases where primary has all pipes
9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // The virtual composition falls back to GPU in such cases.
9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->isPaddingRound = true;
9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if(!ctx->dpyAttr[dpy].isPause) {
10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->dpyAttr[dpy].isConfiguring = false;
10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            ctx->dpyAttr[dpy].fd = Writeback::getInstance()->getFbFd();
10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            private_handle_t *ohnd = (private_handle_t *)list->outbuf;
10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            setMDPScalingMode(ctx, ohnd, dpy);
10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mScalingWidth = getWidth(ohnd);
10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            mScalingHeight = getHeight(ohnd);
10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            Writeback::getInstance()->configureDpyInfo(mScalingWidth,
11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                        mScalingHeight);
11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            setListStats(ctx, list, dpy);
11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) {
11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                const int fbZ = 0;
11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ))
11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                {
11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    ctx->mOverlay->clear(dpy);
11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    ctx->mLayerRotMap[dpy]->clear();
11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                }
12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        } else {
12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            /* Virtual Display is in Pause state.
12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             * Mark all application layers as OVERLAY so that
12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             * GPU will not compose.
12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani             */
12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            Writeback::getInstance(); //Ensure that WB is active during pause
12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) {
12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                hwc_layer_1_t *layer = &list->hwLayers[i];
12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                layer->compositionType = HWC_OVERLAY;
13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    return 0;
13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint HWCVirtualVDS::set(hwc_context_t *ctx, hwc_display_contents_1_t *list) {
13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ATRACE_CALL();
13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int ret = 0;
13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    const int dpy = HWC_DISPLAY_VIRTUAL;
14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if (list && list->outbuf && list->numHwLayers > 0) {
14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        uint32_t last = (uint32_t)list->numHwLayers - 1;
14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        hwc_layer_1_t *fbLayer = &list->hwLayers[last];
14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if(ctx->dpyAttr[dpy].connected
14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                && (!ctx->dpyAttr[dpy].isPause))
14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        {
14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            private_handle_t *ohnd = (private_handle_t *)list->outbuf;
14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            int format = ohnd->format;
15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if (format == HAL_PIXEL_FORMAT_RGBA_8888)
15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                format = HAL_PIXEL_FORMAT_RGBX_8888;
15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            Writeback::getInstance()->setOutputFormat(
15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                    utils::getMdpFormat(format));
15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // Configure WB secure mode based on output buffer handle
15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if(! Writeback::getInstance()->setSecure(isSecureBuffer(ohnd)))
15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            {
15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ALOGE("Failed to set WB secure mode: %d for virtual display",
15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    isSecureBuffer(ohnd));
16007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                return false;
16107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
16207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
16307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            int fd = -1; //FenceFD from the Copybit
16407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_sync(ctx, list, dpy, fd);
16507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
16607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // Dump the layers for virtual
16707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if(ctx->mHwcDebug[dpy])
16807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ctx->mHwcDebug[dpy]->dumpLayers(list);
16907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
17007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if (!ctx->mMDPComp[dpy]->draw(ctx, list)) {
17107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ALOGE("%s: MDPComp draw failed", __FUNCTION__);
17207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ret = -1;
17307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
17407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // We need an FB layer handle check to cater for this usecase:
17507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // Video is playing in landscape on primary, then launch
17607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // ScreenRecord app.
17707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // In this scenario, the first VDS draw call will have HWC
17807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // composition and VDS does nit involve GPU to get eglSwapBuffer
17907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            // to get valid fb handle.
18007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if (fbLayer->handle && !ctx->mFBUpdate[dpy]->draw(ctx,
18107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                        (private_handle_t *)fbLayer->handle)) {
18207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__);
18307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ret = -1;
18407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
18507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
18607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            Writeback::getInstance()->queueBuffer(ohnd->fd,
18707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                        (uint32_t)ohnd->offset);
18807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) {
18907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ALOGE("%s: display commit fail!", __FUNCTION__);
19007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                ret = -1;
19107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
19207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
19307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            if(sVDDumpEnabled) {
19407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                char bufferName[128];
19507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                // Dumping frame buffer
19607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                sync_wait(fbLayer->acquireFenceFd, 1000);
19707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                snprintf(bufferName, sizeof(bufferName), "vds.fb");
19807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                dumpBuffer((private_handle_t *)fbLayer->handle, bufferName);
19907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                // Dumping WB output for non-secure session
20007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                if(!isSecureBuffer(ohnd)) {
20107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    sync_wait(list->retireFenceFd, 1000);
20207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    snprintf(bufferName, sizeof(bufferName), "vds.wb");
20307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    dumpBuffer(ohnd, bufferName);
20407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                }
20507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            }
20607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        } else if(list->outbufAcquireFenceFd >= 0) {
20707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            //If we dont handle the frame, set retireFenceFd to outbufFenceFd,
20807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            //which will make sure, the framework waits on it and closes it.
20907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            //The other way is to wait on outbufFenceFd ourselves, close it and
21007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            //set retireFenceFd to -1. Since we want hwc to be async, choosing
21107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            //the former.
21207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            //Also dup because, the closeAcquireFds() will close the outbufFence
21307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            list->retireFenceFd = dup(list->outbufAcquireFenceFd);
21407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        }
21507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
21607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
21707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    closeAcquireFds(list);
21807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    return ret;
21907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
22007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
22107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* We set scaling mode on the VD if the output handle width and height
22207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani   differs from the virtual frame buffer width and height. */
22307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid HWCVirtualVDS::setMDPScalingMode(hwc_context_t* ctx,
22407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        private_handle_t* ohnd, int dpy) {
22507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool scalingMode = false;
22607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int fbWidth = ctx->dpyAttr[dpy].xres;
22707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int fbHeight =  ctx->dpyAttr[dpy].yres;
22807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    if((getWidth(ohnd) != fbWidth) || (getHeight(ohnd) != fbHeight)) {
22907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        scalingMode = true;
23007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
23107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ctx->dpyAttr[dpy].mMDPScalingMode = scalingMode;
23207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
23307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ALOGD_IF(HWCVIRTUAL_LOG, "%s fb(%dx%d) outputBuffer(%dx%d) scalingMode=%d",
23407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            __FUNCTION__, fbWidth, fbHeight,
23507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            getWidth(ohnd), getHeight(ohnd), scalingMode);
23607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
237