129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
36c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation All rights reserved.
46c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R *
56c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained
66c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * for attribution purposes only.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License.
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License.
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
206c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R#define HWC_UTILS_DEBUG 0
21d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include <sys/ioctl.h>
22d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah#include <binder/IServiceManager.h>
235b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed#include <EGL/egl.h>
24fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah#include <cutils/properties.h>
25fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah#include <gralloc_priv.h>
26d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include <overlay.h>
2736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include <overlayRotator.h>
2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "hwc_utils.h"
2965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed#include "hwc_mdpcomp.h"
306457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah#include "hwc_fbupdate.h"
31a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed#include "mdp_version.h"
326c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R#include "hwc_copybit.h"
3356f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "external.h"
34d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah#include "hwc_qclient.h"
3556f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "QService.h"
366c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R#include "comptype.h"
37d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah
38d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shahusing namespace qClient;
39d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shahusing namespace qService;
40d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shahusing namespace android;
4136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahusing namespace overlay;
4236963690317abceae79621f14ba41ff62b3ff489Saurabh Shahusing namespace overlay::utils;
4336963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace ovutils = overlay::utils;
44d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace qhwc {
4672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
4793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaranstatic int openFramebufferDevice(hwc_context_t *ctx)
4872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{
4993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    struct fb_fix_screeninfo finfo;
5093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    struct fb_var_screeninfo info;
5193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
5293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    int fb_fd = openFb(HWC_DISPLAY_PRIMARY);
5393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
5493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &info) == -1)
5593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        return -errno;
5693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
5793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if (int(info.width) <= 0 || int(info.height) <= 0) {
5893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        // the driver doesn't return that information
5993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        // default to 160 dpi
6093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        info.width  = ((info.xres * 25.4f)/160.0f + 0.5f);
6193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        info.height = ((info.yres * 25.4f)/160.0f + 0.5f);
6293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    }
6393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
6493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    float xdpi = (info.xres * 25.4f) / info.width;
6593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    float ydpi = (info.yres * 25.4f) / info.height;
6693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
6793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran#ifdef MSMFB_METADATA_GET
6893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    struct msmfb_metadata metadata;
6993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    memset(&metadata, 0 , sizeof(metadata));
7093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    metadata.op = metadata_op_frame_rate;
7193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
7293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) {
7393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        ALOGE("Error retrieving panel frame rate");
7493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        return -errno;
7572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    }
7693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
7793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    float fps  = metadata.data.panel_frame_rate;
7893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran#else
7993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    //XXX: Remove reserved field usage on all baselines
8093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    //The reserved[3] field is used to store FPS by the driver.
8193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    float fps  = info.reserved[3] & 0xFF;
8293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran#endif
8393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
8493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) == -1)
8593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        return -errno;
8693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
8793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if (finfo.smem_len <= 0)
8893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        return -errno;
8993393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
9093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = fb_fd;
9193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    //xres, yres may not be 32 aligned
9293393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = finfo.line_length /(info.xres/8);
9393393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = info.xres;
9493393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = info.yres;
9593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = xdpi;
9693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ydpi;
9793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period = 1000000000l / fps;
9893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
9980c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed    //Unblank primary on first boot
10080c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed    if(ioctl(fb_fd, FBIOBLANK,FB_BLANK_UNBLANK) < 0) {
10180c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed        ALOGE("%s: Failed to unblank display", __FUNCTION__);
10280c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed        return -errno;
10380c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed    }
10480c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed    ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive = true;
10580c4c237b0c148d0c0537772221add57e4a2fde9Naseer Ahmed
10693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    return 0;
10772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
10872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
109b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmedstatic int ppdComm(const char* cmd, hwc_context_t *ctx) {
110b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    int ret = -1;
111be50f7b6b538e5cacf38f3a5ad127eb5d6f41a71naseer    ret = send(ctx->mCablProp.daemon_socket, cmd, strlen(cmd), MSG_NOSIGNAL);
112b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    if(ret < 0) {
1136285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed        if (errno == EPIPE) {
1146285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            //For broken pipe case, we will close the socket and
1156285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            //re-establish the connection
1166285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            close(ctx->mCablProp.daemon_socket);
1176285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            int daemon_socket = socket_local_client(DAEMON_SOCKET,
1186285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                    ANDROID_SOCKET_NAMESPACE_RESERVED,
1196285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                    SOCK_STREAM);
1206285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            if(!daemon_socket) {
1216285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                ALOGE("Connecting to socket failed: %s", strerror(errno));
1226285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                ctx->mCablProp.enabled = false;
1236285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                return -1;
1246285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            }
1256285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            struct timeval timeout;
1266285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            timeout.tv_sec = 1;//wait 1 second before timeout
1276285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            timeout.tv_usec = 0;
1286285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed
1296285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            if (setsockopt(daemon_socket, SOL_SOCKET, SO_SNDTIMEO,
1306285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                        (char*)&timeout, sizeof(timeout )) < 0)
1316285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                ALOGE("setsockopt failed");
1326285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed
1336285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            ctx->mCablProp.daemon_socket = daemon_socket;
134b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed            //resend the cmd after connection is re-established
135b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed            ret = send(ctx->mCablProp.daemon_socket, cmd, strlen(cmd),
136b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed                       MSG_NOSIGNAL);
137b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed            if (ret < 0) {
138b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed                ALOGE("Failed to send data over socket: %s",
139b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed                        strerror(errno));
140b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed                return ret;
141b5258f91260c9b963b10321a252b0909f7ee0caeNaseer Ahmed            }
1426285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed        } else {
1436285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            ALOGE("Failed to send data over socket: %s",
1446285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed                    strerror(errno));
1456285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed            return ret;
1466285dc6b906767fa9331f12b903b832efea2943bNaseer Ahmed        }
147b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    }
148b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    ALOGD_IF(HWC_UTILS_DEBUG, "%s: Sent command: %s", __FUNCTION__, cmd);
149b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    return 0;
150b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed}
151b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
152b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmedstatic void connectPPDaemon(hwc_context_t *ctx)
153b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed{
154b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    int ret = -1;
155b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    char property[PROPERTY_VALUE_MAX];
156b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    if ((property_get("ro.qualcomm.cabl", property, NULL) > 0) &&
157b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        (atoi(property) == 1)) {
158b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ALOGD("%s: CABL is enabled", __FUNCTION__);
159b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.enabled = true;
160b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    } else {
161b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ALOGD("%s: CABL is disabled", __FUNCTION__);
162b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.enabled = false;
163b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        return;
164b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    }
165b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
166b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    if ((property_get("persist.qcom.cabl.video_only", property, NULL) > 0) &&
167b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        (atoi(property) == 1)) {
168b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ALOGD("%s: CABL is in video only mode", __FUNCTION__);
169b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.videoOnly = true;
170b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    } else {
171b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.videoOnly = false;
172b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    }
173b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
174b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    int daemon_socket = socket_local_client(DAEMON_SOCKET,
175b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed                                            ANDROID_SOCKET_NAMESPACE_RESERVED,
176b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed                                            SOCK_STREAM);
177b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    if(!daemon_socket) {
178b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ALOGE("Connecting to socket failed: %s", strerror(errno));
179b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.enabled = false;
180b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        return;
181b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    }
182fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed    struct timeval timeout;
183fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed    timeout.tv_sec = 1; //wait 1 second before timeout
184fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed    timeout.tv_usec = 0;
185fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed
186fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed    if (setsockopt(daemon_socket, SOL_SOCKET, SO_SNDTIMEO,
187fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed        (char*)&timeout, sizeof(timeout )) < 0)
188fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed        ALOGE("setsockopt failed");
189fbc4be199f1c2a50562ea12ae14aa439fd73557cNaseer Ahmed
190b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    ctx->mCablProp.daemon_socket = daemon_socket;
191b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed}
192b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
19329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx)
19429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
19593393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if(openFramebufferDevice(ctx) < 0) {
19693393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran        ALOGE("%s: failed to open framebuffer!!", __FUNCTION__);
19793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    }
19893393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran
199c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    overlay::Overlay::initOverlay();
200d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    ctx->mOverlay = overlay::Overlay::getInstance();
20136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ctx->mRotMgr = new RotMgr();
20296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    ctx->mMDP.version = qdutils::MDPVersion::getInstance().getMDPVersion();
20396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    ctx->mMDP.hasOverlay = qdutils::MDPVersion::getInstance().hasOverlay();
20496c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    ctx->mMDP.panel = qdutils::MDPVersion::getInstance().getPanelType();
20544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah    overlay::Overlay::initOverlay();
20644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah    ctx->mOverlay = overlay::Overlay::getInstance();
20744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah    ctx->mRotMgr = new RotMgr();
20844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah
2096457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //Is created and destroyed only once for primary
2106457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //For external it could get created and destroyed multiple times depending
2116457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //on what external we connect to.
2126457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ctx->mFBUpdate[HWC_DISPLAY_PRIMARY] =
2136457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        IFBUpdate::getObject(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres,
2146457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        HWC_DISPLAY_PRIMARY);
2156c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
2166c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // Check if the target supports copybit compostion (dyn/mdp/c2d) to
2176c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // decide if we need to open the copybit module.
2186c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    int compositionType =
2196c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        qdutils::QCCompositionType::getInstance().getCompositionType();
2206c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
2216c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    if (compositionType & (qdutils::COMPOSITION_TYPE_DYN |
2226c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                           qdutils::COMPOSITION_TYPE_MDP |
2236c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                           qdutils::COMPOSITION_TYPE_C2D)) {
2246c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R            ctx->mCopyBit[HWC_DISPLAY_PRIMARY] = new CopyBit();
2256c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    }
2266c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
22772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    ctx->mExtDisplay = new ExternalDisplay(ctx);
22885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
2291e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    for (uint32_t i = 0; i < MAX_DISPLAYS; i++) {
2301e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        ctx->mLayerRotMap[i] = new LayerRotMap();
2311e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    }
2321e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
23385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    ctx->mMDPComp[HWC_DISPLAY_PRIMARY] =
23485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah         MDPComp::getObject(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres,
23585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah         HWC_DISPLAY_PRIMARY);
23685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
23765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    MDPComp::init(ctx);
23872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
239ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    ctx->vstate.enable = false;
24005207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmed    ctx->vstate.fakevsync = false;
241f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar    ctx->mExtDispConfiguring = false;
24213389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ctx->mBasePipeSetup = false;
243d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah
244d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah    //Right now hwc starts the service but anybody could do it, or it could be
245d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah    //independent process as well.
246d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah    QService::init();
247d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah    sp<IQClient> client = new QClient(ctx);
248d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah    interface_cast<IQService>(
249d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah            defaultServiceManager()->getService(
250d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah            String16("display.qservice")))->connect(client);
251d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah
25272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    ALOGI("Initializing Qualcomm Hardware Composer");
25396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    ALOGI("MDP version: %d", ctx->mMDP.version);
254b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
255b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    connectPPDaemon(ctx);
25629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
25729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
25829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx)
25929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
260d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if(ctx->mOverlay) {
261d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        delete ctx->mOverlay;
262d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ctx->mOverlay = NULL;
26329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
264f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
26536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(ctx->mRotMgr) {
26636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        delete ctx->mRotMgr;
26736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ctx->mRotMgr = NULL;
26836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
26936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
2703a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < MAX_DISPLAYS; i++) {
2716c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        if(ctx->mCopyBit[i]) {
2726c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R            delete ctx->mCopyBit[i];
2736c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R            ctx->mCopyBit[i] = NULL;
2746c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        }
2756c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    }
2766c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
27793393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran    if(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd) {
2783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        close(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd);
2793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = -1;
28029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
28172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
28272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    if(ctx->mExtDisplay) {
28372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        delete ctx->mExtDisplay;
28472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed        ctx->mExtDisplay = NULL;
28572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    }
286ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed
2873a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    for(int i = 0; i < MAX_DISPLAYS; i++) {
2886457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(ctx->mFBUpdate[i]) {
2896457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            delete ctx->mFBUpdate[i];
2906457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ctx->mFBUpdate[i] = NULL;
2916457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
29285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        if(ctx->mMDPComp[i]) {
29385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            delete ctx->mMDPComp[i];
29485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            ctx->mMDPComp[i] = NULL;
29536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
2961e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        if(ctx->mLayerRotMap[i]) {
2971e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            delete ctx->mLayerRotMap[i];
2981e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            ctx->mLayerRotMap[i] = NULL;
2991e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        }
3006457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
30129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
30229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3033b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed
3043b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...)
30529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
3063b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed    va_list varargs;
3073b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed    va_start(varargs, fmt);
3083b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed    buf.appendFormatV(fmt, varargs);
3093b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed    va_end(varargs);
31029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
31129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3124012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R/* Calculates the destination position based on the action safe rectangle */
3134012258b6b344adccf19973602c4d092e2403053Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, uint32_t& x,
3144012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R                           uint32_t& y, uint32_t& w, uint32_t& h) {
3154012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3164012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    // if external supports underscan, do nothing
3174012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    // it will be taken care in the driver
3184012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    if(ctx->mExtDisplay->isCEUnderscanSupported())
3194012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R        return;
3204012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3214012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float wRatio = 1.0;
3224012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float hRatio = 1.0;
3234012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float xRatio = 1.0;
3244012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float yRatio = 1.0;
3254012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3264012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float fbWidth = ctx->dpyAttr[dpy].xres;
3274012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float fbHeight = ctx->dpyAttr[dpy].yres;
3284012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3294012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float asX = 0;
3304012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float asY = 0;
3314012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float asW = fbWidth;
3324012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    float asH= fbHeight;
3334012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    char value[PROPERTY_VALUE_MAX];
3344012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3354012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    // Apply action safe parameters
3364012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    property_get("hw.actionsafe.width", value, "0");
3374012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    int asWidthRatio = atoi(value);
3384012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    property_get("hw.actionsafe.height", value, "0");
3394012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    int asHeightRatio = atoi(value);
3404012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    // based on the action safe ratio, get the Action safe rectangle
3414012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    asW = fbWidth * (1.0f -  asWidthRatio / 100.0f);
3424012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    asH = fbHeight * (1.0f -  asHeightRatio / 100.0f);
3434012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    asX = (fbWidth - asW) / 2;
3444012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    asY = (fbHeight - asH) / 2;
3454012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3464012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    // calculate the position ratio
3474012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    xRatio = (float)x/fbWidth;
3484012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    yRatio = (float)y/fbHeight;
3494012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    wRatio = (float)w/fbWidth;
3504012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    hRatio = (float)h/fbHeight;
3514012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3524012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    //Calculate the position...
3534012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    x = (xRatio * asW) + asX;
3544012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    y = (yRatio * asH) + asY;
3554012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    w = (wRatio * asW);
3564012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    h = (hRatio * asH);
3574012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3584012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R    return;
3594012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R}
3604012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
3616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool needsScaling(hwc_layer_1_t const* layer) {
36253bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    int dst_w, dst_h, src_w, src_h;
36353bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
36453bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
36553bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    hwc_rect_t sourceCrop = layer->sourceCrop;
36653bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
36753bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    dst_w = displayFrame.right - displayFrame.left;
36853bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    dst_h = displayFrame.bottom - displayFrame.top;
36953bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
37053bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    src_w = sourceCrop.right - sourceCrop.left;
37153bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    src_h = sourceCrop.bottom - sourceCrop.top;
37253bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
3736371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(((src_w != dst_w) || (src_h != dst_h)))
3746371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        return true;
3756371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
3766371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    return false;
3776371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran}
3786371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
3796371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool isAlphaScaled(hwc_layer_1_t const* layer) {
38027962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N    if(needsScaling(layer) && isAlphaPresent(layer)) {
38127962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N        return true;
38227962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N    }
38327962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N    return false;
38427962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N}
38527962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N
38627962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.Nbool isAlphaPresent(hwc_layer_1_t const* layer) {
38727962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N    private_handle_t *hnd = (private_handle_t *)layer->handle;
3889449eb8d19ce1af2ef31c15189a90aef3fad4e73Naseer Ahmed    if(hnd) {
3899449eb8d19ce1af2ef31c15189a90aef3fad4e73Naseer Ahmed        int format = hnd->format;
3909449eb8d19ce1af2ef31c15189a90aef3fad4e73Naseer Ahmed        switch(format) {
39127962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N        case HAL_PIXEL_FORMAT_RGBA_8888:
39227962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N        case HAL_PIXEL_FORMAT_BGRA_8888:
39327962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N            // In any more formats with Alpha go here..
39453bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed            return true;
39527962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.N        default : return false;
3969449eb8d19ce1af2ef31c15189a90aef3fad4e73Naseer Ahmed        }
39753bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    }
39853bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    return false;
39953bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed}
40053bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
401b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed// Switch ppd on/off for YUV
402a63c9a0ab49be16d7fd465895ffaf2597ba5b4fenaseerstatic void configurePPD(hwc_context_t *ctx, int yuvCount) {
403b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    if (!ctx->mCablProp.enabled)
404b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        return;
405b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
406b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    if (yuvCount > 0 && !ctx->mCablProp.start) {
407b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.start = true;
408b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        if(ctx->mCablProp.videoOnly)
409b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed            ppdComm("cabl:on", ctx);
410b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        else
411b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed            ppdComm("cabl:yuv_on", ctx);
412b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed
413b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed    } else if (yuvCount == 0 && ctx->mCablProp.start) {
414b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        ctx->mCablProp.start = false;
415b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        if(ctx->mCablProp.videoOnly)
416b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed            ppdComm("cabl:off", ctx);
417b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        else
418b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed            ppdComm("cabl:yuv_off", ctx);
419b9c9e783172e6a733ade61edbe88b3271de87600Naseer Ahmed        return;
4206902ccc9cb1ec9015bd436f19f60fce1014e3afbNaseer Ahmed    }
4216902ccc9cb1ec9015bd436f19f60fce1014e3afbNaseer Ahmed}
4226902ccc9cb1ec9015bd436f19f60fce1014e3afbNaseer Ahmed
4233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid setListStats(hwc_context_t *ctx,
4243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        const hwc_display_contents_1_t *list, int dpy) {
4253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
4263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    ctx->listStats[dpy].numAppLayers = list->numHwLayers - 1;
4273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1;
428c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ctx->listStats[dpy].skipCount = 0;
42953bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    ctx->listStats[dpy].needsAlphaScale = false;
4300edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N    ctx->listStats[dpy].preMultipliedAlpha = false;
431ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed    ctx->listStats[dpy].planeAlpha = false;
43243d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran    ctx->listStats[dpy].yuvCount = 0;
433f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
434f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    for (size_t i = 0; i < list->numHwLayers; i++) {
43553bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed        hwc_layer_1_t const* layer = &list->hwLayers[i];
43653bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed        private_handle_t *hnd = (private_handle_t *)layer->handle;
437f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
43843d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran        //reset stored yuv index
43943d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran        ctx->listStats[dpy].yuvIndices[i] = -1;
44043d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran
4413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
4423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            continue;
4433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        //We disregard FB being skip for now! so the else if
44435712cb6398dc0f7442fe8951ce1e6eec4647f5cSaurabh Shah        } else if (isSkipLayer(&list->hwLayers[i])) {
4453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            ctx->listStats[dpy].skipCount++;
446e79c41329f1cc15bef9cb3a06eda7791e8cd4abeJeykumar Sankaran        } else if (UNLIKELY(isYuvBuffer(hnd))) {
44743d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran            int& yuvCount = ctx->listStats[dpy].yuvCount;
44843d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran            ctx->listStats[dpy].yuvIndices[yuvCount] = i;
44943d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran            yuvCount++;
4506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
451f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran            if(layer->transform & HWC_TRANSFORM_ROT_90)
452f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran                ctx->mNeedsRotator = true;
4533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        }
4540edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N        if(layer->blending == HWC_BLENDING_PREMULT)
4550edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N            ctx->listStats[dpy].preMultipliedAlpha = true;
456ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed        if(layer->planeAlpha < 0xFF)
457ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed            ctx->listStats[dpy].planeAlpha = true;
458e79c41329f1cc15bef9cb3a06eda7791e8cd4abeJeykumar Sankaran        if(!ctx->listStats[dpy].needsAlphaScale)
459e79c41329f1cc15bef9cb3a06eda7791e8cd4abeJeykumar Sankaran            ctx->listStats[dpy].needsAlphaScale = isAlphaScaled(layer);
4603e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
461a63c9a0ab49be16d7fd465895ffaf2597ba5b4fenaseer    if (dpy == HWC_DISPLAY_PRIMARY)
462a63c9a0ab49be16d7fd465895ffaf2597ba5b4fenaseer        configurePPD(ctx, ctx->listStats[dpy].yuvCount);
46329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
46429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
46553bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed
466541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shahstatic inline void calc_cut(float& leftCutRatio, float& topCutRatio,
467541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        float& rightCutRatio, float& bottomCutRatio, int orient) {
46827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    if(orient & HAL_TRANSFORM_FLIP_H) {
469541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        swap(leftCutRatio, rightCutRatio);
47027c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    }
47127c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    if(orient & HAL_TRANSFORM_FLIP_V) {
472541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        swap(topCutRatio, bottomCutRatio);
47327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    }
47427c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    if(orient & HAL_TRANSFORM_ROT_90) {
47527c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah        //Anti clock swapping
476541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        float tmpCutRatio = leftCutRatio;
477541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        leftCutRatio = topCutRatio;
478541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        topCutRatio = rightCutRatio;
479541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        rightCutRatio = bottomCutRatio;
480541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        bottomCutRatio = tmpCutRatio;
48127c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    }
48227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah}
48327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
484b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumarbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer) {
48565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    if((ctx->mMDP.version < qdutils::MDSS_V5) &&
48665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed       (ctx->mMDP.version > qdutils::MDP_V3_0) &&
48765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        ctx->mSecuring) {
48865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed        return true;
48965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    }
490b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar    //  On A-Family, Secure policy is applied system wide and not on
491b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar    //  buffers.
492b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar    if (isSecureModePolicy(ctx->mMDP.version)) {
493b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar        private_handle_t *hnd = (private_handle_t *)layer->handle;
494b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar        if(ctx->mSecureMode) {
495b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar            if (! isSecureBuffer(hnd)) {
496b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // This code path executes for the following usecase:
497b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // Some Apps in which first few seconds, framework
498b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // sends non-secure buffer and with out destroying
499b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // surfaces, switches to secure buffer thereby exposing
500b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // vulnerability on A-family devices. Catch this situation
501b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // and handle it gracefully by allowing it to be composed by
502b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // GPU.
503b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                ALOGD_IF(HWC_UTILS_DEBUG, "%s: Handle non-secure video layer"
504b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                         "during secure playback gracefully", __FUNCTION__);
505b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                return true;
506b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar            }
507b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar        } else {
508b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar            if (isSecureBuffer(hnd)) {
509b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // This code path executes for the following usecase:
510b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // For some Apps, when User terminates playback, Framework
511b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // doesnt destroy video surface and video surface still
512b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // comes to Display HAL. This exposes vulnerability on
513b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // A-family. Catch this situation and handle it gracefully
514b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                // by allowing it to be composed by GPU.
515b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                ALOGD_IF(HWC_UTILS_DEBUG, "%s: Handle secure video layer"
516b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                         "during non-secure playback gracefully", __FUNCTION__);
517b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar                return true;
518b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar            }
519b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar        }
520b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar    }
52165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    return false;
52265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed}
52365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
52408cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhanbool isSecureModePolicy(int mdpVersion) {
52508cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhan    if (mdpVersion < qdutils::MDSS_V5)
52608cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhan        return true;
52708cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhan    else
52808cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhan        return false;
52908cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhan}
53065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
53118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedint getBlending(int blending) {
53218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    switch(blending) {
53318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    case HWC_BLENDING_NONE:
53418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        return overlay::utils::OVERLAY_BLENDING_OPAQUE;
53518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    case HWC_BLENDING_PREMULT:
53618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        return overlay::utils::OVERLAY_BLENDING_PREMULT;
53718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    case HWC_BLENDING_COVERAGE :
53818bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    default:
53918bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        return overlay::utils::OVERLAY_BLENDING_COVERAGE;
54018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    }
54118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed}
54218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
543f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries
544f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
5456371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                          const hwc_rect_t& scissor, int orient) {
5466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
54727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int& crop_l = crop.left;
54827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int& crop_t = crop.top;
549f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int& crop_r = crop.right;
550f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int& crop_b = crop.bottom;
551f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int crop_w = crop.right - crop.left;
552f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int crop_h = crop.bottom - crop.top;
553f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
55427c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int& dst_l = dst.left;
55527c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int& dst_t = dst.top;
556f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int& dst_r = dst.right;
557f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int& dst_b = dst.bottom;
55827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int dst_w = abs(dst.right - dst.left);
55927c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int dst_h = abs(dst.bottom - dst.top);
560f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
5616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    const int& sci_l = scissor.left;
5626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    const int& sci_t = scissor.top;
5636371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    const int& sci_r = scissor.right;
5646371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    const int& sci_b = scissor.bottom;
5656371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    int sci_w = abs(sci_r - sci_l);
5666371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    int sci_h = abs(sci_b - sci_t);
5676371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
568541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    float leftCutRatio = 0.0f, rightCutRatio = 0.0f, topCutRatio = 0.0f,
569541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            bottomCutRatio = 0.0f;
570f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
5716371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(dst_l < sci_l) {
5726371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        leftCutRatio = (float)(sci_l - dst_l) / (float)dst_w;
5736371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        dst_l = sci_l;
574f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
5756371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
5766371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(dst_r > sci_r) {
5776371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        rightCutRatio = (float)(dst_r - sci_r) / (float)dst_w;
5786371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        dst_r = sci_r;
579f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
5806371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
5816371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(dst_t < sci_t) {
5826371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        topCutRatio = (float)(sci_t - dst_t) / (float)dst_h;
5836371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        dst_t = sci_t;
584f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
5856371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran
5866371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    if(dst_b > sci_b) {
5876371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        bottomCutRatio = (float)(dst_b - sci_b) / (float)dst_h;
5886371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran        dst_b = sci_b;
58929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
59027c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
591541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    calc_cut(leftCutRatio, topCutRatio, rightCutRatio, bottomCutRatio, orient);
592541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    crop_l += crop_w * leftCutRatio;
593541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    crop_t += crop_h * topCutRatio;
594541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    crop_r -= crop_w * rightCutRatio;
595541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    crop_b -= crop_h * bottomCutRatio;
59629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
597f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
5986195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedvoid getNonWormholeRegion(hwc_display_contents_1_t* list,
5996195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed                              hwc_rect_t& nwr)
6006195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed{
6016195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    uint32_t last = list->numHwLayers - 1;
6026195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    hwc_rect_t fbDisplayFrame = list->hwLayers[last].displayFrame;
6036195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    //Initiliaze nwr to first frame
6046195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.left =  list->hwLayers[0].displayFrame.left;
6056195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.top =  list->hwLayers[0].displayFrame.top;
6066195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.right =  list->hwLayers[0].displayFrame.right;
6076195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.bottom =  list->hwLayers[0].displayFrame.bottom;
6086195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
6096195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    for (uint32_t i = 1; i < last; i++) {
6106195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        hwc_rect_t displayFrame = list->hwLayers[i].displayFrame;
6116195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        nwr.left   = min(nwr.left, displayFrame.left);
6126195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        nwr.top    = min(nwr.top, displayFrame.top);
6136195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        nwr.right  = max(nwr.right, displayFrame.right);
6146195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        nwr.bottom = max(nwr.bottom, displayFrame.bottom);
6156195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    }
6166195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
6176195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    //Intersect with the framebuffer
6186195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.left   = max(nwr.left, fbDisplayFrame.left);
6196195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.top    = max(nwr.top, fbDisplayFrame.top);
6206195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.right  = min(nwr.right, fbDisplayFrame.right);
6216195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    nwr.bottom = min(nwr.bottom, fbDisplayFrame.bottom);
6226195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
6236195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed}
6246195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
6253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool isExternalActive(hwc_context_t* ctx) {
6263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive;
627fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah}
6282dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
6290859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shahvoid closeAcquireFds(hwc_display_contents_1_t* list) {
6302ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed    if(LIKELY(list)) {
6312ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed        for(uint32_t i = 0; i < list->numHwLayers; i++) {
6322ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed            //Close the acquireFenceFds
6332ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed            //HWC_FRAMEBUFFER are -1 already by SF, rest we close.
6342ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed            if(list->hwLayers[i].acquireFenceFd >= 0) {
6352ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                close(list->hwLayers[i].acquireFenceFd);
6362ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed                list->hwLayers[i].acquireFenceFd = -1;
6372ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed            }
6382ab5edab12c720e4ba4317d1cae9e6370ccb2067Naseer Ahmed        }
6390859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah    }
6400859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah}
6410859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
6426c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy,
6431e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        int fd) {
6442dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    int ret = 0;
6451e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
64689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    int acquireFd[MAX_NUM_LAYERS];
6472dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    int count = 0;
6482dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    int releaseFd = -1;
6498e1eee928e64dcc86adcbd6f54a2d79c75ebb2bdNaseer Ahmed    int retireFd = -1;
6502dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    int fbFd = -1;
6511e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    int rotFd = -1;
65250ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed    bool swapzero = false;
6531e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion();
6541e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
6551e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    struct mdp_buf_sync data;
6561e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    memset(&data, 0, sizeof(data));
6571e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    //Until B-family supports sync for rotator
6581e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    if(mdpVersion >= qdutils::MDSS_V5) {
6591e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        data.flags = MDP_BUF_SYNC_FLAG_WAIT;
6601e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    }
6612dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    data.acq_fen_fd = acquireFd;
6622dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    data.rel_fen_fd = &releaseFd;
6638e1eee928e64dcc86adcbd6f54a2d79c75ebb2bdNaseer Ahmed    data.retire_fen_fd = &retireFd;
6641e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
66550ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed    char property[PROPERTY_VALUE_MAX];
66650ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed    if(property_get("debug.egl.swapinterval", property, "1") > 0) {
66750ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed        if(atoi(property) == 0)
66850ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed            swapzero = true;
66950ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed    }
67050ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed
671ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed#ifndef MDSS_TARGET
6721e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    //Send acquireFenceFds to rotator
6731e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    if(mdpVersion < qdutils::MDSS_V5) {
6741e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        //A-family
6751e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        int rotFd = ctx->mRotMgr->getRotDevFd();
6761e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        struct msm_rotator_buf_sync rotData;
6771e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
6781e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        for(uint32_t i = 0; i < ctx->mLayerRotMap[dpy]->getCount(); i++) {
6791e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            memset(&rotData, 0, sizeof(rotData));
6801e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            int& acquireFenceFd =
6811e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah                ctx->mLayerRotMap[dpy]->getLayer(i)->acquireFenceFd;
6821e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            rotData.acq_fen_fd = acquireFenceFd;
6831e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            rotData.session_id = ctx->mLayerRotMap[dpy]->getRot(i)->getSessId();
6841e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            ioctl(rotFd, MSM_ROTATOR_IOCTL_BUFFER_SYNC, &rotData);
6851e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            close(acquireFenceFd);
6861e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah             //For MDP to wait on.
6871e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            acquireFenceFd = dup(rotData.rel_fen_fd);
6881e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            //A buffer is free to be used by producer as soon as its copied to
6891e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            //rotator.
6901e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            ctx->mLayerRotMap[dpy]->getLayer(i)->releaseFenceFd =
6911e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah                    rotData.rel_fen_fd;
6921e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        }
6931e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    } else {
6941e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        //TODO B-family
6951e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    }
6961e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
697ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed#endif
6981e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    //Accumulate acquireFenceFds for MDP
6992dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    for(uint32_t i = 0; i < list->numHwLayers; i++) {
7006c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        if(list->hwLayers[i].compositionType == HWC_OVERLAY &&
7011e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah                        list->hwLayers[i].acquireFenceFd >= 0) {
70250ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed            if(UNLIKELY(swapzero))
70350ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed                acquireFd[count++] = -1;
70450ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed            else
70550ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed                acquireFd[count++] = list->hwLayers[i].acquireFenceFd;
7062dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar        }
7076c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
7086c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R            if(UNLIKELY(swapzero))
7096c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                acquireFd[count++] = -1;
7101e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            else if(fd >= 0) {
7116c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                //set the acquireFD from fd - which is coming from c2d
7126c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                acquireFd[count++] = fd;
7136c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                // Buffer sync IOCTL should be async when using c2d fence is
7146c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                // used
7156c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                data.flags &= ~MDP_BUF_SYNC_FLAG_WAIT;
7161e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            } else if(list->hwLayers[i].acquireFenceFd >= 0)
7176c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                acquireFd[count++] = list->hwLayers[i].acquireFenceFd;
7186c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        }
7192dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    }
7202dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
72140a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar    data.acq_fen_fd_cnt = count;
72240a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar    fbFd = ctx->dpyAttr[dpy].fd;
7231e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
72440a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar    //Waits for acquire fences, returns a release fence
7256c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    if(LIKELY(!swapzero)) {
7266c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        uint64_t start = systemTime();
72750ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed        ret = ioctl(fbFd, MSMFB_BUFFER_SYNC, &data);
7286c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        ALOGD_IF(HWC_UTILS_DEBUG, "%s: time taken for MSMFB_BUFFER_SYNC IOCTL = %d",
7296c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                            __FUNCTION__, (size_t) ns2ms(systemTime() - start));
7306c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    }
7310859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
73240a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar    if(ret < 0) {
73340a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar        ALOGE("ioctl MSMFB_BUFFER_SYNC failed, err=%s",
73440a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar                strerror(errno));
73540a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar    }
7360859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
73740a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar    for(uint32_t i = 0; i < list->numHwLayers; i++) {
7386c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R        if(list->hwLayers[i].compositionType == HWC_OVERLAY ||
7396c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R           list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
74040a1cc58d298a8d2e61df8c3be0d85ddf6996d98Kinjal Bhavsar            //Populate releaseFenceFds.
7411e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            if(UNLIKELY(swapzero)) {
74250ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed                list->hwLayers[i].releaseFenceFd = -1;
7431e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            } else if(list->hwLayers[i].releaseFenceFd < 0) {
7441e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah                //If rotator has not already populated this field.
74550ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed                list->hwLayers[i].releaseFenceFd = dup(releaseFd);
7461e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah            }
7472dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar        }
7482dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    }
7490859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
7500859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah    if(fd >= 0) {
7510859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah        close(fd);
7520859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah        fd = -1;
7530859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah    }
7540859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
7556195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    if (ctx->mCopyBit[dpy])
7566195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        ctx->mCopyBit[dpy]->setReleaseFd(releaseFd);
7571e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
7581e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    //A-family
7591e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    if(mdpVersion < qdutils::MDSS_V5) {
7601e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        //Signals when MDP finishes reading rotator buffers.
7611e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        ctx->mLayerRotMap[dpy]->setReleaseFd(releaseFd);
7621e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    }
7638e1eee928e64dcc86adcbd6f54a2d79c75ebb2bdNaseer Ahmed    close(releaseFd);
7648e1eee928e64dcc86adcbd6f54a2d79c75ebb2bdNaseer Ahmed    if(UNLIKELY(swapzero))
76550ecfc494bed848dfde487e002863e0fbba5f711Naseer Ahmed        list->retireFenceFd = -1;
7668e1eee928e64dcc86adcbd6f54a2d79c75ebb2bdNaseer Ahmed    else
7678e1eee928e64dcc86adcbd6f54a2d79c75ebb2bdNaseer Ahmed        list->retireFenceFd = retireFd;
7682dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar    return ret;
7692dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar}
7702dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
77136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahvoid trimLayer(hwc_context_t *ctx, const int& dpy, const int& transform,
77236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t& crop, hwc_rect_t& dst) {
77336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int hw_w = ctx->dpyAttr[dpy].xres;
77436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int hw_h = ctx->dpyAttr[dpy].yres;
77536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(dst.left < 0 || dst.top < 0 ||
77636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            dst.right > hw_w || dst.bottom > hw_h) {
77736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t scissor = {0, 0, hw_w, hw_h };
77836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        qhwc::calculate_crop_rects(crop, dst, scissor, transform);
77936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
78036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
78136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
78236963690317abceae79621f14ba41ff62b3ff489Saurabh Shahvoid setMdpFlags(hwc_layer_1_t *layer,
78336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ovutils::eMdpFlags &mdpFlags,
78436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        int rotDownscale) {
78536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
78636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
78736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    const int& transform = layer->transform;
78836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
78936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(layer->blending == HWC_BLENDING_PREMULT) {
79036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ovutils::setMdpFlags(mdpFlags,
79136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                ovutils::OV_MDP_BLEND_FG_PREMULT);
79236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
79336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
79436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(isYuvBuffer(hnd)) {
79536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(isSecureBuffer(hnd)) {
79636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ovutils::setMdpFlags(mdpFlags,
79736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                    ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
79836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
79936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(metadata && (metadata->operation & PP_PARAM_INTERLACED) &&
80036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                metadata->interlaced) {
80136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ovutils::setMdpFlags(mdpFlags,
80236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                    ovutils::OV_MDP_DEINTERLACE);
80336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
80436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        //Pre-rotation will be used using rotator.
80536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(transform & HWC_TRANSFORM_ROT_90) {
80636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ovutils::setMdpFlags(mdpFlags,
80736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah                    ovutils::OV_MDP_SOURCE_ROTATED_90);
80836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
80936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
81036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
81136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //No 90 component and no rot-downscale then flips done by MDP
81236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //If we use rot then it might as well do flips
81336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(!(layer->transform & HWC_TRANSFORM_ROT_90) && !rotDownscale) {
81436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(layer->transform & HWC_TRANSFORM_FLIP_H) {
81536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H);
81636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
81736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
81836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(layer->transform & HWC_TRANSFORM_FLIP_V) {
81936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ovutils::setMdpFlags(mdpFlags,  ovutils::OV_MDP_FLIP_V);
82036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
82136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
822e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah
823e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    if(metadata &&
824e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        ((metadata->operation & PP_PARAM_HSIC)
825e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        || (metadata->operation & PP_PARAM_IGC)
826e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        || (metadata->operation & PP_PARAM_SHARP2))) {
827e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_PP_EN);
828e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    }
82936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
83036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
83136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahstatic inline int configRotator(Rotator *rot, const Whf& whf,
8322e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed        const Whf& origWhf, const eMdpFlags& mdpFlags,
8332e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed        const eTransform& orient,
83436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const int& downscale) {
8352e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed    rot->setSource(whf, origWhf);
83636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    rot->setFlags(mdpFlags);
83736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    rot->setTransform(orient);
83836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    rot->setDownscale(downscale);
83936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(!rot->commit()) return -1;
84036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    return 0;
84136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
84236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
84313389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed/*
84413389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed * Sets up BORDERFILL as default base pipe and detaches RGB0.
84513389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed * Framebuffer is always updated using PLAY ioctl.
84613389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed */
84713389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmedbool setupBasePipe(hwc_context_t *ctx) {
84813389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    const int dpy = HWC_DISPLAY_PRIMARY;
84913389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    int fb_stride = ctx->dpyAttr[dpy].stride;
85013389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    int fb_width = ctx->dpyAttr[dpy].xres;
85113389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    int fb_height = ctx->dpyAttr[dpy].yres;
85213389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    int fb_fd = ctx->dpyAttr[dpy].fd;
85313389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed
85413389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    mdp_overlay ovInfo;
85513389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    msmfb_overlay_data ovData;
85613389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    memset(&ovInfo, 0, sizeof(mdp_overlay));
85713389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    memset(&ovData, 0, sizeof(msmfb_overlay_data));
85813389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed
85913389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.src.format = MDP_RGB_BORDERFILL;
86013389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.src.width  = fb_width;
86113389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.src.height = fb_height;
86213389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.src_rect.w = fb_width;
86313389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.src_rect.h = fb_height;
86413389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.dst_rect.w = fb_width;
86513389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.dst_rect.h = fb_height;
86613389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovInfo.id = MSMFB_NEW_REQUEST;
86713389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed
86813389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) {
86913389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed        ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s",
87013389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed                strerror(errno));
87113389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed        return false;
87213389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    }
87313389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed
87413389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ovData.id = ovInfo.id;
87513389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) {
87613389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed        ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s",
87713389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed                strerror(errno));
87813389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed        return false;
87913389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    }
88013389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    ctx->mBasePipeSetup = true;
88113389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed    return true;
88213389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed}
88313389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed
88413389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed
88536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahstatic inline int configMdp(Overlay *ov, const PipeArgs& parg,
88636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const eTransform& orient, const hwc_rect_t& crop,
887e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        const hwc_rect_t& pos, const MetaData_t *metadata,
888e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        const eDest& dest) {
88936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ov->setSource(parg, dest);
89036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ov->setTransform(orient, dest);
89136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
89236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int crop_w = crop.right - crop.left;
89336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int crop_h = crop.bottom - crop.top;
89436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    Dim dcrop(crop.left, crop.top, crop_w, crop_h);
89536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ov->setCrop(dcrop, dest);
89636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
89736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int posW = pos.right - pos.left;
89836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int posH = pos.bottom - pos.top;
89936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    Dim position(pos.left, pos.top, posW, posH);
90036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    ov->setPosition(position, dest);
90136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
902e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    if (metadata)
903e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        ov->setVisualParams(*metadata, dest);
904e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah
90536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if (!ov->commit(dest)) {
90636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        return -1;
90736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
90836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    return 0;
90936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
91036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
91136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahstatic inline void updateSource(eTransform& orient, Whf& whf,
91236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t& crop) {
91336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    Dim srcCrop(crop.left, crop.top,
91436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            crop.right - crop.left,
91536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            crop.bottom - crop.top);
9160dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    //getMdpOrient will switch the flips if the source is 90 rotated.
9170dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    //Clients in Android dont factor in 90 rotation while deciding the flip.
9180dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    orient = static_cast<eTransform>(ovutils::getMdpOrient(orient));
91936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    preRotateSource(orient, whf, srcCrop);
92036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    crop.left = srcCrop.x;
92136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    crop.top = srcCrop.y;
92236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    crop.right = srcCrop.x + srcCrop.w;
92336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    crop.bottom = srcCrop.y + srcCrop.h;
92436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
92536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
92636963690317abceae79621f14ba41ff62b3ff489Saurabh Shahint configureLowRes(hwc_context_t *ctx, hwc_layer_1_t *layer,
92736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const int& dpy, eMdpFlags& mdpFlags, const eZorder& z,
92836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const eIsFg& isFg, const eDest& dest, Rotator **rot) {
92936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
93036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
93136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(!hnd) {
93236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ALOGE("%s: layer handle is NULL", __FUNCTION__);
93336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        return -1;
93436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
93536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
936e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
937e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah
93836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
93936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
94036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int transform = layer->transform;
94136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eTransform orient = static_cast<eTransform>(transform);
94236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int downscale = 0;
94336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int rotFlags = ovutils::ROT_FLAGS_NONE;
94432cafd22d940da88d6173248e9790c9424b2a65bNaseer Ahmed    Whf whf(getWidth(hnd), getHeight(hnd),
94536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            getMdpFormat(hnd->format), hnd->size);
946da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed    bool forceRot = false;
94736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
94836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(isYuvBuffer(hnd) && ctx->mMDP.version >= qdutils::MDP_V4_2 &&
94985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah       ctx->mMDP.version < qdutils::MDSS_V5) {
95085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        downscale =  getDownscaleFactor(
95185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            crop.right - crop.left,
95285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            crop.bottom - crop.top,
95385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            dst.right - dst.left,
95485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            dst.bottom - dst.top);
95536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(downscale) {
95636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            rotFlags = ROT_DOWNSCALE_ENABLED;
95736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
958da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed        unsigned int& prevWidth = ctx->mPrevWHF[dpy].w;
959da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed        unsigned int& prevHeight = ctx->mPrevWHF[dpy].h;
960da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed        if(prevWidth != (uint32_t)getWidth(hnd) ||
961da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed               prevHeight != (uint32_t)getHeight(hnd)) {
962da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed            uint32_t prevBufArea = (prevWidth * prevHeight);
963da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed            if(prevBufArea) {
964da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed                forceRot = true;
965da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed            }
966da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed            prevWidth = (uint32_t)getWidth(hnd);
967da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed            prevHeight = (uint32_t)getHeight(hnd);
968da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed        }
96936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
97036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
97136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    setMdpFlags(layer, mdpFlags, downscale);
97236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    trimLayer(ctx, dpy, transform, crop, dst);
97336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
97436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(isYuvBuffer(hnd) && //if 90 component or downscale, use rot
975da6152a5a57cf78cef01ee4ba2e695048f161231Naseer Ahmed            ((transform & HWC_TRANSFORM_ROT_90) || downscale || forceRot)) {
97636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        *rot = ctx->mRotMgr->getNext();
97736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(*rot == NULL) return -1;
97836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        //Configure rotator for pre-rotation
9792e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed        Whf origWhf(hnd->width, hnd->height,
9802e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed                    getMdpFormat(hnd->format), hnd->size);
9812e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed        if(configRotator(*rot, whf, origWhf,  mdpFlags, orient, downscale) < 0)
98236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return -1;
9831e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        ctx->mLayerRotMap[dpy]->add(layer, *rot);
98436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        whf.format = (*rot)->getDstFormat();
98536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        updateSource(orient, whf, crop);
98636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        rotFlags |= ovutils::ROT_PREROTATED;
98736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
98836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
9890dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    //For the mdp, since either we are pre-rotating or MDP does flips
9900dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    orient = OVERLAY_TRANSFORM_0;
9910dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    transform = 0;
9920dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah
99318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    PipeArgs parg(mdpFlags, whf, z, isFg,
99418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                  static_cast<eRotFlags>(rotFlags), layer->planeAlpha,
99518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                  (ovutils::eBlending) getBlending(layer->blending));
99618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
997e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    if(configMdp(ctx->mOverlay, parg, orient, crop, dst, metadata, dest) < 0) {
99836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ALOGE("%s: commit failed for low res panel", __FUNCTION__);
99993897742c24e451a09e4255d2cf09c7d4640ee31Naseer Ahmed        ctx->mLayerRotMap[dpy]->reset();
100036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        return -1;
100136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
100236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    return 0;
100336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
100436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
100536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahint configureHighRes(hwc_context_t *ctx, hwc_layer_1_t *layer,
100636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const int& dpy, eMdpFlags& mdpFlagsL, const eZorder& z,
100736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const eIsFg& isFg, const eDest& lDest, const eDest& rDest,
100836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        Rotator **rot) {
100936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
101036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(!hnd) {
101136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ALOGE("%s: layer handle is NULL", __FUNCTION__);
101236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        return -1;
101336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
101436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
1015e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
1016e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah
101736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int hw_w = ctx->dpyAttr[dpy].xres;
101836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int hw_h = ctx->dpyAttr[dpy].yres;
101936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    hwc_rect_t crop = layer->sourceCrop;
102036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    hwc_rect_t dst = layer->displayFrame;
102136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int transform = layer->transform;
102236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eTransform orient = static_cast<eTransform>(transform);
102336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    const int downscale = 0;
102436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int rotFlags = ROT_FLAGS_NONE;
102536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
102632cafd22d940da88d6173248e9790c9424b2a65bNaseer Ahmed    Whf whf(getWidth(hnd), getHeight(hnd),
102736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            getMdpFormat(hnd->format), hnd->size);
102836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
102936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    setMdpFlags(layer, mdpFlagsL);
103036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    trimLayer(ctx, dpy, transform, crop, dst);
103136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
103236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(isYuvBuffer(hnd) && (transform & HWC_TRANSFORM_ROT_90)) {
103336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        (*rot) = ctx->mRotMgr->getNext();
103436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if((*rot) == NULL) return -1;
103536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        //Configure rotator for pre-rotation
10362e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed        Whf origWhf(hnd->width, hnd->height,
10372e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed                    getMdpFormat(hnd->format), hnd->size);
10382e89cad843d9f442be47feb2d9347cffe3c4948eNaseer Ahmed        if(configRotator(*rot, whf, origWhf, mdpFlagsL, orient, downscale) < 0)
103936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return -1;
10401e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        ctx->mLayerRotMap[dpy]->add(layer, *rot);
104136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        whf.format = (*rot)->getDstFormat();
104236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        updateSource(orient, whf, crop);
104336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        rotFlags |= ROT_PREROTATED;
104436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
104536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
104636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    eMdpFlags mdpFlagsR = mdpFlagsL;
104736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    setMdpFlags(mdpFlagsR, OV_MDSS_MDP_RIGHT_MIXER);
104836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
104936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    hwc_rect_t tmp_cropL, tmp_dstL;
105036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    hwc_rect_t tmp_cropR, tmp_dstR;
105136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
105236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(lDest != OV_INVALID) {
105336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_cropL = crop;
105436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_dstL = dst;
105536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t scissor = {0, 0, hw_w/2, hw_h };
105636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        qhwc::calculate_crop_rects(tmp_cropL, tmp_dstL, scissor, 0);
105736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
105836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(rDest != OV_INVALID) {
105936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_cropR = crop;
106036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_dstR = dst;
106136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t scissor = {hw_w/2, 0, hw_w, hw_h };
106236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        qhwc::calculate_crop_rects(tmp_cropR, tmp_dstR, scissor, 0);
106336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
106436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
106536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //When buffer is flipped, contents of mixer config also needs to swapped.
106636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //Not needed if the layer is confined to one half of the screen.
106736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //If rotator has been used then it has also done the flips, so ignore them.
10680dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    if((orient & OVERLAY_TRANSFORM_FLIP_V) && lDest != OV_INVALID
106936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            && rDest != OV_INVALID && rot == NULL) {
107036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t new_cropR;
107136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        new_cropR.left = tmp_cropL.left;
107236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        new_cropR.right = new_cropR.left + (tmp_cropR.right - tmp_cropR.left);
107336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
107436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t new_cropL;
107536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        new_cropL.left  = new_cropR.right;
107636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        new_cropL.right = tmp_cropR.right;
107736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
107836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_cropL.left =  new_cropL.left;
107936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_cropL.right =  new_cropL.right;
108036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
108136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_cropR.left = new_cropR.left;
108236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        tmp_cropR.right =  new_cropR.right;
108336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
108436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
108536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
10860dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    //For the mdp, since either we are pre-rotating or MDP does flips
10870dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    orient = OVERLAY_TRANSFORM_0;
10880dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    transform = 0;
10890dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah
109036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //configure left mixer
109136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(lDest != OV_INVALID) {
109236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        PipeArgs pargL(mdpFlagsL, whf, z, isFg,
109318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                       static_cast<eRotFlags>(rotFlags), layer->planeAlpha,
109418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                       (ovutils::eBlending) getBlending(layer->blending));
109518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
109636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(configMdp(ctx->mOverlay, pargL, orient,
1097e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah                tmp_cropL, tmp_dstL, metadata, lDest) < 0) {
109836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGE("%s: commit failed for left mixer config", __FUNCTION__);
109936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return -1;
110036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
110136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
110236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
110336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //configure right mixer
110436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    if(rDest != OV_INVALID) {
110536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        PipeArgs pargR(mdpFlagsR, whf, z, isFg,
110618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                static_cast<eRotFlags>(rotFlags), layer->planeAlpha,
110718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
110818bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
11096c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        tmp_dstR.right = tmp_dstR.right - tmp_dstR.left;
11106c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        tmp_dstR.left = 0;
111136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        if(configMdp(ctx->mOverlay, pargR, orient,
1112e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah                tmp_cropR, tmp_dstR, metadata, rDest) < 0) {
111336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            ALOGE("%s: commit failed for right mixer config", __FUNCTION__);
111436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah            return -1;
111536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        }
111636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    }
111736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
111836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    return 0;
111936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
112036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
11211e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahvoid LayerRotMap::add(hwc_layer_1_t* layer, Rotator *rot) {
11221e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    if(mCount >= MAX_SESS) return;
11231e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    mLayer[mCount] = layer;
11241e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    mRot[mCount] = rot;
11251e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    mCount++;
11261e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}
11271e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
11281e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahvoid LayerRotMap::reset() {
11291e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    for (int i = 0; i < MAX_SESS; i++) {
11301e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        mLayer[i] = 0;
11311e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        mRot[i] = 0;
11321e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    }
11331e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    mCount = 0;
11341e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}
11351e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
11361e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahvoid LayerRotMap::setReleaseFd(const int& fence) {
11371e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    for(uint32_t i = 0; i < mCount; i++) {
11381e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah        mRot[i]->setReleaseFd(dup(fence));
11391e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    }
11401e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}
11411e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
114236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah};//namespace qhwc
1143