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