1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2010 The Android Open Source Project 3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (C) 2012-2014, The Linux Foundation All rights reserved. 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are retained 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * for attribution purposes only. 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL) 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define HWC_UTILS_DEBUG 0 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <math.h> 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/ioctl.h> 24a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <linux/fb.h> 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <binder/IServiceManager.h> 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <EGL/egl.h> 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/properties.h> 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Trace.h> 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <gralloc_priv.h> 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlay.h> 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlayRotator.h> 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlayWriteback.h> 33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_utils.h" 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_mdpcomp.h" 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_fbupdate.h" 36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_ad.h" 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "mdp_version.h" 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_copybit.h" 39a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_dump_layers.h" 40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "external.h" 41a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "virtual.h" 42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_qclient.h" 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "QService.h" 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "comptype.h" 45a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_virtual.h" 461b9f24cfc5be6361faeb28976d720cf65a7f8285Tatenda Chipeperekwa#include "qd_utils.h" 47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qClient; 49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qService; 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace android; 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay; 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay::utils; 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace ovutils = overlay::utils; 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 553a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah#ifdef QCOM_BSP 561b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#ifdef __cplusplus 571b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnanextern "C" { 581b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#endif 591b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 601b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar RadhakrishnanEGLAPI EGLBoolean eglGpuPerfHintQCOM(EGLDisplay dpy, EGLContext ctx, 611b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGLint *attrib_list); 621b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_HINT_1 0x32D0 631b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_HINT_2 0x32D1 641b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 651b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_LEVEL_0 0x0 661b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_LEVEL_1 0x1 671b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_LEVEL_2 0x2 681b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_LEVEL_3 0x3 691b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_LEVEL_4 0x4 701b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#define EGL_GPU_LEVEL_5 0x5 711b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 721b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#ifdef __cplusplus 731b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan} 741b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan#endif 753a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah#endif 761b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qhwc { 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 79a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isValidResolution(hwc_context_t *ctx, uint32_t xres, uint32_t yres) 80a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 81a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return !((xres > qdutils::MAX_DISPLAY_DIM && 82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !isDisplaySplit(ctx, HWC_DISPLAY_PRIMARY)) || 83a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (xres < MIN_DISPLAY_XRES || yres < MIN_DISPLAY_YRES)); 84a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 85a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 864a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusuvoid changeResolution(hwc_context_t *ctx, int xres_orig, int yres_orig, 874a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu int width, int height) { 88a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Store original display resolution. 892c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres_new = xres_orig; 902c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres_new = yres_orig; 91a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].customFBSize = false; 92a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char property[PROPERTY_VALUE_MAX] = {'\0'}; 93a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char *yptr = NULL; 94a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (property_get("debug.hwc.fbsize", property, NULL) > 0) { 95a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yptr = strcasestr(property,"x"); 962c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi int xres_new = atoi(property); 972c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi int yres_new = atoi(yptr + 1); 982c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi if (isValidResolution(ctx,xres_new,yres_new) && 992c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi xres_new != xres_orig && yres_new != yres_orig) { 1002c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres_new = xres_new; 1012c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres_new = yres_new; 102a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].customFBSize = true; 1034a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu 1044a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu //Caluculate DPI according to changed resolution. 1054a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu float xdpi = ((float)xres_new * 25.4f) / (float)width; 1064a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu float ydpi = ((float)yres_new * 25.4f) / (float)height; 1074a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = xdpi; 1084a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ydpi; 109a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 110a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 112a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int openFramebufferDevice(hwc_context_t *ctx) 114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct fb_fix_screeninfo finfo; 116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct fb_var_screeninfo info; 117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fb_fd = openFb(HWC_DISPLAY_PRIMARY); 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fb_fd < 0) { 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Error Opening FB : %s", __FUNCTION__, strerror(errno)); 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &info) == -1) { 125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s:Error in ioctl FBIOGET_VSCREENINFO: %s", __FUNCTION__, 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strerror(errno)); 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fb_fd); 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (int(info.width) <= 0 || int(info.height) <= 0) { 132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // the driver doesn't return that information 133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // default to 160 dpi 1344217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu info.width = (int)(((float)info.xres * 25.4f)/160.0f + 0.5f); 1354217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu info.height = (int)(((float)info.yres * 25.4f)/160.0f + 0.5f); 136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1384217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float xdpi = ((float)info.xres * 25.4f) / (float)info.width; 1394217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float ydpi = ((float)info.yres * 25.4f) / (float)info.height; 140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef MSMFB_METADATA_GET 142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct msmfb_metadata metadata; 143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&metadata, 0 , sizeof(metadata)); 144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson metadata.op = metadata_op_frame_rate; 145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) { 147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s:Error retrieving panel frame rate: %s", __FUNCTION__, 148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strerror(errno)); 149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fb_fd); 150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1534217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float fps = (float)metadata.data.panel_frame_rate; 154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#else 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //XXX: Remove reserved field usage on all baselines 156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //The reserved[3] field is used to store FPS by the driver. 157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float fps = info.reserved[3] & 0xFF; 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) == -1) { 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s:Error in ioctl FBIOGET_FSCREENINFO: %s", __FUNCTION__, 162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strerror(errno)); 163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fb_fd); 164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = fb_fd; 168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //xres, yres may not be 32 aligned 169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = finfo.line_length /(info.xres/8); 170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = info.xres; 171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = info.yres; 172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = xdpi; 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ydpi; 1744217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period = 1754217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu (uint32_t)(1000000000l / fps); 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 177a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //To change resolution of primary display 1784a00e758321e1561b13817aaee07ea43ccaad3e9Praveena Pachipulusu changeResolution(ctx, info.xres, info.yres, info.width, info.height); 179a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Unblank primary on first boot 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ioctl(fb_fd, FBIOBLANK,FB_BLANK_UNBLANK) < 0) { 182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Failed to unblank display", __FUNCTION__); 183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive = true; 186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid initContext(hwc_context_t *ctx) 191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson openFramebufferDevice(ctx); 193a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal char value[PROPERTY_VALUE_MAX]; 194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.version = qdutils::MDPVersion::getInstance().getMDPVersion(); 195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.hasOverlay = qdutils::MDPVersion::getInstance().hasOverlay(); 196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.panel = qdutils::MDPVersion::getInstance().getPanelType(); 197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Overlay::initOverlay(); 198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay = overlay::Overlay::getInstance(); 199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mRotMgr = RotMgr::getInstance(); 200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Is created and destroyed only once for primary 202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For external it could get created and destroyed multiple times depending 203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //on what external we connect to. 204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mFBUpdate[HWC_DISPLAY_PRIMARY] = 205a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson IFBUpdate::getObject(ctx, HWC_DISPLAY_PRIMARY); 206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 207a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Check if the target supports copybit compostion (dyn/mdp) to 208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // decide if we need to open the copybit module. 209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int compositionType = 210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::QCCompositionType::getInstance().getCompositionType(); 211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 212a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Only MDP copybit is used 213a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if ((compositionType & (qdutils::COMPOSITION_TYPE_DYN | 214a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qdutils::COMPOSITION_TYPE_MDP)) && 215a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (qdutils::MDPVersion::getInstance().getMDPVersion() == 216a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qdutils::MDP_V3_0_4)) { 217a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mCopyBit[HWC_DISPLAY_PRIMARY] = new CopyBit(ctx, 218a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson HWC_DISPLAY_PRIMARY); 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mExtDisplay = new ExternalDisplay(ctx); 222a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualDisplay = new VirtualDisplay(ctx); 223a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualonExtActive = false; 224a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive = false; 225a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected = false; 226a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = false; 227a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected = false; 228a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].mDownScaleMode= false; 229a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].mDownScaleMode = false; 230a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].mDownScaleMode = false; 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 232a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mMDPComp[HWC_DISPLAY_PRIMARY] = 233a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MDPComp::getObject(ctx, HWC_DISPLAY_PRIMARY); 234a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].connected = true; 2355470587fb130854eb11a110b45d951883391e356Arun Kumar K.R //Initialize the primary display viewFrame info 2365470587fb130854eb11a110b45d951883391e356Arun Kumar K.R ctx->mViewFrame[HWC_DISPLAY_PRIMARY].left = 0; 2375470587fb130854eb11a110b45d951883391e356Arun Kumar K.R ctx->mViewFrame[HWC_DISPLAY_PRIMARY].top = 0; 2385470587fb130854eb11a110b45d951883391e356Arun Kumar K.R ctx->mViewFrame[HWC_DISPLAY_PRIMARY].right = 2395470587fb130854eb11a110b45d951883391e356Arun Kumar K.R (int)ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 2405470587fb130854eb11a110b45d951883391e356Arun Kumar K.R ctx->mViewFrame[HWC_DISPLAY_PRIMARY].bottom = 2415470587fb130854eb11a110b45d951883391e356Arun Kumar K.R (int)ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 242a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal 243a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal ctx->mVDSEnabled = false; 244a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal if((property_get("persist.hwc.enable_vds", value, NULL) > 0)) { 245a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal if(atoi(value) != 0) { 246a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal ctx->mVDSEnabled = true; 247a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal } 248a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal } 249a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal ctx->mHWCVirtual = HWCVirtualBase::getObject(ctx->mVDSEnabled); 250a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 251a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for (uint32_t i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 252a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHwcDebug[i] = new HwcDebug(i); 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[i] = new LayerRotMap(); 254a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mAnimationState[i] = ANIMATION_STOPPED; 255a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[i].mActionSafePresent = false; 256a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[i].mAsWidthRatio = 0; 257a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[i].mAsHeightRatio = 0; 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 260a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for (uint32_t i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 261a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mPrevHwLayerCount[i] = 0; 262a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MDPComp::init(ctx); 265a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mAD = new AssertiveDisplay(ctx); 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->vstate.enable = false; 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->vstate.fakevsync = false; 269a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtOrientation = 0; 270a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->numActiveDisplays = 1; 271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Right now hwc starts the service but anybody could do it, or it could be 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //independent process as well. 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson QService::init(); 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson sp<IQClient> client = new QClient(ctx); 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson interface_cast<IQService>( 277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson defaultServiceManager()->getService( 278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson String16("display.qservice")))->connect(client); 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 280a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Initialize device orientation to its default orientation 281a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->deviceOrientation = 0; 282a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mBufferMirrorMode = false; 283a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 28457ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa // Read the system property to determine if downscale feature is enabled. 28557ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa ctx->mMDPDownscaleEnabled = false; 28657ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa if(property_get("sys.hwc.mdp_downscale_enabled", value, "false") 28757ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa && !strcmp(value, "true")) { 28857ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa ctx->mMDPDownscaleEnabled = true; 28957ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa } 29057ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa 291bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh ctx->enableABC = false; 292bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh property_get("debug.sf.hwc.canUseABC", value, "0"); 293bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh ctx->enableABC = atoi(value) ? true : false; 294bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh 2951b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan // Initialize gpu perfomance hint related parameters 2961b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan property_get("sys.hwc.gpu_perf_mode", value, "0"); 2973a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah#ifdef QCOM_BSP 2981b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ctx->mGPUHintInfo.mGpuPerfModeEnable = atoi(value)? true : false; 2991b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 3001b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ctx->mGPUHintInfo.mEGLDisplay = NULL; 3011b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ctx->mGPUHintInfo.mEGLContext = NULL; 3023b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan ctx->mGPUHintInfo.mCompositionState = COMPOSITION_STATE_MDP; 3031b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ctx->mGPUHintInfo.mCurrGPUPerfMode = EGL_GPU_LEVEL_0; 3043a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah#endif 305392015f27bf5930ccb8b2c8955b28c2137b4c65bArun Kumar K.R memset(&(ctx->mPtorInfo), 0, sizeof(ctx->mPtorInfo)); 306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGI("Initializing Qualcomm Hardware Composer"); 307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGI("MDP version: %d", ctx->mMDP.version); 308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid closeContext(hwc_context_t *ctx) 311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mOverlay) { 313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mOverlay; 314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay = NULL; 315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mRotMgr) { 318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mRotMgr; 319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mRotMgr = NULL; 320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 322a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mCopyBit[i]) { 324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mCopyBit[i]; 325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mCopyBit[i] = NULL; 326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd) { 330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd); 331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = -1; 332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mExtDisplay) { 335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mExtDisplay; 336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mExtDisplay = NULL; 337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 339a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mFBUpdate[i]) { 341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mFBUpdate[i]; 342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mFBUpdate[i] = NULL; 343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDPComp[i]) { 345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mMDPComp[i]; 346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDPComp[i] = NULL; 347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 348a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHwcDebug[i]) { 349a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete ctx->mHwcDebug[i]; 350a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHwcDebug[i] = NULL; 351a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mLayerRotMap[i]) { 353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mLayerRotMap[i]; 354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[i] = NULL; 355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 357a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHWCVirtual) { 358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete ctx->mHWCVirtual; 359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHWCVirtual = NULL; 360a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mAD) { 362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mAD; 363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mAD = NULL; 364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 365a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 366a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid dumpsys_log(android::String8& buf, const char* fmt, ...) 371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_list varargs; 373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_start(varargs, fmt); 374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson buf.appendFormatV(fmt, varargs); 375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_end(varargs); 376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 378a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint getExtOrientation(hwc_context_t* ctx) { 379a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = ctx->mExtOrientation; 380a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mBufferMirrorMode) 381a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrient = getMirrorModeOrientation(ctx); 382a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return extOrient; 383a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 384a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* Calculates the destination position based on the action safe rectangle */ 386a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& rect) { 387a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Position 388a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int x = rect.left, y = rect.top; 389a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int w = rect.right - rect.left; 390a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int h = rect.bottom - rect.top; 391ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 392a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!ctx->dpyAttr[dpy].mActionSafePresent) 393ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 394a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Read action safe properties 395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int asWidthRatio = ctx->dpyAttr[dpy].mAsWidthRatio; 396a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int asHeightRatio = ctx->dpyAttr[dpy].mAsHeightRatio; 397ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float wRatio = 1.0; 399ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float hRatio = 1.0; 400ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float xRatio = 1.0; 401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float yRatio = 1.0; 402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 403a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbWidth = ctx->dpyAttr[dpy].xres; 404a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbHeight = ctx->dpyAttr[dpy].yres; 405a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].mDownScaleMode) { 406a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if downscale Mode is enabled for external, need to query 407a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // the actual width and height, as that is the physical w & h 408a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->getAttributes(fbWidth, fbHeight); 409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 410a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 411a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 412a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Since external is rotated 90, need to swap width/height 413a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = getExtOrientation(ctx); 414a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 415a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient & HWC_TRANSFORM_ROT_90) 416a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(fbWidth, fbHeight); 417ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 418ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float asX = 0; 419ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float asY = 0; 4204217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float asW = (float)fbWidth; 4214217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float asH = (float)fbHeight; 422ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 423ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // based on the action safe ratio, get the Action safe rectangle 4244217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu asW = ((float)fbWidth * (1.0f - (float)asWidthRatio / 100.0f)); 4254217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu asH = ((float)fbHeight * (1.0f - (float)asHeightRatio / 100.0f)); 4264217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu asX = ((float)fbWidth - asW) / 2; 4274217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu asY = ((float)fbHeight - asH) / 2; 428ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 429ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // calculate the position ratio 4304217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu xRatio = (float)x/(float)fbWidth; 4314217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu yRatio = (float)y/(float)fbHeight; 4324217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu wRatio = (float)w/(float)fbWidth; 4334217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu hRatio = (float)h/(float)fbHeight; 434ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 435ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Calculate the position... 4364217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu x = int((xRatio * asW) + asX); 4374217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu y = int((yRatio * asH) + asY); 4384217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu w = int(wRatio * asW); 4394217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu h = int(hRatio * asH); 440ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 441a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Convert it back to hwc_rect_t 442a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.left = x; 443a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.top = y; 444a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.right = w + rect.left; 445a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.bottom = h + rect.top; 446a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 447ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 448ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 449ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 450a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// This function gets the destination position for Seconday display 451a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// based on the position and aspect ratio with orientation 452a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid getAspectRatioPosition(hwc_context_t* ctx, int dpy, int extOrientation, 453a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& inRect, hwc_rect_t& outRect) { 454a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Physical display resolution 4554217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float fbWidth = (float)ctx->dpyAttr[dpy].xres; 4564217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float fbHeight = (float)ctx->dpyAttr[dpy].yres; 457a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //display position(x,y,w,h) in correct aspectratio after rotation 458a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int xPos = 0; 459a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int yPos = 0; 460a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float width = fbWidth; 461a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float height = fbHeight; 462a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Width/Height used for calculation, after rotation 463a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float actualWidth = fbWidth; 464a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float actualHeight = fbHeight; 465a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 466a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float wRatio = 1.0; 467a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float hRatio = 1.0; 468a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float xRatio = 1.0; 469a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float yRatio = 1.0; 470a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t rect = {0, 0, (int)fbWidth, (int)fbHeight}; 471a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 472a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Dim inPos(inRect.left, inRect.top, inRect.right - inRect.left, 473a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson inRect.bottom - inRect.top); 474a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Dim outPos(outRect.left, outRect.top, outRect.right - outRect.left, 475a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.bottom - outRect.top); 476a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 4774217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu Whf whf((uint32_t)fbWidth, (uint32_t)fbHeight, 0); 478a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eTransform extorient = static_cast<eTransform>(extOrientation); 479a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // To calculate the destination co-ordinates in the new orientation 480a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson preRotateSource(extorient, whf, inPos); 481a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 482a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrientation & HAL_TRANSFORM_ROT_90) { 483a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Swap width/height for input position 484a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swapWidthHeight(actualWidth, actualHeight); 4854217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu getAspectRatioPosition((int)fbWidth, (int)fbHeight, (int)actualWidth, 486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (int)actualHeight, rect); 487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xPos = rect.left; 488a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yPos = rect.top; 4894217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu width = float(rect.right - rect.left); 4904217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu height = float(rect.bottom - rect.top); 4914217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu } 492cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain xRatio = (float)((float)inPos.x/actualWidth); 493cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain yRatio = (float)((float)inPos.y/actualHeight); 494cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain wRatio = (float)((float)inPos.w/actualWidth); 495cfb968873b9e94dca883aadabee42b01558faea9Shalaj Jain hRatio = (float)((float)inPos.h/actualHeight); 4964217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu 4974217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu //Calculate the pos9ition... 4984217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.x = uint32_t((xRatio * width) + (float)xPos); 4994217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.y = uint32_t((yRatio * height) + (float)yPos); 5004217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.w = uint32_t(wRatio * width); 5014217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.h = uint32_t(hRatio * height); 502a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: Calculated AspectRatio Position: x = %d," 503a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson "y = %d w = %d h = %d", __FUNCTION__, outPos.x, outPos.y, 504a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w, outPos.h); 505a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 506a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // For sidesync, the dest fb will be in portrait orientation, and the crop 507a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // will be updated to avoid the black side bands, and it will be upscaled 508a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // to fit the dest RB, so recalculate 509a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // the position based on the new width and height 510a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if ((extOrientation & HWC_TRANSFORM_ROT_90) && 511a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson isOrientationPortrait(ctx)) { 512a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t r = {0, 0, 0, 0}; 513a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the position 5144217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu xRatio = (float)(outPos.x - xPos)/width; 515a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // GetaspectRatio -- tricky to get the correct aspect ratio 516a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // But we need to do this. 5174217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu getAspectRatioPosition((int)width, (int)height, 5184217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu (int)width,(int)height, r); 519a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xPos = r.left; 520a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yPos = r.top; 5214217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float tempHeight = float(r.bottom - r.top); 5224217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu yRatio = (float)yPos/height; 5234217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu wRatio = (float)outPos.w/width; 524a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hRatio = tempHeight/height; 525a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 526a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Map the coordinates back to Framebuffer domain 5274217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.x = uint32_t(xRatio * fbWidth); 5284217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.y = uint32_t(yRatio * fbHeight); 5294217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.w = uint32_t(wRatio * fbWidth); 5304217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.h = uint32_t(hRatio * fbHeight); 531a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 532a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: Calculated AspectRatio for device in" 533a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson "portrait: x = %d,y = %d w = %d h = %d", __FUNCTION__, 534a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.x, outPos.y, 535a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w, outPos.h); 536a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 537a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].mDownScaleMode) { 538a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extW, extH; 539a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_EXTERNAL) 540a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->getAttributes(extW, extH); 541a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else 542a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualDisplay->getAttributes(extW, extH); 5434217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu fbWidth = (float)ctx->dpyAttr[dpy].xres; 5444217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu fbHeight = (float)ctx->dpyAttr[dpy].yres; 545a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the position... 5464217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu xRatio = (float)outPos.x/fbWidth; 5474217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu yRatio = (float)outPos.y/fbHeight; 5484217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu wRatio = (float)outPos.w/fbWidth; 5494217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu hRatio = (float)outPos.h/fbHeight; 550a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 5514217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.x = uint32_t(xRatio * (float)extW); 5524217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.y = uint32_t(yRatio * (float)extH); 5534217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.w = uint32_t(wRatio * (float)extW); 5544217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu outPos.h = uint32_t(hRatio * (float)extH); 555a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 556a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Convert Dim to hwc_rect_t 557a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.left = outPos.x; 558a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.top = outPos.y; 559a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.right = outPos.x + outPos.w; 560a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.bottom = outPos.y + outPos.h; 561a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 562a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return; 563a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 564a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 565a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isPrimaryPortrait(hwc_context_t *ctx) { 566a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 567a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 568a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(fbWidth < fbHeight) { 569a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 570a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 571a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 572a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 573a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 574a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isOrientationPortrait(hwc_context_t *ctx) { 575a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isPrimaryPortrait(ctx)) { 576a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return !(ctx->deviceOrientation & 0x1); 577a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 578a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return (ctx->deviceOrientation & 0x1); 579a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 580a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 581a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid calcExtDisplayPosition(hwc_context_t *ctx, 582a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd, 583a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dpy, 584a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& sourceCrop, 585a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& displayFrame, 586a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int& transform, 587a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eTransform& orient) { 588a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Swap width and height when there is a 90deg transform 589a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = getExtOrientation(ctx); 5904418482cd51e8343e7efd978ccdd17c616d1d78aRaj Kamal if(dpy && ctx->mOverlay->isUIScalingOnExternalSupported()) { 591a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isYuvBuffer(hnd)) { 592a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient & HWC_TRANSFORM_ROT_90) { 593a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dstWidth = ctx->dpyAttr[dpy].xres; 594a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dstHeight = ctx->dpyAttr[dpy].yres;; 595a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int srcWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 596a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int srcHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 597a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isPrimaryPortrait(ctx)) { 598a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(srcWidth, srcHeight); 599a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } // Get Aspect Ratio for external 600a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(dstWidth, dstHeight, srcWidth, 601a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson srcHeight, displayFrame); 602a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Crop - this is needed, because for sidesync, the dest fb will 603a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // be in portrait orientation, so update the crop to not show the 604a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // black side bands. 605a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (isOrientationPortrait(ctx)) { 606a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sourceCrop = displayFrame; 607a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.left = 0; 608a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.top = 0; 609a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.right = dstWidth; 610a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.bottom = dstHeight; 611a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 612a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 613a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].mDownScaleMode) { 614a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extW, extH; 615a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if downscale is enabled, map the co-ordinates to new 616a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // domain(downscaled) 6174217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float fbWidth = (float)ctx->dpyAttr[dpy].xres; 6184217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu float fbHeight = (float)ctx->dpyAttr[dpy].yres; 619a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // query MDP configured attributes 620a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_EXTERNAL) 621a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->getAttributes(extW, extH); 622a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else 623a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualDisplay->getAttributes(extW, extH); 624a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the ratio... 625a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float wRatio = ((float)extW)/fbWidth; 626a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float hRatio = ((float)extH)/fbHeight; 627a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 628a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //convert Dim to hwc_rect_t 6294217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.left = int(wRatio*(float)displayFrame.left); 6304217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.top = int(hRatio*(float)displayFrame.top); 6314217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.right = int(wRatio*(float)displayFrame.right); 6324217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu displayFrame.bottom = int(hRatio*(float)displayFrame.bottom); 633a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 634a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson }else { 635a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient || ctx->dpyAttr[dpy].mDownScaleMode) { 636a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(ctx, dpy, extOrient, 637a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame, displayFrame); 638a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 639a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 640a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // If there is a external orientation set, use that 641a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient) { 642a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson transform = extOrient; 643a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson orient = static_cast<ovutils::eTransform >(extOrient); 644a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 645a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate the actionsafe dimensions for External(dpy = 1 or 2) 646a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getActionSafePosition(ctx, dpy, displayFrame); 647a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 648a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 649a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 650a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* Returns the orientation which needs to be set on External for 651a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * SideSync/Buffer Mirrormode 652a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 653a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint getMirrorModeOrientation(hwc_context_t *ctx) { 654a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrientation = 0; 655a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int deviceOrientation = ctx->deviceOrientation; 656a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isPrimaryPortrait(ctx)) 657a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson deviceOrientation = (deviceOrientation + 1) % 4; 658a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (deviceOrientation == 0) 659a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = HWC_TRANSFORM_ROT_270; 660a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (deviceOrientation == 1)//90 661a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = 0; 662a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (deviceOrientation == 2)//180 663a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = HWC_TRANSFORM_ROT_90; 664a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (deviceOrientation == 3)//270 665a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = HWC_TRANSFORM_FLIP_V | HWC_TRANSFORM_FLIP_H; 666a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 667a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return extOrientation; 668a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 669a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 670a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal/* Get External State names */ 671a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamalconst char* getExternalDisplayState(uint32_t external_state) { 672a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal static const char* externalStates[EXTERNAL_MAXSTATES] = {0}; 673a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal externalStates[EXTERNAL_OFFLINE] = STR(EXTERNAL_OFFLINE); 674a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal externalStates[EXTERNAL_ONLINE] = STR(EXTERNAL_ONLINE); 675a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal externalStates[EXTERNAL_PAUSE] = STR(EXTERNAL_PAUSE); 676a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal externalStates[EXTERNAL_RESUME] = STR(EXTERNAL_RESUME); 677a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal 678a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal if(external_state >= EXTERNAL_MAXSTATES) { 679a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal return "EXTERNAL_INVALID"; 680a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal } 681a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal 682a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal return externalStates[external_state]; 683a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal} 684a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal 685a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isDownscaleRequired(hwc_layer_1_t const* layer) { 686a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 687a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 688ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_w, dst_h, src_w, src_h; 689a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_w = displayFrame.right - displayFrame.left; 690a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_h = displayFrame.bottom - displayFrame.top; 691a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_w = sourceCrop.right - sourceCrop.left; 692a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_h = sourceCrop.bottom - sourceCrop.top; 693a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 694a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(((src_w > dst_w) || (src_h > dst_h))) 695a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 696ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 697a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 698a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 699a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool needsScaling(hwc_layer_1_t const* layer) { 700a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_w, dst_h, src_w, src_h; 701ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 702ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 703ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 704ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_w = displayFrame.right - displayFrame.left; 705ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_h = displayFrame.bottom - displayFrame.top; 706ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson src_w = sourceCrop.right - sourceCrop.left; 707ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson src_h = sourceCrop.bottom - sourceCrop.top; 708ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 709ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(((src_w != dst_w) || (src_h != dst_h))) 710ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 711ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 712ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 713ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 714ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 715a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// Checks if layer needs scaling with split 716a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer, 717ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& dpy) { 718a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 719a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int src_width_l, src_height_l; 720a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int src_width_r, src_height_r; 721a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_width_l, dst_height_l; 722a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_width_r, dst_height_r; 723a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_w = ctx->dpyAttr[dpy].xres; 724a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_h = ctx->dpyAttr[dpy].yres; 725a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t cropL, dstL, cropR, dstR; 726a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int lSplit = getLeftSplit(ctx, dpy); 727a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 728a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 729a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 730a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 731a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson cropL = sourceCrop; 732a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dstL = displayFrame; 733a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissorL = { 0, 0, lSplit, hw_h }; 734a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissorL = getIntersection(ctx->mViewFrame[dpy], scissorL); 735a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(cropL, dstL, scissorL, 0); 736a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 737a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson cropR = sourceCrop; 738a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dstR = displayFrame; 739a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissorR = { lSplit, 0, hw_w, hw_h }; 740a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissorR = getIntersection(ctx->mViewFrame[dpy], scissorR); 741a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(cropR, dstR, scissorR, 0); 742a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 743a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Sanitize Crop to stitch 744a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sanitizeSourceCrop(cropL, cropR, hnd); 745a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 746a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate the left dst 747a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_width_l = dstL.right - dstL.left; 748a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_height_l = dstL.bottom - dstL.top; 749a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_width_l = cropL.right - cropL.left; 750a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_height_l = cropL.bottom - cropL.top; 751a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 752a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // check if there is any scaling on the left 753a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(((src_width_l != dst_width_l) || (src_height_l != dst_height_l))) 754a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 755a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 756a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate the right dst 757a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_width_r = dstR.right - dstR.left; 758a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_height_r = dstR.bottom - dstR.top; 759a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_width_r = cropR.right - cropR.left; 760a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_height_r = cropR.bottom - cropR.top; 761a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 762a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // check if there is any scaling on the right 763a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(((src_width_r != dst_width_r) || (src_height_r != dst_height_r))) 764a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 765a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 766a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 767a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 768a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 769a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isAlphaScaled(hwc_layer_1_t const* layer) { 770a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(needsScaling(layer) && isAlphaPresent(layer)) { 771ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 772ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 773ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 774ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 775ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 776ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isAlphaPresent(hwc_layer_1_t const* layer) { 777ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 778ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(hnd) { 779ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int format = hnd->format; 780ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(format) { 781ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_RGBA_8888: 782ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_BGRA_8888: 783ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // In any more formats with Alpha go here.. 784ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 785ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default : return false; 786ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 787ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 788ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 789ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 790ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 791a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void trimLayer(hwc_context_t *ctx, const int& dpy, const int& transform, 792a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& crop, hwc_rect_t& dst) { 793a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_w = ctx->dpyAttr[dpy].xres; 794a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_h = ctx->dpyAttr[dpy].yres; 795a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dst.left < 0 || dst.top < 0 || 796a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst.right > hw_w || dst.bottom > hw_h) { 797a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 798a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissor = getIntersection(ctx->mViewFrame[dpy], scissor); 799a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(crop, dst, scissor, transform); 800a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 801a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 802a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 803a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void trimList(hwc_context_t *ctx, hwc_display_contents_1_t *list, 804a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy) { 805a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers - 1; i++) { 806a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[i]; 807a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 808a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimLayer(ctx, dpy, 809a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson list->hwLayers[i].transform, 810a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (hwc_rect_t&)crop, 811a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (hwc_rect_t&)list->hwLayers[i].displayFrame); 8124217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.left = (float)crop.left; 8134217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.right = (float)crop.right; 8144217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.top = (float)crop.top; 8154217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.bottom = (float)crop.bottom; 816ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 817ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 818ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 819ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid setListStats(hwc_context_t *ctx, 820a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_display_contents_1_t *list, int dpy) { 821ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int prevYuvCount = ctx->listStats[dpy].yuvCount; 822ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&ctx->listStats[dpy], 0, sizeof(ListStats)); 8234217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ctx->listStats[dpy].numAppLayers = (int)list->numHwLayers - 1; 8244217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ctx->listStats[dpy].fbLayerIndex = (int)list->numHwLayers - 1; 825ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].skipCount = 0; 826ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].preMultipliedAlpha = false; 827ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].isSecurePresent = false; 828ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].yuvCount = 0; 829a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char property[PROPERTY_VALUE_MAX]; 830a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].extOnlyLayerIndex = -1; 831a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].isDisplayAnimating = false; 832a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].secureUI = false; 833a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].yuv4k2kCount = 0; 834a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].mActionSafePresent = isActionSafePresent(ctx, dpy); 835bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh ctx->listStats[dpy].renderBufIndexforABC = -1; 836a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 8376f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran resetROI(ctx, dpy); 8386f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 839e36c30ff5f33bbe31675d784d2e85a2f2c6a8fcdSushil Chauhan trimList(ctx, list, dpy); 840e36c30ff5f33bbe31675d784d2e85a2f2c6a8fcdSushil Chauhan optimizeLayerRects(list); 841ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (size_t i = 0; i < (size_t)ctx->listStats[dpy].numAppLayers; i++) { 842ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_layer_1_t const* layer = &list->hwLayers[i]; 843ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 844ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 845a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef QCOM_BSP 846a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_SCREENSHOT_ANIMATOR_LAYER) { 847a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].isDisplayAnimating = true; 848a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 849a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isSecureDisplayBuffer(hnd)) { 850a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].secureUI = true; 851a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 852a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 853ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // continue if number of app layers exceeds MAX_NUM_APP_LAYERS 854ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->listStats[dpy].numAppLayers > MAX_NUM_APP_LAYERS) 855ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson continue; 856ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 857ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //reset yuv indices 858ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].yuvIndices[i] = -1; 859a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].yuv4k2kIndices[i] = -1; 860ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 861ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSecureBuffer(hnd)) { 862ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].isSecurePresent = true; 863ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 864ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 865ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSkipLayer(&list->hwLayers[i])) { 866ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].skipCount++; 867a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 868a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 869a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (UNLIKELY(isYuvBuffer(hnd))) { 870ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& yuvCount = ctx->listStats[dpy].yuvCount; 8714217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ctx->listStats[dpy].yuvIndices[yuvCount] = (int)i; 872ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson yuvCount++; 873ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 874a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(UNLIKELY(is4kx2kYuvBuffer(hnd))){ 875a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int& yuv4k2kCount = ctx->listStats[dpy].yuv4k2kCount; 8764217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ctx->listStats[dpy].yuv4k2kIndices[yuv4k2kCount] = (int)i; 877a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yuv4k2kCount++; 878a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 879ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 880ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(layer->blending == HWC_BLENDING_PREMULT) 881ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].preMultipliedAlpha = true; 882a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 883a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 884a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(UNLIKELY(isExtOnly(hnd))){ 8854217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ctx->listStats[dpy].extOnlyLayerIndex = (int)i; 886a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 887a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 888a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->listStats[dpy].yuvCount > 0) { 889a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (property_get("hw.cabl.yuv", property, NULL) > 0) { 890a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (atoi(property) != 1) { 891a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_set("hw.cabl.yuv", "1"); 892a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 893a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 894a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else { 895a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (property_get("hw.cabl.yuv", property, NULL) > 0) { 896a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (atoi(property) != 0) { 897a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_set("hw.cabl.yuv", "0"); 898a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 899a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 900a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 901a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 902ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //The marking of video begin/end is useful on some targets where we need 903ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //to have a padding round to be able to shift pipes across mixers. 904ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(prevYuvCount != ctx->listStats[dpy].yuvCount) { 905ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mVideoTransFlag = true; 906ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 907a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 908ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY) { 909ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mAD->markDoable(ctx, list); 910ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 911ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 912ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 913ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 914ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic void calc_cut(double& leftCutRatio, double& topCutRatio, 915ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson double& rightCutRatio, double& bottomCutRatio, int orient) { 916ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(orient & HAL_TRANSFORM_FLIP_H) { 917ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(leftCutRatio, rightCutRatio); 918ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 919ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(orient & HAL_TRANSFORM_FLIP_V) { 920ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(topCutRatio, bottomCutRatio); 921ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 922ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(orient & HAL_TRANSFORM_ROT_90) { 923ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Anti clock swapping 924ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson double tmpCutRatio = leftCutRatio; 925ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson leftCutRatio = topCutRatio; 926ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson topCutRatio = rightCutRatio; 927ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rightCutRatio = bottomCutRatio; 928ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bottomCutRatio = tmpCutRatio; 929ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 930ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 931ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 932ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer) { 933ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((ctx->mMDP.version < qdutils::MDSS_V5) && 934ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (ctx->mMDP.version > qdutils::MDP_V3_0) && 935ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mSecuring) { 936ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 937ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 938ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSecureModePolicy(ctx->mMDP.version)) { 939ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 940ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mSecureMode) { 941ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (! isSecureBuffer(hnd)) { 942a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG,"%s:Securing Turning ON ...", 943a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson __FUNCTION__); 944ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 945ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 946ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 947ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSecureBuffer(hnd)) { 948a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG,"%s:Securing Turning OFF ...", 949a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson __FUNCTION__); 950ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 951ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 952ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 953ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 954ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 955ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 956ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 957ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isSecureModePolicy(int mdpVersion) { 958ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (mdpVersion < qdutils::MDSS_V5) 959ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 960ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson else 961ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 962ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 963ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 9644a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnanbool isRotatorSupportedFormat(private_handle_t *hnd) { 9654a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan // Following rotator src formats are supported by mdp driver 9664a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan // TODO: Add more formats in future, if mdp driver adds support 9674a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan switch(hnd->format) { 9684a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan case HAL_PIXEL_FORMAT_RGBA_8888: 9694a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan case HAL_PIXEL_FORMAT_RGB_565: 9704a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan case HAL_PIXEL_FORMAT_RGB_888: 9714a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan case HAL_PIXEL_FORMAT_BGRA_8888: 9724a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan return true; 9734a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan default: 9744a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan return false; 9754a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan } 9764a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan return false; 9774a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan} 9784a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan 9794a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnanbool isRotationDoable(hwc_context_t *ctx, private_handle_t *hnd) { 9804a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan // Rotate layers, if it is YUV type or rendered by CPU and not 9814a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan // for the MDP versions below MDP5 9824a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if((isCPURendered(hnd) && isRotatorSupportedFormat(hnd) && 9834a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan !ctx->mMDP.version < qdutils::MDSS_V5) 9844a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan || isYuvBuffer(hnd)) { 9854a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan return true; 9864a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan } 9874a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan return false; 9884a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan} 9894a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan 990a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// returns true if Action safe dimensions are set and target supports Actionsafe 991a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isActionSafePresent(hwc_context_t *ctx, int dpy) { 992a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if external supports underscan, do nothing 993a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // it will be taken care in the driver 99409b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan // Disable Action safe for 8974 due to HW limitation for downscaling 99509b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan // layers with overlapped region 99609b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan // Disable Actionsafe for non HDMI displays. 99709b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan if(!(dpy == HWC_DISPLAY_EXTERNAL) || 99809b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan qdutils::MDPVersion::getInstance().is8x74v2() || 99909b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan ctx->mExtDisplay->isCEUnderscanSupported()) { 1000a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 100109b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan } 1002a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1003a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char value[PROPERTY_VALUE_MAX]; 1004a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Read action safe properties 1005a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_get("persist.sys.actionsafe.width", value, "0"); 1006a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].mAsWidthRatio = atoi(value); 1007a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_get("persist.sys.actionsafe.height", value, "0"); 1008a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].mAsHeightRatio = atoi(value); 1009a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1010a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!ctx->dpyAttr[dpy].mAsWidthRatio && !ctx->dpyAttr[dpy].mAsHeightRatio) { 1011a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //No action safe ratio set, return 1012a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 1013a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1014a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 1015a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1016a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1017ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getBlending(int blending) { 1018ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(blending) { 1019ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BLENDING_NONE: 1020ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return overlay::utils::OVERLAY_BLENDING_OPAQUE; 1021ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BLENDING_PREMULT: 1022ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return overlay::utils::OVERLAY_BLENDING_PREMULT; 1023ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BLENDING_COVERAGE : 1024ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 1025ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return overlay::utils::OVERLAY_BLENDING_COVERAGE; 1026ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1027ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1028ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1029ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//Crops source buffer against destination and FB boundaries 1030ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 1031ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const hwc_rect_t& scissor, int orient) { 1032ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1033ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_l = crop.left; 1034ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_t = crop.top; 1035ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_r = crop.right; 1036ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_b = crop.bottom; 1037ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_w = crop.right - crop.left; 1038ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_h = crop.bottom - crop.top; 1039ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1040ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_l = dst.left; 1041ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_t = dst.top; 1042ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_r = dst.right; 1043ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_b = dst.bottom; 1044ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_w = abs(dst.right - dst.left); 1045ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_h = abs(dst.bottom - dst.top); 1046ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1047ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_l = scissor.left; 1048ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_t = scissor.top; 1049ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_r = scissor.right; 1050ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_b = scissor.bottom; 1051ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1052ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson double leftCutRatio = 0.0, rightCutRatio = 0.0, topCutRatio = 0.0, 1053ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bottomCutRatio = 0.0; 1054ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1055ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_l < sci_l) { 1056ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson leftCutRatio = (double)(sci_l - dst_l) / (double)dst_w; 1057ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_l = sci_l; 1058ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1059ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1060ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_r > sci_r) { 1061ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rightCutRatio = (double)(dst_r - sci_r) / (double)dst_w; 1062ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_r = sci_r; 1063ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1064ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1065ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_t < sci_t) { 1066ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson topCutRatio = (double)(sci_t - dst_t) / (double)dst_h; 1067ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_t = sci_t; 1068ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1069ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1070ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_b > sci_b) { 1071ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bottomCutRatio = (double)(dst_b - sci_b) / (double)dst_h; 1072ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_b = sci_b; 1073ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1074ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1075ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson calc_cut(leftCutRatio, topCutRatio, rightCutRatio, bottomCutRatio, orient); 10766a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_l += (int)round((double)crop_w * leftCutRatio); 10776a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_t += (int)round((double)crop_h * topCutRatio); 10786a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_r -= (int)round((double)crop_w * rightCutRatio); 10796a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_b -= (int)round((double)crop_h * bottomCutRatio); 1080ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1081ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1082a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool areLayersIntersecting(const hwc_layer_1_t* layer1, 1083a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const hwc_layer_1_t* layer2) { 1084a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t irect = getIntersection(layer1->displayFrame, 1085a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer2->displayFrame); 1086a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return isValidRect(irect); 1087a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1088a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 10896f7634666209698e4835b9f326278a7068834383Jeykumar Sankaranbool isSameRect(const hwc_rect& rect1, const hwc_rect& rect2) 10906f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran{ 10916f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran return ((rect1.left == rect2.left) && (rect1.top == rect2.top) && 10926f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran (rect1.right == rect2.right) && (rect1.bottom == rect2.bottom)); 10936f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran} 10946f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 1095a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isValidRect(const hwc_rect& rect) 1096a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 1097a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ((rect.bottom > rect.top) && (rect.right > rect.left)) ; 1098a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1099a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1100f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singhbool operator ==(const hwc_rect_t& lhs, const hwc_rect_t& rhs) { 1101f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singh if(lhs.left == rhs.left && lhs.top == rhs.top && 1102f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singh lhs.right == rhs.right && lhs.bottom == rhs.bottom ) 1103f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singh return true ; 1104f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singh return false; 1105f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singh} 1106f2ecc8f4b92739fcb1a75089f8fe01db1f178adbRamakant Singh 11075bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaranhwc_rect_t moveRect(const hwc_rect_t& rect, const int& x_off, const int& y_off) 11085bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran{ 11095bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran hwc_rect_t res; 11105bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran 11115bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran if(!isValidRect(rect)) 11125bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran return (hwc_rect_t){0, 0, 0, 0}; 11135bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran 11145bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran res.left = rect.left + x_off; 11155bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran res.top = rect.top + y_off; 11165bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran res.right = rect.right + x_off; 11175bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran res.bottom = rect.bottom + y_off; 11185bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran 11195bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran return res; 11205bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran} 11215bbc98fa2dcc744a1943cc8c85ce74169fc8a044Jeykumar Sankaran 1122a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* computes the intersection of two rects */ 1123a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t getIntersection(const hwc_rect_t& rect1, const hwc_rect_t& rect2) 1124a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 1125a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t res; 1126a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1127a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(rect1) || !isValidRect(rect2)){ 1128a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return (hwc_rect_t){0, 0, 0, 0}; 1129a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1130a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1131a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1132a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.left = max(rect1.left, rect2.left); 1133a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.top = max(rect1.top, rect2.top); 1134a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.right = min(rect1.right, rect2.right); 1135a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.bottom = min(rect1.bottom, rect2.bottom); 1136a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(res)) 1138a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return (hwc_rect_t){0, 0, 0, 0}; 1139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 1141a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1142a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1143a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* computes the union of two rects */ 1144a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t getUnion(const hwc_rect &rect1, const hwc_rect &rect2) 1145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 1146a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t res; 1147a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1148a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(rect1)){ 1149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return rect2; 1150a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1151a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1152a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(rect2)){ 1153a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return rect1; 1154a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1155a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1156a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.left = min(rect1.left, rect2.left); 1157a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.top = min(rect1.top, rect2.top); 1158a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.right = max(rect1.right, rect2.right); 1159a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.bottom = max(rect1.bottom, rect2.bottom); 1160a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1161a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 1162a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1163a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* Not a geometrical rect deduction. Deducts rect2 from rect1 only if it results 1165a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * a single rect */ 1166a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t deductRect(const hwc_rect_t& rect1, const hwc_rect_t& rect2) { 1167a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1168a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t res = rect1; 1169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1170a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((rect1.left == rect2.left) && (rect1.right == rect2.right)) { 1171a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((rect1.top == rect2.top) && (rect2.bottom <= rect1.bottom)) 1172a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.top = rect2.bottom; 1173a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if((rect1.bottom == rect2.bottom)&& (rect2.top >= rect1.top)) 1174a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.bottom = rect2.top; 1175a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1176a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if((rect1.top == rect2.top) && (rect1.bottom == rect2.bottom)) { 1177a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((rect1.left == rect2.left) && (rect2.right <= rect1.right)) 1178a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.left = rect2.right; 1179a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if((rect1.right == rect2.right)&& (rect2.left >= rect1.left)) 1180a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.right = rect2.left; 1181a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1182a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 1183a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1184a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1185a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid optimizeLayerRects(const hwc_display_contents_1_t *list) { 11864217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu int i= (int)list->numHwLayers-2; 1187a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson while(i > 0) { 1188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //see if there is no blending required. 1189a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If it is opaque see if we can substract this region from below 1190a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //layers. 1191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->hwLayers[i].blending == HWC_BLENDING_NONE) { 1192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int j= i-1; 1193a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& topframe = 1194a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (hwc_rect_t&)list->hwLayers[i].displayFrame; 1195a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson while(j >= 0) { 1196a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!needsScaling(&list->hwLayers[j])) { 1197a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t* layer = (hwc_layer_1_t*)&list->hwLayers[j]; 1198a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& bottomframe = layer->displayFrame; 1199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t bottomCrop = 1200a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson integerizeSourceCrop(layer->sourceCropf); 1201a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int transform =layer->transform; 1202a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1203a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t irect = getIntersection(bottomframe, topframe); 1204a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isValidRect(irect)) { 1205a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t dest_rect; 1206a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //if intersection is valid rect, deduct it 1207a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dest_rect = deductRect(bottomframe, irect); 1208a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(bottomCrop, bottomframe, 1209a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dest_rect, transform); 1210a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Update layer sourceCropf 12114217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.left =(float)bottomCrop.left; 12124217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.top = (float)bottomCrop.top; 12134217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.right = (float)bottomCrop.right; 12144217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu layer->sourceCropf.bottom = (float)bottomCrop.bottom; 1215c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran#ifdef QCOM_BSP 1216c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran //Update layer dirtyRect 1217c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran layer->dirtyRect = getIntersection(bottomCrop, 1218c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran layer->dirtyRect); 1219c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran#endif 1220a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1221a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1222a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson j--; 1223a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1224a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1225a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson i--; 1226a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1227a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1228a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getNonWormholeRegion(hwc_display_contents_1_t* list, 1230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t& nwr) 1231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 12324217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu size_t last = list->numHwLayers - 1; 1233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t fbDisplayFrame = list->hwLayers[last].displayFrame; 1234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Initiliaze nwr to first frame 1235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.left = list->hwLayers[0].displayFrame.left; 1236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.top = list->hwLayers[0].displayFrame.top; 1237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.right = list->hwLayers[0].displayFrame.right; 1238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.bottom = list->hwLayers[0].displayFrame.bottom; 1239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 12404217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu for (size_t i = 1; i < last; i++) { 1241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t displayFrame = list->hwLayers[i].displayFrame; 1242a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson nwr = getUnion(nwr, displayFrame); 1243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Intersect with the framebuffer 1246a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson nwr = getIntersection(nwr, fbDisplayFrame); 1247a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1249a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isExternalActive(hwc_context_t* ctx) { 1250a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive; 1251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1253a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid closeAcquireFds(hwc_display_contents_1_t* list) { 1254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(LIKELY(list)) { 1255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers; i++) { 1256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Close the acquireFenceFds 1257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HWC_FRAMEBUFFER are -1 already by SF, rest we close. 1258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].acquireFenceFd >= 0) { 1259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(list->hwLayers[i].acquireFenceFd); 1260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].acquireFenceFd = -1; 1261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Writeback 1264a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->outbufAcquireFenceFd >= 0) { 1265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(list->outbufAcquireFenceFd); 1266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->outbufAcquireFenceFd = -1; 1267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 1272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fd) { 1273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 1274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 1275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int acquireFd[MAX_NUM_APP_LAYERS]; 1276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int count = 0; 1277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int releaseFd = -1; 1278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int retireFd = -1; 1279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fbFd = -1; 1280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool swapzero = false; 1281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct mdp_buf_sync data; 1283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&data, 0, sizeof(data)); 1284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.acq_fen_fd = acquireFd; 1285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.rel_fen_fd = &releaseFd; 1286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.retire_fen_fd = &retireFd; 1287a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson data.flags = MDP_BUF_SYNC_FLAG_RETIRE_FENCE; 1288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char property[PROPERTY_VALUE_MAX]; 1290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(property_get("debug.egl.swapinterval", property, "1") > 0) { 1291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(atoi(property) == 0) 1292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swapzero = true; 1293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1295a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson bool isExtAnimating = false; 1296a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy) 1297a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson isExtAnimating = ctx->listStats[dpy].isDisplayAnimating; 1298a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1299a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Send acquireFenceFds to rotator 1300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < ctx->mLayerRotMap[dpy]->getCount(); i++) { 1301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotFd = ctx->mRotMgr->getRotDevFd(); 1302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotReleaseFd = -1; 1303a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson overlay::Rotator* currRot = ctx->mLayerRotMap[dpy]->getRot(i); 1304a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t* currLayer = ctx->mLayerRotMap[dpy]->getLayer(i); 1305a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((currRot == NULL) || (currLayer == NULL)) { 1306a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson continue; 1307a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct mdp_buf_sync rotData; 1309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&rotData, 0, sizeof(rotData)); 1310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotData.acq_fen_fd = 1311a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson &currLayer->acquireFenceFd; 1312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotData.rel_fen_fd = &rotReleaseFd; //driver to populate this 1313a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rotData.session_id = currRot->getSessId(); 1314f2cd42c336f41ca3184c0dc5942fec285a227b81Saurabh Shah if(currLayer->acquireFenceFd >= 0) { 1315f2cd42c336f41ca3184c0dc5942fec285a227b81Saurabh Shah rotData.acq_fen_fd_cnt = 1; //1 ioctl call per rot session 1316f2cd42c336f41ca3184c0dc5942fec285a227b81Saurabh Shah } 1317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 1318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = ioctl(rotFd, MSMFB_BUFFER_SYNC, &rotData); 1319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ret < 0) { 1320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: ioctl MSMFB_BUFFER_SYNC failed for rot sync, err=%s", 1321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, strerror(errno)); 13228636d6ec09a6886169903d2f4de259fac8bfcdfdTatenda Chipeperekwa close(rotReleaseFd); 1323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 1324a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson close(currLayer->acquireFenceFd); 1325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For MDP to wait on. 1326a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson currLayer->acquireFenceFd = 1327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dup(rotReleaseFd); 1328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //A buffer is free to be used by producer as soon as its copied to 1329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //rotator 1330a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson currLayer->releaseFenceFd = 1331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotReleaseFd; 1332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1335a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Accumulate acquireFenceFds for MDP Overlays 1336a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->outbufAcquireFenceFd >= 0) { 1337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Writeback output buffer 1338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = list->outbufAcquireFenceFd; 1339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers; i++) { 1342bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh if(((isAbcInUse(ctx)== true ) || 1343bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh (list->hwLayers[i].compositionType == HWC_OVERLAY)) && 1344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].acquireFenceFd >= 0) { 1345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(UNLIKELY(swapzero)) 1346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = -1; 1347c5936f35d42001585865d95d6824de521630ff73Ramakant Singh // if ABC is enabled for more than one layer. 1348c5936f35d42001585865d95d6824de521630ff73Ramakant Singh // renderBufIndexforABC will work as FB.Hence 1349c5936f35d42001585865d95d6824de521630ff73Ramakant Singh // set the acquireFD from fd - which is coming from copybit 1350c5936f35d42001585865d95d6824de521630ff73Ramakant Singh else if(fd >= 0 && (isAbcInUse(ctx) == true)) { 1351c5936f35d42001585865d95d6824de521630ff73Ramakant Singh if(ctx->listStats[dpy].renderBufIndexforABC ==(int32_t)i) 1352c5936f35d42001585865d95d6824de521630ff73Ramakant Singh acquireFd[count++] = fd; 1353c5936f35d42001585865d95d6824de521630ff73Ramakant Singh else 1354c5936f35d42001585865d95d6824de521630ff73Ramakant Singh continue; 1355c5936f35d42001585865d95d6824de521630ff73Ramakant Singh } else 1356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = list->hwLayers[i].acquireFenceFd; 1357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1358ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) { 1359ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(UNLIKELY(swapzero)) 1360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = -1; 1361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson else if(fd >= 0) { 1362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //set the acquireFD from fd - which is coming from c2d 1363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = fd; 1364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Buffer sync IOCTL should be async when using c2d fence is 1365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // used 1366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.flags &= ~MDP_BUF_SYNC_FLAG_WAIT; 1367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else if(list->hwLayers[i].acquireFenceFd >= 0) 1368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = list->hwLayers[i].acquireFenceFd; 1369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1372392015f27bf5930ccb8b2c8955b28c2137b4c65bArun Kumar K.R if ((fd >= 0) && !dpy && ctx->mPtorInfo.isActive()) { 137380cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan // Acquire c2d fence of Overlap render buffer 137480cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan acquireFd[count++] = fd; 137580cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan } 137680cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan 1377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.acq_fen_fd_cnt = count; 1378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson fbFd = ctx->dpyAttr[dpy].fd; 1379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Waits for acquire fences, returns a release fence 1381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(LIKELY(!swapzero)) { 1382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = ioctl(fbFd, MSMFB_BUFFER_SYNC, &data); 1383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ret < 0) { 1386ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: ioctl MSMFB_BUFFER_SYNC failed, err=%s", 1387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, strerror(errno)); 13884217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu ALOGE("%s: acq_fen_fd_cnt=%d flags=%d fd=%d dpy=%d numHwLayers=%zu", 1389ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, data.acq_fen_fd_cnt, data.flags, fbFd, 1390ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dpy, list->numHwLayers); 13918636d6ec09a6886169903d2f4de259fac8bfcdfdTatenda Chipeperekwa close(releaseFd); 13928636d6ec09a6886169903d2f4de259fac8bfcdfdTatenda Chipeperekwa releaseFd = -1; 13938636d6ec09a6886169903d2f4de259fac8bfcdfdTatenda Chipeperekwa close(retireFd); 13948636d6ec09a6886169903d2f4de259fac8bfcdfdTatenda Chipeperekwa retireFd = -1; 1395ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1396ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1397ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers; i++) { 1398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].compositionType == HWC_OVERLAY || 1399db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah#ifdef QCOM_BSP 1400db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah list->hwLayers[i].compositionType == HWC_BLIT || 1401db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah#endif 1402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) { 1403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Populate releaseFenceFds. 1404ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(UNLIKELY(swapzero)) { 1405ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].releaseFenceFd = -1; 1406a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else if(isExtAnimating) { 1407a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Release all the app layer fds immediately, 1408a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if animation is in progress. 1409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson list->hwLayers[i].releaseFenceFd = -1; 1410201e4c9a80c1adb32ac8271a95721aa838c4d9feNaseer Ahmed } else if(list->hwLayers[i].releaseFenceFd < 0 ) { 1411db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah#ifdef QCOM_BSP 1412a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If rotator has not already populated this field 1413bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh // & if it's a not VPU layer 1414c5936f35d42001585865d95d6824de521630ff73Ramakant Singh 1415c5936f35d42001585865d95d6824de521630ff73Ramakant Singh // if ABC is enabled for more than one layer 1416c5936f35d42001585865d95d6824de521630ff73Ramakant Singh if(fd >= 0 && (isAbcInUse(ctx) == true) && 1417c5936f35d42001585865d95d6824de521630ff73Ramakant Singh ctx->listStats[dpy].renderBufIndexforABC !=(int32_t)i){ 1418c5936f35d42001585865d95d6824de521630ff73Ramakant Singh list->hwLayers[i].releaseFenceFd = dup(fd); 1419c5936f35d42001585865d95d6824de521630ff73Ramakant Singh } else if((list->hwLayers[i].compositionType == HWC_BLIT)&& 1420c5936f35d42001585865d95d6824de521630ff73Ramakant Singh (isAbcInUse(ctx) == false)){ 1421c5936f35d42001585865d95d6824de521630ff73Ramakant Singh //For Blit, the app layers should be released when the Blit 1422c5936f35d42001585865d95d6824de521630ff73Ramakant Singh //is complete. This fd was passed from copybit->draw 1423db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah list->hwLayers[i].releaseFenceFd = dup(fd); 1424db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah } else 1425db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah#endif 1426db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah { 1427db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah list->hwLayers[i].releaseFenceFd = dup(releaseFd); 1428db307bbb483b94b941ef8e66aa745fc13af906c3Saurabh Shah } 1429ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1430ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1431ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1432ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1433ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fd >= 0) { 1434ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fd); 1435ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson fd = -1; 1436ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 143880cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (!dpy && ctx->mCopyBit[dpy]) { 1439392015f27bf5930ccb8b2c8955b28c2137b4c65bArun Kumar K.R if (ctx->mPtorInfo.isActive()) 144080cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan ctx->mCopyBit[dpy]->setReleaseFdSync(releaseFd); 144180cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan else 144280cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan ctx->mCopyBit[dpy]->setReleaseFd(releaseFd); 144380cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan } 1444ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1445ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Signals when MDP finishes reading rotator buffers. 1446ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[dpy]->setReleaseFd(releaseFd); 1447ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(releaseFd); 1448a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson releaseFd = -1; 1449ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1450a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(UNLIKELY(swapzero)) { 1451ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->retireFenceFd = -1; 1452a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else { 1453ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->retireFenceFd = retireFd; 1454ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1455a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ret; 1456ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1457ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 14584a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnanvoid setMdpFlags(hwc_context_t *ctx, hwc_layer_1_t *layer, 1459ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eMdpFlags &mdpFlags, 1460a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int rotDownscale, int transform) { 1461ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1462a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MetaData_t *metadata = hnd ? (MetaData_t *)hnd->base_metadata : NULL; 1463ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1464ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(layer->blending == HWC_BLENDING_PREMULT) { 1465ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1466ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_BLEND_FG_PREMULT); 1467ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1468ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1469ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isYuvBuffer(hnd)) { 1470ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isSecureBuffer(hnd)) { 1471ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1472ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 1473ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1474ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(metadata && (metadata->operation & PP_PARAM_INTERLACED) && 1475201e4c9a80c1adb32ac8271a95721aa838c4d9feNaseer Ahmed metadata->interlaced) { 1476ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1477ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_DEINTERLACE); 1478ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1479ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1480ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1481a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isSecureDisplayBuffer(hnd)) { 1482a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Secure display needs both SECURE_OVERLAY and SECURE_DISPLAY_OV 1483a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1484a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 1485a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::OV_MDP_SECURE_DISPLAY_OVERLAY_SESSION); 1487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 14884a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan 14894a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan //Pre-rotation will be used using rotator. 14904a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if(has90Transform(layer) && isRotationDoable(ctx, hnd)) { 14914a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan ovutils::setMdpFlags(mdpFlags, 14924a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan ovutils::OV_MDP_SOURCE_ROTATED_90); 14934a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan } 1494ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //No 90 component and no rot-downscale then flips done by MDP 1495ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //If we use rot then it might as well do flips 1496a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!(transform & HWC_TRANSFORM_ROT_90) && !rotDownscale) { 1497a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(transform & HWC_TRANSFORM_FLIP_H) { 1498ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H); 1499ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1500ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1501a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(transform & HWC_TRANSFORM_FLIP_V) { 1502ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_V); 1503ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1504ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1505ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1506ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(metadata && 1507ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ((metadata->operation & PP_PARAM_HSIC) 1508ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson || (metadata->operation & PP_PARAM_IGC) 1509ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson || (metadata->operation & PP_PARAM_SHARP2))) { 1510ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_PP_EN); 1511ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1512ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1513ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1514a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configRotator(Rotator *rot, Whf& whf, 1515ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t& crop, const eMdpFlags& mdpFlags, 1516ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const eTransform& orient, const int& downscale) { 1517a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1518a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Fix alignments for TILED format 1519a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(whf.format == MDP_Y_CRCB_H2V2_TILE || 1520a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format == MDP_Y_CBCR_H2V2_TILE) { 1521a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.w = utils::alignup(whf.w, 64); 1522a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.h = utils::alignup(whf.h, 32); 1523a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1524ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setSource(whf); 1525ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1526ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (qdutils::MDPVersion::getInstance().getMDPVersion() >= 1527ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::MDSS_V5) { 1528c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah Dim rotCrop(crop.left, crop.top, crop.right - crop.left, 1529c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah crop.bottom - crop.top); 1530ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setCrop(rotCrop); 1531ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1532ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1533ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setFlags(mdpFlags); 1534ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setTransform(orient); 1535ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setDownscale(downscale); 1536ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!rot->commit()) return -1; 1537ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1538ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1539ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1540ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint configMdp(Overlay *ov, const PipeArgs& parg, 1541ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const eTransform& orient, const hwc_rect_t& crop, 1542ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const hwc_rect_t& pos, const MetaData_t *metadata, 1543ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const eDest& dest) { 1544ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setSource(parg, dest); 1545ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setTransform(orient, dest); 1546ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1547ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_w = crop.right - crop.left; 1548ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_h = crop.bottom - crop.top; 1549ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Dim dcrop(crop.left, crop.top, crop_w, crop_h); 1550ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setCrop(dcrop, dest); 1551ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1552ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int posW = pos.right - pos.left; 1553ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int posH = pos.bottom - pos.top; 1554ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Dim position(pos.left, pos.top, posW, posH); 1555ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setPosition(position, dest); 1556ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1557ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (metadata) 1558ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setVisualParams(*metadata, dest); 1559ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1560ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!ov->commit(dest)) { 1561ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1562ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1563ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1564ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1565ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1566a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, 1567a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlags, eZorder& z, 1568a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& dest) { 1569a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1570a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1571a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimLayer(ctx, dpy, 0, dst, dst); 1572a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1573a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int w = ctx->dpyAttr[dpy].xres; 1574a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int h = ctx->dpyAttr[dpy].yres; 1575a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_w = dst.right - dst.left; 1576a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_h = dst.bottom - dst.top; 1577a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t color = layer->transform; 1578a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(w, h, getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888), 0); 1579a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1580a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_SOLID_FILL); 1581a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->blending == HWC_BLENDING_PREMULT) 1582a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_BLEND_FG_PREMULT); 1583a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1584a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson PipeArgs parg(mdpFlags, whf, z, isFg, static_cast<eRotFlags>(0), 1585a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->planeAlpha, 1586a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1587a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1588a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Configure MDP pipe for Color layer 1589a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Dim pos(dst.left, dst.top, dst_w, dst_h); 1590a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setSource(parg, dest); 1591a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setColor(color, dest); 1592a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setTransform(0, dest); 1593a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setCrop(pos, dest); 1594a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setPosition(pos, dest); 1595a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1596a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (!ctx->mOverlay->commit(dest)) { 1597a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: Configure color layer failed!", __FUNCTION__); 1598a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1599a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1600a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return 0; 1601a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1602a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1603ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid updateSource(eTransform& orient, Whf& whf, 1604c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah hwc_rect_t& crop, Rotator *rot) { 1605c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah Dim transformedCrop(crop.left, crop.top, 1606ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right - crop.left, 1607ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom - crop.top); 1608ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (qdutils::MDPVersion::getInstance().getMDPVersion() >= 1609ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::MDSS_V5) { 1610c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //B-family rotator internally could modify destination dimensions if 1611c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //downscaling is supported 1612c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah whf = rot->getDstWhf(); 1613c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah transformedCrop = rot->getDstDimensions(); 1614ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 1615c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //A-family rotator rotates entire buffer irrespective of crop, forcing 1616c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah //us to recompute the crop based on transform 1617c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah orient = static_cast<eTransform>(ovutils::getMdpOrient(orient)); 1618c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah preRotateSource(orient, whf, transformedCrop); 1619ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1620c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah 1621c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah crop.left = transformedCrop.x; 1622c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah crop.top = transformedCrop.y; 1623c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah crop.right = transformedCrop.x + transformedCrop.w; 1624c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah crop.bottom = transformedCrop.y + transformedCrop.h; 1625ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1626ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1627a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 1628a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlags, eZorder& z, 1629a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& dest, Rotator **rot) { 1630ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1631ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1632a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1633ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!hnd) { 1634a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_COLOR_FILL) { 1635a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Configure Color layer 1636a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return configColorLayer(ctx, layer, dpy, mdpFlags, z, isFg, dest); 1637a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1638ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: layer handle is NULL", __FUNCTION__); 1639ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1640ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1641ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1642ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 1643ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1644ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 1645ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1646ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int transform = layer->transform; 1647ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson eTransform orient = static_cast<eTransform>(transform); 1648ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int downscale = 0; 1649ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotFlags = ovutils::ROT_FLAGS_NONE; 1650a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd)); 16514217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu Whf whf(getWidth(hnd), getHeight(hnd), format, (uint32_t)hnd->size); 1652ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1653a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Handle R/B swap 1654a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_FORMAT_RB_SWAP) { 1655a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888) 1656a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888); 1657a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888) 1658a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888); 1659ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1660ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1661a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson calcExtDisplayPosition(ctx, hnd, dpy, crop, dst, transform, orient); 1662a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1663ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isYuvBuffer(hnd) && ctx->mMDP.version >= qdutils::MDP_V4_2 && 1664ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.version < qdutils::MDSS_V5) { 1665ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson downscale = getDownscaleFactor( 1666ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right - crop.left, 1667ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom - crop.top, 1668ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst.right - dst.left, 1669ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst.bottom - dst.top); 1670ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(downscale) { 1671ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotFlags = ROT_DOWNSCALE_ENABLED; 1672ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1673ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1674ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 16754a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan setMdpFlags(ctx, layer, mdpFlags, downscale, transform); 1676ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 16774a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan //if 90 component or downscale, use rot 16784a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if((has90Transform(layer) && isRotationDoable(ctx, hnd)) || downscale) { 1679ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *rot = ctx->mRotMgr->getNext(); 1680ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(*rot == NULL) return -1; 1681ebf925e696ac4debee9ed652aea5ba2a21dfa136Saurabh Shah ctx->mLayerRotMap[dpy]->add(layer, *rot); 16824a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan // BWC is not tested for other formats So enable it only for YUV format 16834a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if(!dpy && isYuvBuffer(hnd)) 1684a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson BwcPM::setBwc(crop, dst, transform, mdpFlags); 1685ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Configure rotator for pre-rotation 1686ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) { 1687ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: configRotator failed!", __FUNCTION__); 1688ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1689ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1690c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah updateSource(orient, whf, crop, *rot); 1691ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotFlags |= ovutils::ROT_PREROTATED; 1692ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1693ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1694ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 1695ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson orient = OVERLAY_TRANSFORM_0; 1696ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson transform = 0; 1697ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson PipeArgs parg(mdpFlags, whf, z, isFg, 1698ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 1699ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1700ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1701ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configMdp(ctx->mOverlay, parg, orient, crop, dst, metadata, dest) < 0) { 1702ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: commit failed for low res panel", __FUNCTION__); 1703ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1704ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1705ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1706ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1707ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1708a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//Helper to 1) Ensure crops dont have gaps 2) Ensure L and W are even 1709a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR, 1710a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd) { 1711a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(cropL.right - cropL.left) { 1712a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isYuvBuffer(hnd)) { 1713a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Always safe to even down left 1714a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropL.left); 1715a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If right is even, automatically width is even, since left is 1716a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //already even 1717a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropL.right); 1718a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1719a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Make sure there are no gaps between left and right splits if the layer 1720a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //is spread across BOTH halves 1721a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(cropR.right - cropR.left) { 1722a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson cropR.left = cropL.right; 1723a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1724a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1725a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1726a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(cropR.right - cropR.left) { 1727a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isYuvBuffer(hnd)) { 1728a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Always safe to even down left 1729a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropR.left); 1730a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If right is even, automatically width is even, since left is 1731a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //already even 1732a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropR.right); 1733a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1734a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1735a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1736a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1737a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 1738a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlagsL, eZorder& z, 1739a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& lDest, const eDest& rDest, 1740ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Rotator **rot) { 1741ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1742ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!hnd) { 1743ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: layer handle is NULL", __FUNCTION__); 1744ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1745ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1746ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1747ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 1748ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1749ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int hw_w = ctx->dpyAttr[dpy].xres; 1750ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int hw_h = ctx->dpyAttr[dpy].yres; 1751ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 1752ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1753ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int transform = layer->transform; 1754ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson eTransform orient = static_cast<eTransform>(transform); 1755ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int downscale = 0; 1756ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotFlags = ROT_FLAGS_NONE; 1757a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd)); 17584217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu Whf whf(getWidth(hnd), getHeight(hnd), format, (uint32_t)hnd->size); 1759ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1760a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Handle R/B swap 1761a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_FORMAT_RB_SWAP) { 1762a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888) 1763a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888); 1764a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888) 1765a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888); 1766a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1767a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 176809b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan /* Calculate the external display position based on MDP downscale, 176909b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan ActionSafe, and extorientation features. */ 177009b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan calcExtDisplayPosition(ctx, hnd, dpy, crop, dst, transform, orient); 177109b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan 17724a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan setMdpFlags(ctx, layer, mdpFlagsL, 0, transform); 1773a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1774a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(lDest != OV_INVALID && rDest != OV_INVALID) { 1775a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Enable overfetch 1776a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson setMdpFlags(mdpFlagsL, OV_MDSS_MDP_DUAL_PIPE); 1777a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1778ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1779ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Will do something only if feature enabled and conditions suitable 1780ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //hollow call otherwise 1781ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mAD->prepare(ctx, crop, whf, hnd)) { 1782ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Writeback *wb = overlay::Writeback::getInstance(); 1783ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson whf.format = wb->getOutputFormat(); 1784ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1785ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 17864a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if(has90Transform(layer) && isRotationDoable(ctx, hnd)) { 1787ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (*rot) = ctx->mRotMgr->getNext(); 1788ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((*rot) == NULL) return -1; 1789ebf925e696ac4debee9ed652aea5ba2a21dfa136Saurabh Shah ctx->mLayerRotMap[dpy]->add(layer, *rot); 1790ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Configure rotator for pre-rotation 1791ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { 1792ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: configRotator failed!", __FUNCTION__); 1793ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1794ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1795c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah updateSource(orient, whf, crop, *rot); 1796ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotFlags |= ROT_PREROTATED; 1797ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1798ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1799ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson eMdpFlags mdpFlagsR = mdpFlagsL; 1800ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson setMdpFlags(mdpFlagsR, OV_MDSS_MDP_RIGHT_MIXER); 1801ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1802a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropL = {0}, tmp_dstL = {0}; 1803a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropR = {0}, tmp_dstR = {0}; 1804ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1805ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int lSplit = getLeftSplit(ctx, dpy); 1806ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 18071cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran // Calculate Left rects 18081cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran if(dst.left < lSplit) { 1809ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL = crop; 1810ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstL = dst; 1811ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t scissor = {0, 0, lSplit, hw_h }; 1812a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissor = getIntersection(ctx->mViewFrame[dpy], scissor); 1813ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qhwc::calculate_crop_rects(tmp_cropL, tmp_dstL, scissor, 0); 1814ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 18151cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran 18161cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran // Calculate Right rects 18171cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran if(dst.right > lSplit) { 1818ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR = crop; 1819ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstR = dst; 1820ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t scissor = {lSplit, 0, hw_w, hw_h }; 1821a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissor = getIntersection(ctx->mViewFrame[dpy], scissor); 1822ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qhwc::calculate_crop_rects(tmp_cropR, tmp_dstR, scissor, 0); 1823ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1824ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1825a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sanitizeSourceCrop(tmp_cropL, tmp_cropR, hnd); 1826a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1827ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //When buffer is H-flipped, contents of mixer config also needs to swapped 1828ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Not needed if the layer is confined to one half of the screen. 1829ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //If rotator has been used then it has also done the flips, so ignore them. 18301cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran if((orient & OVERLAY_TRANSFORM_FLIP_H) && (dst.left < lSplit) && 18311cf3c09dd3d06292982002565a80d09138a358a8Jeykumar Sankaran (dst.right > lSplit) && (*rot) == NULL) { 1832ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t new_cropR; 1833ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropR.left = tmp_cropL.left; 1834ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropR.right = new_cropR.left + (tmp_cropR.right - tmp_cropR.left); 1835ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1836ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t new_cropL; 1837ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropL.left = new_cropR.right; 1838ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropL.right = tmp_cropR.right; 1839ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1840ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL.left = new_cropL.left; 1841ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL.right = new_cropL.right; 1842ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1843ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR.left = new_cropR.left; 1844ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR.right = new_cropR.right; 1845ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1846ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1847ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1848ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 1849ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson orient = OVERLAY_TRANSFORM_0; 1850ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson transform = 0; 1851ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1852ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //configure left mixer 1853ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(lDest != OV_INVALID) { 1854ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson PipeArgs pargL(mdpFlagsL, whf, z, isFg, 1855ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 1856ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1857ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1858ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configMdp(ctx->mOverlay, pargL, orient, 1859ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL, tmp_dstL, metadata, lDest) < 0) { 1860ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: commit failed for left mixer config", __FUNCTION__); 1861ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1862ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1863ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1864ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1865ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //configure right mixer 1866ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(rDest != OV_INVALID) { 1867ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson PipeArgs pargR(mdpFlagsR, whf, z, isFg, 1868a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<eRotFlags>(rotFlags), 1869a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->planeAlpha, 1870a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1871ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstR.right = tmp_dstR.right - lSplit; 1872ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstR.left = tmp_dstR.left - lSplit; 1873ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configMdp(ctx->mOverlay, pargR, orient, 1874ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR, tmp_dstR, metadata, rDest) < 0) { 1875ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: commit failed for right mixer config", __FUNCTION__); 1876ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1877ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1878ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1879ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1880ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1881ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1882ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1883a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configureSourceSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 1884a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlagsL, eZorder& z, 1885a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& lDest, const eDest& rDest, 1886a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Rotator **rot) { 1887a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1888a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!hnd) { 1889a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: layer handle is NULL", __FUNCTION__); 1890a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1891a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1892a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1893a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 1894a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1895a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);; 1896a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1897a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int transform = layer->transform; 1898a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eTransform orient = static_cast<eTransform>(transform); 1899a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int downscale = 0; 1900a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int rotFlags = ROT_FLAGS_NONE; 1901a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Splitting only YUV layer on primary panel needs different zorders 1902a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //for both layers as both the layers are configured to single mixer 1903a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eZorder lz = z; 1904a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eZorder rz = (eZorder)(z + 1); 1905a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1906a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(getWidth(hnd), getHeight(hnd), 19074217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu getMdpFormat(hnd->format), (uint32_t)hnd->size); 1908a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1909a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* Calculate the external display position based on MDP downscale, 1910a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ActionSafe, and extorientation features. */ 1911a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson calcExtDisplayPosition(ctx, hnd, dpy, crop, dst, transform, orient); 1912a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 19134a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan setMdpFlags(ctx, layer, mdpFlagsL, 0, transform); 1914a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimLayer(ctx, dpy, transform, crop, dst); 1915a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 19164a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if(has90Transform(layer) && isRotationDoable(ctx, hnd)) { 1917a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (*rot) = ctx->mRotMgr->getNext(); 1918a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((*rot) == NULL) return -1; 1919ebf925e696ac4debee9ed652aea5ba2a21dfa136Saurabh Shah ctx->mLayerRotMap[dpy]->add(layer, *rot); 19204a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan // BWC is not tested for other formats So enable it only for YUV format 19214a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan if(!dpy && isYuvBuffer(hnd)) 1922a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson BwcPM::setBwc(crop, dst, transform, mdpFlagsL); 1923a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Configure rotator for pre-rotation 1924a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { 1925a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: configRotator failed!", __FUNCTION__); 1926a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1927a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1928c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah updateSource(orient, whf, crop, *rot); 1929a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rotFlags |= ROT_PREROTATED; 1930a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1931a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1932a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eMdpFlags mdpFlagsR = mdpFlagsL; 1933a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int lSplit = dst.left + (dst.right - dst.left)/2; 1934a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1935a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropL = {0}, tmp_dstL = {0}; 1936a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropR = {0}, tmp_dstR = {0}; 1937a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1938a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(lDest != OV_INVALID) { 1939a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL = crop; 1940a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_dstL = dst; 1941a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissor = {dst.left, dst.top, lSplit, dst.bottom }; 1942a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(tmp_cropL, tmp_dstL, scissor, 0); 1943a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1944a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(rDest != OV_INVALID) { 1945a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR = crop; 1946a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_dstR = dst; 1947a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissor = {lSplit, dst.top, dst.right, dst.bottom }; 1948a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(tmp_cropR, tmp_dstR, scissor, 0); 1949a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1950a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1951a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sanitizeSourceCrop(tmp_cropL, tmp_cropR, hnd); 1952a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1953a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //When buffer is H-flipped, contents of mixer config also needs to swapped 1954a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Not needed if the layer is confined to one half of the screen. 1955a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If rotator has been used then it has also done the flips, so ignore them. 1956a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((orient & OVERLAY_TRANSFORM_FLIP_H) && lDest != OV_INVALID 1957a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson && rDest != OV_INVALID && (*rot) == NULL) { 1958a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t new_cropR; 1959a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropR.left = tmp_cropL.left; 1960a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropR.right = new_cropR.left + (tmp_cropR.right - tmp_cropR.left); 1961a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1962a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t new_cropL; 1963a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropL.left = new_cropR.right; 1964a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropL.right = tmp_cropR.right; 1965a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1966a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL.left = new_cropL.left; 1967a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL.right = new_cropL.right; 1968a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1969a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR.left = new_cropR.left; 1970a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR.right = new_cropR.right; 1971a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1972a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1973a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1974a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 1975a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson orient = OVERLAY_TRANSFORM_0; 1976a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson transform = 0; 1977a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1978a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //configure left half 1979a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(lDest != OV_INVALID) { 1980a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson PipeArgs pargL(mdpFlagsL, whf, lz, isFg, 1981a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 1982a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1983a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1984a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configMdp(ctx->mOverlay, pargL, orient, 1985a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL, tmp_dstL, metadata, lDest) < 0) { 1986a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: commit failed for left half config", __FUNCTION__); 1987a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1988a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1989a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1990a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1991a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //configure right half 1992a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(rDest != OV_INVALID) { 1993a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson PipeArgs pargR(mdpFlagsR, whf, rz, isFg, 1994a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<eRotFlags>(rotFlags), 1995a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->planeAlpha, 1996a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1997a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configMdp(ctx->mOverlay, pargR, orient, 1998a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR, tmp_dstR, metadata, rDest) < 0) { 1999a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: commit failed for right half config", __FUNCTION__); 2000a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 2001a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 2002a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 2003a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2004a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return 0; 2005a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 2006a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2007ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool canUseRotator(hwc_context_t *ctx, int dpy) { 20084418482cd51e8343e7efd978ccdd17c616d1d78aRaj Kamal if(ctx->mOverlay->isDMAMultiplexingSupported() && 2009a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson isSecondaryConnected(ctx) && 2010a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause) { 20114418482cd51e8343e7efd978ccdd17c616d1d78aRaj Kamal /* mdss driver on certain targets support multiplexing of DMA pipe 2012a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * in LINE and BLOCK modes for writeback panels. 2013a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 2014a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY) 2015a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 2016ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2017ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDP.version == qdutils::MDP_V3_0_4) 2018ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 2019ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 2020ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2021ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2022ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getLeftSplit(hwc_context_t *ctx, const int& dpy) { 2023ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Default even split for all displays with high res 2024ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int lSplit = ctx->dpyAttr[dpy].xres / 2; 2025ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY && 2026ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::MDPVersion::getInstance().getLeftSplit()) { 2027ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Override if split published by driver for primary 2028ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson lSplit = qdutils::MDPVersion::getInstance().getLeftSplit(); 2029ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2030ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return lSplit; 2031ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2032ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2033a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isDisplaySplit(hwc_context_t* ctx, int dpy) { 2034a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].xres > qdutils::MAX_DISPLAY_DIM) { 2035a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 2036ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2037a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //For testing we could split primary via device tree values 2038a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY && 2039a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qdutils::MDPVersion::getInstance().getRightSplit()) { 2040a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 2041ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2042a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 2043a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 2044a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2045a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//clear prev layer prop flags and realloc for current frame 2046a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 2047a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->layerProp[dpy]) { 2048a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete[] ctx->layerProp[dpy]; 2049a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->layerProp[dpy] = NULL; 2050ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2051a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 2052ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2053ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2054bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singhbool isAbcInUse(hwc_context_t *ctx){ 2055bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh return (ctx->enableABC && ctx->listStats[0].renderBufIndexforABC == 0); 2056bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh} 2057bd51df0d51c9342f705caeea9c245b919dedb120Ramakant Singh 205863cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwavoid dumpBuffer(private_handle_t *ohnd, char *bufferName) { 205963cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa if (ohnd != NULL && ohnd->base) { 206063cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa char dumpFilename[PATH_MAX]; 206163cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa bool bResult = false; 206263cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa snprintf(dumpFilename, sizeof(dumpFilename), "/data/%s.%s.%dx%d.raw", 206363cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa bufferName, 206463cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa overlay::utils::getFormatString(utils::getMdpFormat(ohnd->format)), 206563cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa getWidth(ohnd), getHeight(ohnd)); 206663cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa FILE* fp = fopen(dumpFilename, "w+"); 206763cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa if (NULL != fp) { 206863cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa bResult = (bool) fwrite((void*)ohnd->base, ohnd->size, 1, fp); 206963cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa fclose(fp); 207063cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa } 207163cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa ALOGD("Buffer[%s] Dump to %s: %s", 207263cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa bufferName, dumpFilename, bResult ? "Success" : "Fail"); 207363cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa } 207463cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa} 207563cdccf247d3d0ac16f19f8f7bd1e3da5d7267d1Tatenda Chipeperekwa 20761b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnanbool isGLESComp(hwc_context_t *ctx, 20771b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan hwc_display_contents_1_t* list) { 20781b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan int numAppLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers; 20791b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan for(int index = 0; index < numAppLayers; index++) { 20801b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan hwc_layer_1_t* layer = &(list->hwLayers[index]); 20811b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if(layer->compositionType == HWC_FRAMEBUFFER) 20821b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan return true; 20831b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 20841b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan return false; 20851b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan} 20861b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 20871b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnanvoid setGPUHint(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 20881b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan struct gpu_hint_info *gpuHint = &ctx->mGPUHintInfo; 20893a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah if(!gpuHint->mGpuPerfModeEnable || !ctx || !list) 20901b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan return; 20913a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah 20923a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah#ifdef QCOM_BSP 20931b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan /* Set the GPU hint flag to high for MIXED/GPU composition only for 20941b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan first frame after MDP -> GPU/MIXED mode transition. Set the GPU 20951b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan hint to default if the previous composition is GPU or current GPU 20961b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan composition is due to idle fallback */ 20971b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if(!gpuHint->mEGLDisplay || !gpuHint->mEGLContext) { 20981b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mEGLDisplay = eglGetCurrentDisplay(); 20991b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if(!gpuHint->mEGLDisplay) { 21001b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ALOGW("%s Warning: EGL current display is NULL", __FUNCTION__); 21011b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan return; 21021b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21031b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mEGLContext = eglGetCurrentContext(); 21041b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if(!gpuHint->mEGLContext) { 21051b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ALOGW("%s Warning: EGL current context is NULL", __FUNCTION__); 21061b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan return; 21071b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21081b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21091b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if(isGLESComp(ctx, list)) { 21103b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan if(gpuHint->mCompositionState != COMPOSITION_STATE_GPU 21113b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan && !MDPComp::isIdleFallback()) { 21121b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGLint attr_list[] = {EGL_GPU_HINT_1, 21131b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGL_GPU_LEVEL_3, 21141b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGL_NONE }; 21151b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if((gpuHint->mCurrGPUPerfMode != EGL_GPU_LEVEL_3) && 21161b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan !eglGpuPerfHintQCOM(gpuHint->mEGLDisplay, 21171b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mEGLContext, attr_list)) { 21181b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ALOGW("eglGpuPerfHintQCOM failed for Built in display"); 21191b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } else { 21201b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mCurrGPUPerfMode = EGL_GPU_LEVEL_3; 21213b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan gpuHint->mCompositionState = COMPOSITION_STATE_GPU; 21221b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21231b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } else { 21241b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGLint attr_list[] = {EGL_GPU_HINT_1, 21251b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGL_GPU_LEVEL_0, 21261b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGL_NONE }; 21271b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if((gpuHint->mCurrGPUPerfMode != EGL_GPU_LEVEL_0) && 21281b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan !eglGpuPerfHintQCOM(gpuHint->mEGLDisplay, 21291b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mEGLContext, attr_list)) { 21301b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ALOGW("eglGpuPerfHintQCOM failed for Built in display"); 21311b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } else { 21321b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mCurrGPUPerfMode = EGL_GPU_LEVEL_0; 21331b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21343b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan if(MDPComp::isIdleFallback()) { 21353b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan gpuHint->mCompositionState = COMPOSITION_STATE_IDLE_FALLBACK; 21363b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan } 21371b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21381b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } else { 21391b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan /* set the GPU hint flag to default for MDP composition */ 21401b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGLint attr_list[] = {EGL_GPU_HINT_1, 21411b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGL_GPU_LEVEL_0, 21421b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan EGL_NONE }; 21431b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan if((gpuHint->mCurrGPUPerfMode != EGL_GPU_LEVEL_0) && 21441b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan !eglGpuPerfHintQCOM(gpuHint->mEGLDisplay, 21451b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mEGLContext, attr_list)) { 21461b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan ALOGW("eglGpuPerfHintQCOM failed for Built in display"); 21471b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } else { 21481b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan gpuHint->mCurrGPUPerfMode = EGL_GPU_LEVEL_0; 21491b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21503b66cc8c40ba690452f2ea5f648b408d0164c423Ramkumar Radhakrishnan gpuHint->mCompositionState = COMPOSITION_STATE_MDP; 21511b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan } 21523a21e54387a2b98a15611231e90600aa048a4dddSaurabh Shah#endif 21531b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan} 21541b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan 215580cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhanbool isPeripheral(const hwc_rect_t& rect1, const hwc_rect_t& rect2) { 215680cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan // To be peripheral, 3 boundaries should match. 215780cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan uint8_t eqBounds = 0; 215880cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (rect1.left == rect2.left) 215980cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan eqBounds++; 216080cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (rect1.top == rect2.top) 216180cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan eqBounds++; 216280cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (rect1.right == rect2.right) 216380cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan eqBounds++; 216480cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan if (rect1.bottom == rect2.bottom) 216580cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan eqBounds++; 216680cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan return (eqBounds == 3); 216780cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan} 216880cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan 2169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid BwcPM::setBwc(const hwc_rect_t& crop, 2170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const hwc_rect_t& dst, const int& transform, 2171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eMdpFlags& mdpFlags) { 2172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Target doesnt support Bwc 2173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!qdutils::MDPVersion::getInstance().supportsBWC()) { 2174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 2175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 217674e109a6891def0f55250476bc28aa2098027606Saurabh Shah int src_w = crop.right - crop.left; 217774e109a6891def0f55250476bc28aa2098027606Saurabh Shah int src_h = crop.bottom - crop.top; 217874e109a6891def0f55250476bc28aa2098027606Saurabh Shah int dst_w = dst.right - dst.left; 217974e109a6891def0f55250476bc28aa2098027606Saurabh Shah int dst_h = dst.bottom - dst.top; 218074e109a6891def0f55250476bc28aa2098027606Saurabh Shah if(transform & HAL_TRANSFORM_ROT_90) { 218174e109a6891def0f55250476bc28aa2098027606Saurabh Shah swap(src_w, src_h); 218274e109a6891def0f55250476bc28aa2098027606Saurabh Shah } 2183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //src width > MAX mixer supported dim 218474e109a6891def0f55250476bc28aa2098027606Saurabh Shah if(src_w > qdutils::MAX_DISPLAY_DIM) { 2185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 2186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Decimation necessary, cannot use BWC. H/W requirement. 2188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(qdutils::MDPVersion::getInstance().supportsDecimation()) { 218974e109a6891def0f55250476bc28aa2098027606Saurabh Shah uint8_t horzDeci = 0; 219074e109a6891def0f55250476bc28aa2098027606Saurabh Shah uint8_t vertDeci = 0; 219174e109a6891def0f55250476bc28aa2098027606Saurabh Shah ovutils::getDecimationFactor(src_w, src_h, dst_w, dst_h, horzDeci, 219274e109a6891def0f55250476bc28aa2098027606Saurabh Shah vertDeci); 2193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(horzDeci || vertDeci) return; 2194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Property 2196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char value[PROPERTY_VALUE_MAX]; 2197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson property_get("debug.disable.bwc", value, "0"); 2198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(atoi(value)) return; 2199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDSS_MDP_BWC_EN); 2201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid LayerRotMap::add(hwc_layer_1_t* layer, Rotator *rot) { 2204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(mCount >= MAX_SESS) return; 2205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mLayer[mCount] = layer; 2206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRot[mCount] = rot; 2207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mCount++; 2208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid LayerRotMap::reset() { 2211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (int i = 0; i < MAX_SESS; i++) { 2212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mLayer[i] = 0; 2213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRot[i] = 0; 2214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mCount = 0; 2216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2218a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid LayerRotMap::clear() { 2219a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson RotMgr::getInstance()->markUnusedTop(mCount); 2220a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson reset(); 2221a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 2222a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid LayerRotMap::setReleaseFd(const int& fence) { 2224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < mCount; i++) { 2225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRot[i]->setReleaseFd(dup(fence)); 2226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 22296f7634666209698e4835b9f326278a7068834383Jeykumar Sankaranvoid resetROI(hwc_context_t *ctx, const int dpy) { 22306f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran const int fbXRes = (int)ctx->dpyAttr[dpy].xres; 22316f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran const int fbYRes = (int)ctx->dpyAttr[dpy].yres; 22326f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if(isDisplaySplit(ctx, dpy)) { 22336f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran const int lSplit = getLeftSplit(ctx, dpy); 22346f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].lRoi = (struct hwc_rect){0, 0, lSplit, fbYRes}; 22356f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].rRoi = (struct hwc_rect){lSplit, 0, fbXRes, fbYRes}; 22366f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran } else { 22376f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].lRoi = (struct hwc_rect){0, 0,fbXRes, fbYRes}; 22386f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran ctx->listStats[dpy].rRoi = (struct hwc_rect){0, 0, 0, 0}; 22396f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran } 22406f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran} 22416f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 22426f7634666209698e4835b9f326278a7068834383Jeykumar Sankaranhwc_rect_t getSanitizeROI(struct hwc_rect roi, hwc_rect boundary) 2243c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran{ 2244c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if(!isValidRect(roi)) 2245c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran return roi; 2246c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2247c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran struct hwc_rect t_roi = roi; 2248c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2249c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran const int LEFT_ALIGN = qdutils::MDPVersion::getInstance().getLeftAlign(); 2250c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran const int WIDTH_ALIGN = qdutils::MDPVersion::getInstance().getWidthAlign(); 2251c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran const int TOP_ALIGN = qdutils::MDPVersion::getInstance().getTopAlign(); 2252c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran const int HEIGHT_ALIGN = qdutils::MDPVersion::getInstance().getHeightAlign(); 2253c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran const int MIN_WIDTH = qdutils::MDPVersion::getInstance().getMinROIWidth(); 22546f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran const int MIN_HEIGHT = qdutils::MDPVersion::getInstance().getMinROIHeight(); 2255c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2256c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran /* Align to minimum width recommended by the panel */ 2257c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if((t_roi.right - t_roi.left) < MIN_WIDTH) { 2258c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if((t_roi.left + MIN_WIDTH) > boundary.right) 2259c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.left = t_roi.right - MIN_WIDTH; 2260c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran else 2261c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.right = t_roi.left + MIN_WIDTH; 2262c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran } 2263c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 22646f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran /* Align to minimum height recommended by the panel */ 22656f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if((t_roi.bottom - t_roi.top) < MIN_HEIGHT) { 22666f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if((t_roi.top + MIN_HEIGHT) > boundary.bottom) 22676f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran t_roi.top = t_roi.bottom - MIN_HEIGHT; 22686f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran else 22696f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran t_roi.bottom = t_roi.top + MIN_HEIGHT; 22706f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran } 22716f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 2272c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran /* Align left and width to meet panel restrictions */ 22736f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if(LEFT_ALIGN) 22746f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran t_roi.left = t_roi.left - (t_roi.left % LEFT_ALIGN); 22756f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 2276c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if(WIDTH_ALIGN) { 2277c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran int width = t_roi.right - t_roi.left; 2278c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran width = WIDTH_ALIGN * ((width + (WIDTH_ALIGN - 1)) / WIDTH_ALIGN); 2279c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.right = t_roi.left + width; 2280c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2281c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if(t_roi.right > boundary.right) { 2282c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.right = boundary.right; 2283c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.left = t_roi.right - width; 22846f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 22856f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if(LEFT_ALIGN) 22866f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran t_roi.left = t_roi.left - (t_roi.left % LEFT_ALIGN); 2287c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran } 2288c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran } 2289c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2290c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2291c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran /* Align top and height to meet panel restrictions */ 22926f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if(TOP_ALIGN) 22936f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran t_roi.top = t_roi.top - (t_roi.top % TOP_ALIGN); 22946f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 2295c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if(HEIGHT_ALIGN) { 2296c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran int height = t_roi.bottom - t_roi.top; 2297c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran height = HEIGHT_ALIGN * ((height + (HEIGHT_ALIGN - 1)) / HEIGHT_ALIGN); 2298c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.bottom = t_roi.top + height; 2299c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2300c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran if(t_roi.bottom > boundary.bottom) { 2301c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.bottom = boundary.bottom; 2302c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran t_roi.top = t_roi.bottom - height; 23036f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran 23046f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran if(TOP_ALIGN) 23056f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran t_roi.top = t_roi.top - (t_roi.top % TOP_ALIGN); 2306c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran } 2307c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran } 2308c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2309c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2310c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran return t_roi; 2311c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran} 2312c5ee4bd551fd15825770154947920733949f8811Jeykumar Sankaran 2313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};//namespace qhwc 2314