hwc_utils.cpp revision 6a9d12360acf2c27c5ca4b4b58ae45c56284b29f
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" 40a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_vpuclient.h" 41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "external.h" 42a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "virtual.h" 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_qclient.h" 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "QService.h" 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "comptype.h" 46a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "hwc_virtual.h" 471b9f24cfc5be6361faeb28976d720cf65a7f8285Tatenda Chipeperekwa#include "qd_utils.h" 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qClient; 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qService; 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace android; 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay; 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay::utils; 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace ovutils = overlay::utils; 55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qhwc { 57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 58a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isValidResolution(hwc_context_t *ctx, uint32_t xres, uint32_t yres) 59a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 60a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return !((xres > qdutils::MAX_DISPLAY_DIM && 61a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !isDisplaySplit(ctx, HWC_DISPLAY_PRIMARY)) || 62a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (xres < MIN_DISPLAY_XRES || yres < MIN_DISPLAY_YRES)); 63a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 64a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 65a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid changeResolution(hwc_context_t *ctx, int xres_orig, int yres_orig) { 66a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Store original display resolution. 67a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres_orig = xres_orig; 68a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres_orig = yres_orig; 69a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].customFBSize = false; 70a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 71a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char property[PROPERTY_VALUE_MAX] = {'\0'}; 72a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char *yptr = NULL; 73a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (property_get("debug.hwc.fbsize", property, NULL) > 0) { 74a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yptr = strcasestr(property,"x"); 75a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int xres = atoi(property); 76a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int yres = atoi(yptr + 1); 77a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (isValidResolution(ctx,xres,yres) && 78a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xres != xres_orig && yres != yres_orig) { 79a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = xres; 80a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = yres; 81a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].customFBSize = true; 82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 83a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 84a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 85a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int openFramebufferDevice(hwc_context_t *ctx) 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct fb_fix_screeninfo finfo; 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct fb_var_screeninfo info; 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fb_fd = openFb(HWC_DISPLAY_PRIMARY); 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fb_fd < 0) { 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Error Opening FB : %s", __FUNCTION__, strerror(errno)); 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &info) == -1) { 98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s:Error in ioctl FBIOGET_VSCREENINFO: %s", __FUNCTION__, 99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strerror(errno)); 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fb_fd); 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (int(info.width) <= 0 || int(info.height) <= 0) { 105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // the driver doesn't return that information 106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // default to 160 dpi 107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson info.width = ((info.xres * 25.4f)/160.0f + 0.5f); 108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson info.height = ((info.yres * 25.4f)/160.0f + 0.5f); 109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float xdpi = (info.xres * 25.4f) / info.width; 112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float ydpi = (info.yres * 25.4f) / info.height; 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef MSMFB_METADATA_GET 115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct msmfb_metadata metadata; 116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&metadata, 0 , sizeof(metadata)); 117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson metadata.op = metadata_op_frame_rate; 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) { 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s:Error retrieving panel frame rate: %s", __FUNCTION__, 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strerror(errno)); 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fb_fd); 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float fps = metadata.data.panel_frame_rate; 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#else 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //XXX: Remove reserved field usage on all baselines 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //The reserved[3] field is used to store FPS by the driver. 130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float fps = info.reserved[3] & 0xFF; 131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif 132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) == -1) { 134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s:Error in ioctl FBIOGET_FSCREENINFO: %s", __FUNCTION__, 135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson strerror(errno)); 136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fb_fd); 137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = fb_fd; 141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //xres, yres may not be 32 aligned 142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride = finfo.line_length /(info.xres/8); 143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres = info.xres; 144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres = info.yres; 145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xdpi = xdpi; 146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].ydpi = ydpi; 147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period = 1000000000l / fps; 148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //To change resolution of primary display 150a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson changeResolution(ctx, info.xres, info.yres); 151a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Unblank primary on first boot 153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ioctl(fb_fd, FBIOBLANK,FB_BLANK_UNBLANK) < 0) { 154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Failed to unblank display", __FUNCTION__); 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive = true; 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid initContext(hwc_context_t *ctx) 163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson openFramebufferDevice(ctx); 165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.version = qdutils::MDPVersion::getInstance().getMDPVersion(); 166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.hasOverlay = qdutils::MDPVersion::getInstance().hasOverlay(); 167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.panel = qdutils::MDPVersion::getInstance().getPanelType(); 168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Overlay::initOverlay(); 169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay = overlay::Overlay::getInstance(); 170a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mRotMgr = RotMgr::getInstance(); 171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Is created and destroyed only once for primary 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For external it could get created and destroyed multiple times depending 174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //on what external we connect to. 175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mFBUpdate[HWC_DISPLAY_PRIMARY] = 176a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson IFBUpdate::getObject(ctx, HWC_DISPLAY_PRIMARY); 177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 178a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Check if the target supports copybit compostion (dyn/mdp) to 179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // decide if we need to open the copybit module. 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int compositionType = 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::QCCompositionType::getInstance().getCompositionType(); 182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 183a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Only MDP copybit is used 184a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if ((compositionType & (qdutils::COMPOSITION_TYPE_DYN | 185a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qdutils::COMPOSITION_TYPE_MDP)) && 186a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (qdutils::MDPVersion::getInstance().getMDPVersion() == 187a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qdutils::MDP_V3_0_4)) { 188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mCopyBit[HWC_DISPLAY_PRIMARY] = new CopyBit(ctx, 189a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson HWC_DISPLAY_PRIMARY); 190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mExtDisplay = new ExternalDisplay(ctx); 193a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualDisplay = new VirtualDisplay(ctx); 194a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualonExtActive = false; 195a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive = false; 196a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected = false; 197a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = false; 198a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected = false; 199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].mDownScaleMode= false; 200a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].mDownScaleMode = false; 201a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].mDownScaleMode = false; 202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 203a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mMDPComp[HWC_DISPLAY_PRIMARY] = 204a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MDPComp::getObject(ctx, HWC_DISPLAY_PRIMARY); 205a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].connected = true; 206a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHWCVirtual = HWCVirtualBase::getObject(); 207a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 208a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for (uint32_t i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 209a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHwcDebug[i] = new HwcDebug(i); 210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[i] = new LayerRotMap(); 211a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mAnimationState[i] = ANIMATION_STOPPED; 212a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[i].mActionSafePresent = false; 213a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[i].mAsWidthRatio = 0; 214a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[i].mAsHeightRatio = 0; 215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 217a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for (uint32_t i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 218a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mPrevHwLayerCount[i] = 0; 219a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MDPComp::init(ctx); 222a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mAD = new AssertiveDisplay(ctx); 223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->vstate.enable = false; 225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->vstate.fakevsync = false; 226a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtOrientation = 0; 227a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->numActiveDisplays = 1; 228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Right now hwc starts the service but anybody could do it, or it could be 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //independent process as well. 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson QService::init(); 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson sp<IQClient> client = new QClient(ctx); 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson interface_cast<IQService>( 234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson defaultServiceManager()->getService( 235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson String16("display.qservice")))->connect(client); 236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 237a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Initialize device orientation to its default orientation 238a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->deviceOrientation = 0; 239a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mBufferMirrorMode = false; 240a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVPUClient = NULL; 241a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 24257ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa // Read the system property to determine if downscale feature is enabled. 24357ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa ctx->mMDPDownscaleEnabled = false; 24457ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa char value[PROPERTY_VALUE_MAX]; 24557ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa if(property_get("sys.hwc.mdp_downscale_enabled", value, "false") 24657ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa && !strcmp(value, "true")) { 24757ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa ctx->mMDPDownscaleEnabled = true; 24857ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa } 24957ca59ccafa0efa6fb8f5684e90777bbeb6f92c7Tatenda Chipeperekwa 250a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef VPU_TARGET 251a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(qdutils::MDPVersion::getInstance().is8092()) 252a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVPUClient = new VPUClient(ctx); 253a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 254a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGI("Initializing Qualcomm Hardware Composer"); 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGI("MDP version: %d", ctx->mMDP.version); 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid closeContext(hwc_context_t *ctx) 260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mOverlay) { 262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mOverlay; 263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay = NULL; 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mRotMgr) { 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mRotMgr; 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mRotMgr = NULL; 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 271a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mCopyBit[i]) { 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mCopyBit[i]; 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mCopyBit[i] = NULL; 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd) { 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd); 280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd = -1; 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mExtDisplay) { 284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mExtDisplay; 285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mExtDisplay = NULL; 286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 288a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef VPU_TARGET 289a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mVPUClient != NULL) 290a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete ctx->mVPUClient; 291a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 292a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 293a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mFBUpdate[i]) { 295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mFBUpdate[i]; 296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mFBUpdate[i] = NULL; 297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDPComp[i]) { 299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mMDPComp[i]; 300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDPComp[i] = NULL; 301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 302a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHwcDebug[i]) { 303a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete ctx->mHwcDebug[i]; 304a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHwcDebug[i] = NULL; 305a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mLayerRotMap[i]) { 307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mLayerRotMap[i]; 308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[i] = NULL; 309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 311a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mHWCVirtual) { 312a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete ctx->mHWCVirtual; 313a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mHWCVirtual = NULL; 314a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mAD) { 316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson delete ctx->mAD; 317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mAD = NULL; 318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 319a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 320a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid dumpsys_log(android::String8& buf, const char* fmt, ...) 325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_list varargs; 327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_start(varargs, fmt); 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson buf.appendFormatV(fmt, varargs); 329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_end(varargs); 330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 332a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint getExtOrientation(hwc_context_t* ctx) { 333a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = ctx->mExtOrientation; 334a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mBufferMirrorMode) 335a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrient = getMirrorModeOrientation(ctx); 336a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return extOrient; 337a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 338a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* Calculates the destination position based on the action safe rectangle */ 340a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& rect) { 341a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Position 342a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int x = rect.left, y = rect.top; 343a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int w = rect.right - rect.left; 344a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int h = rect.bottom - rect.top; 345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 346a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!ctx->dpyAttr[dpy].mActionSafePresent) 347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 348a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Read action safe properties 349a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int asWidthRatio = ctx->dpyAttr[dpy].mAsWidthRatio; 350a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int asHeightRatio = ctx->dpyAttr[dpy].mAsHeightRatio; 351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float wRatio = 1.0; 353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float hRatio = 1.0; 354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float xRatio = 1.0; 355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float yRatio = 1.0; 356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 357a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbWidth = ctx->dpyAttr[dpy].xres; 358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbHeight = ctx->dpyAttr[dpy].yres; 359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].mDownScaleMode) { 360a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if downscale Mode is enabled for external, need to query 361a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // the actual width and height, as that is the physical w & h 362a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->getAttributes(fbWidth, fbHeight); 363a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 364a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 365a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 366a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Since external is rotated 90, need to swap width/height 367a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = getExtOrientation(ctx); 368a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 369a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient & HWC_TRANSFORM_ROT_90) 370a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(fbWidth, fbHeight); 371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float asX = 0; 373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float asY = 0; 374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float asW = fbWidth; 375a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float asH = fbHeight; 376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // based on the action safe ratio, get the Action safe rectangle 378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson asW = fbWidth * (1.0f - asWidthRatio / 100.0f); 379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson asH = fbHeight * (1.0f - asHeightRatio / 100.0f); 380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson asX = (fbWidth - asW) / 2; 381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson asY = (fbHeight - asH) / 2; 382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // calculate the position ratio 384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson xRatio = (float)x/fbWidth; 385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson yRatio = (float)y/fbHeight; 386ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson wRatio = (float)w/fbWidth; 387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hRatio = (float)h/fbHeight; 388ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 389ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Calculate the position... 390ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson x = (xRatio * asW) + asX; 391ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson y = (yRatio * asH) + asY; 392ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson w = (wRatio * asW); 393ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson h = (hRatio * asH); 394ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Convert it back to hwc_rect_t 396a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.left = x; 397a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.top = y; 398a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.right = w + rect.left; 399a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rect.bottom = h + rect.top; 400a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 404a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// This function gets the destination position for Seconday display 405a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// based on the position and aspect ratio with orientation 406a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid getAspectRatioPosition(hwc_context_t* ctx, int dpy, int extOrientation, 407a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& inRect, hwc_rect_t& outRect) { 408a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t viewFrame = ctx->mViewFrame[dpy]; 409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Physical display resolution 410a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float fbWidth = ctx->dpyAttr[dpy].xres; 411a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float fbHeight = ctx->dpyAttr[dpy].yres; 412a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //display position(x,y,w,h) in correct aspectratio after rotation 413a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int xPos = 0; 414a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int yPos = 0; 415a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float width = fbWidth; 416a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float height = fbHeight; 417a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Width/Height used for calculation, after rotation 418a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float actualWidth = fbWidth; 419a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float actualHeight = fbHeight; 420a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 421a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float wRatio = 1.0; 422a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float hRatio = 1.0; 423a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float xRatio = 1.0; 424a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float yRatio = 1.0; 425a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t rect = {0, 0, (int)fbWidth, (int)fbHeight}; 426a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 427a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Dim inPos(inRect.left, inRect.top, inRect.right - inRect.left, 428a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson inRect.bottom - inRect.top); 429a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Dim outPos(outRect.left, outRect.top, outRect.right - outRect.left, 430a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.bottom - outRect.top); 431a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 432a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(fbWidth, fbHeight, 0); 433a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eTransform extorient = static_cast<eTransform>(extOrientation); 434a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // To calculate the destination co-ordinates in the new orientation 435a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson preRotateSource(extorient, whf, inPos); 436a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 437a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrientation & HAL_TRANSFORM_ROT_90) { 438a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Swap width/height for input position 439a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swapWidthHeight(actualWidth, actualHeight); 440a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(fbWidth, fbHeight, (int)actualWidth, 441a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (int)actualHeight, rect); 442a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xPos = rect.left; 443a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yPos = rect.top; 444a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson width = rect.right - rect.left; 445a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson height = rect.bottom - rect.top; 446a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // swap viewframe coordinates for 90 degree rotation. 447a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(viewFrame.left, viewFrame.top); 448a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(viewFrame.right, viewFrame.bottom); 449a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 450a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if viewframe left and top coordinates are non zero value then exclude it 451a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // during the computation of xRatio and yRatio 452a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xRatio = (inPos.x - viewFrame.left)/actualWidth; 453a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yRatio = (inPos.y - viewFrame.top)/actualHeight; 454a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Use viewframe width and height to compute wRatio and hRatio. 455a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson wRatio = (float)inPos.w/(float)(viewFrame.right - viewFrame.left); 456a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hRatio = (float)inPos.h/(float)(viewFrame.bottom - viewFrame.top); 457a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 458a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 459a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the position... 460a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.x = (xRatio * width) + xPos; 461a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.y = (yRatio * height) + yPos; 462a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w = wRatio * width; 463a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.h = hRatio * height; 464a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: Calculated AspectRatio Position: x = %d," 465a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson "y = %d w = %d h = %d", __FUNCTION__, outPos.x, outPos.y, 466a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w, outPos.h); 467a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 468a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // For sidesync, the dest fb will be in portrait orientation, and the crop 469a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // will be updated to avoid the black side bands, and it will be upscaled 470a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // to fit the dest RB, so recalculate 471a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // the position based on the new width and height 472a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if ((extOrientation & HWC_TRANSFORM_ROT_90) && 473a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson isOrientationPortrait(ctx)) { 474a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t r = {0, 0, 0, 0}; 475a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the position 476a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xRatio = (outPos.x - xPos)/width; 477a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // GetaspectRatio -- tricky to get the correct aspect ratio 478a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // But we need to do this. 479a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(width, height, width, height, r); 480a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xPos = r.left; 481a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yPos = r.top; 482a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float tempHeight = r.bottom - r.top; 483a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yRatio = yPos/height; 484a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson wRatio = outPos.w/width; 485a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hRatio = tempHeight/height; 486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Map the coordinates back to Framebuffer domain 488a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.x = (xRatio * fbWidth); 489a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.y = (yRatio * fbHeight); 490a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w = wRatio * fbWidth; 491a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.h = hRatio * fbHeight; 492a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 493a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: Calculated AspectRatio for device in" 494a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson "portrait: x = %d,y = %d w = %d h = %d", __FUNCTION__, 495a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.x, outPos.y, 496a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w, outPos.h); 497a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 498a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].mDownScaleMode) { 499a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extW, extH; 500a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_EXTERNAL) 501a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->getAttributes(extW, extH); 502a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else 503a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualDisplay->getAttributes(extW, extH); 504a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson fbWidth = ctx->dpyAttr[dpy].xres; 505a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson fbHeight = ctx->dpyAttr[dpy].yres; 506a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the position... 507a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson xRatio = outPos.x/fbWidth; 508a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yRatio = outPos.y/fbHeight; 509a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson wRatio = outPos.w/fbWidth; 510a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hRatio = outPos.h/fbHeight; 511a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 512a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.x = xRatio * extW; 513a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.y = yRatio * extH; 514a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.w = wRatio * extW; 515a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outPos.h = hRatio * extH; 516a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 517a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Convert Dim to hwc_rect_t 518a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.left = outPos.x; 519a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.top = outPos.y; 520a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.right = outPos.x + outPos.w; 521a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.bottom = outPos.y + outPos.h; 522a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 523a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return; 524a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 525a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 526a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isPrimaryPortrait(hwc_context_t *ctx) { 527a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 528a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fbHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 529a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(fbWidth < fbHeight) { 530a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 531a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 532a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 533a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 534a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 535a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isOrientationPortrait(hwc_context_t *ctx) { 536a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isPrimaryPortrait(ctx)) { 537a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return !(ctx->deviceOrientation & 0x1); 538a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 539a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return (ctx->deviceOrientation & 0x1); 540a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 541a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 542a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid calcExtDisplayPosition(hwc_context_t *ctx, 543a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd, 544a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dpy, 545a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& sourceCrop, 546a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& displayFrame, 547a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int& transform, 548a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eTransform& orient) { 549a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Swap width and height when there is a 90deg transform 550a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = getExtOrientation(ctx); 551a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy && !qdutils::MDPVersion::getInstance().is8x26()) { 552a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isYuvBuffer(hnd)) { 553a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient & HWC_TRANSFORM_ROT_90) { 554a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dstWidth = ctx->dpyAttr[dpy].xres; 555a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dstHeight = ctx->dpyAttr[dpy].yres;; 556a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int srcWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 557a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int srcHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 558a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isPrimaryPortrait(ctx)) { 559a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(srcWidth, srcHeight); 560a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } // Get Aspect Ratio for external 561a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(dstWidth, dstHeight, srcWidth, 562a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson srcHeight, displayFrame); 563a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Crop - this is needed, because for sidesync, the dest fb will 564a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // be in portrait orientation, so update the crop to not show the 565a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // black side bands. 566a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (isOrientationPortrait(ctx)) { 567a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sourceCrop = displayFrame; 568a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.left = 0; 569a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.top = 0; 570a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.right = dstWidth; 571a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.bottom = dstHeight; 572a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 573a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 574a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].mDownScaleMode) { 575a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extW, extH; 576a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if downscale is enabled, map the co-ordinates to new 577a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // domain(downscaled) 578a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float fbWidth = ctx->dpyAttr[dpy].xres; 579a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float fbHeight = ctx->dpyAttr[dpy].yres; 580a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // query MDP configured attributes 581a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_EXTERNAL) 582a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtDisplay->getAttributes(extW, extH); 583a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else 584a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVirtualDisplay->getAttributes(extW, extH); 585a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Calculate the ratio... 586a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float wRatio = ((float)extW)/fbWidth; 587a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float hRatio = ((float)extH)/fbHeight; 588a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 589a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //convert Dim to hwc_rect_t 590a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.left *= wRatio; 591a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.top *= hRatio; 592a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.right *= wRatio; 593a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame.bottom *= hRatio; 594a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 595a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson }else { 596a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient || ctx->dpyAttr[dpy].mDownScaleMode) { 597a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(ctx, dpy, extOrient, 598a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame, displayFrame); 599a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 600a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 601a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // If there is a external orientation set, use that 602a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOrient) { 603a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson transform = extOrient; 604a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson orient = static_cast<ovutils::eTransform >(extOrient); 605a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 606a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate the actionsafe dimensions for External(dpy = 1 or 2) 607a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getActionSafePosition(ctx, dpy, displayFrame); 608a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 609a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 610a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 611a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* Returns the orientation which needs to be set on External for 612a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * SideSync/Buffer Mirrormode 613a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 614a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint getMirrorModeOrientation(hwc_context_t *ctx) { 615a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrientation = 0; 616a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int deviceOrientation = ctx->deviceOrientation; 617a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isPrimaryPortrait(ctx)) 618a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson deviceOrientation = (deviceOrientation + 1) % 4; 619a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (deviceOrientation == 0) 620a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = HWC_TRANSFORM_ROT_270; 621a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (deviceOrientation == 1)//90 622a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = 0; 623a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (deviceOrientation == 2)//180 624a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = HWC_TRANSFORM_ROT_90; 625a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (deviceOrientation == 3)//270 626a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson extOrientation = HWC_TRANSFORM_FLIP_V | HWC_TRANSFORM_FLIP_H; 627a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 628a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return extOrientation; 629a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 630a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 631a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isDownscaleRequired(hwc_layer_1_t const* layer) { 632a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 633a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 634ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_w, dst_h, src_w, src_h; 635a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_w = displayFrame.right - displayFrame.left; 636a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_h = displayFrame.bottom - displayFrame.top; 637a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_w = sourceCrop.right - sourceCrop.left; 638a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_h = sourceCrop.bottom - sourceCrop.top; 639a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 640a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(((src_w > dst_w) || (src_h > dst_h))) 641a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 642ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 643a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 644a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 645a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool needsScaling(hwc_layer_1_t const* layer) { 646a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_w, dst_h, src_w, src_h; 647ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 648ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 649ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 650ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_w = displayFrame.right - displayFrame.left; 651ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_h = displayFrame.bottom - displayFrame.top; 652ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson src_w = sourceCrop.right - sourceCrop.left; 653ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson src_h = sourceCrop.bottom - sourceCrop.top; 654ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 655ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(((src_w != dst_w) || (src_h != dst_h))) 656ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 657ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 658ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 659ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 660ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 661a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// Checks if layer needs scaling with split 662a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer, 663ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& dpy) { 664a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 665a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int src_width_l, src_height_l; 666a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int src_width_r, src_height_r; 667a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_width_l, dst_height_l; 668a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_width_r, dst_height_r; 669a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_w = ctx->dpyAttr[dpy].xres; 670a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_h = ctx->dpyAttr[dpy].yres; 671a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t cropL, dstL, cropR, dstR; 672a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int lSplit = getLeftSplit(ctx, dpy); 673a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 674a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 675a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 676a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 677a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson cropL = sourceCrop; 678a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dstL = displayFrame; 679a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissorL = { 0, 0, lSplit, hw_h }; 680a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissorL = getIntersection(ctx->mViewFrame[dpy], scissorL); 681a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(cropL, dstL, scissorL, 0); 682a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 683a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson cropR = sourceCrop; 684a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dstR = displayFrame; 685a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissorR = { lSplit, 0, hw_w, hw_h }; 686a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissorR = getIntersection(ctx->mViewFrame[dpy], scissorR); 687a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(cropR, dstR, scissorR, 0); 688a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 689a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Sanitize Crop to stitch 690a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sanitizeSourceCrop(cropL, cropR, hnd); 691a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 692a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate the left dst 693a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_width_l = dstL.right - dstL.left; 694a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_height_l = dstL.bottom - dstL.top; 695a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_width_l = cropL.right - cropL.left; 696a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_height_l = cropL.bottom - cropL.top; 697a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 698a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // check if there is any scaling on the left 699a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(((src_width_l != dst_width_l) || (src_height_l != dst_height_l))) 700a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 701a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 702a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate the right dst 703a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_width_r = dstR.right - dstR.left; 704a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst_height_r = dstR.bottom - dstR.top; 705a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_width_r = cropR.right - cropR.left; 706a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson src_height_r = cropR.bottom - cropR.top; 707a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 708a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // check if there is any scaling on the right 709a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(((src_width_r != dst_width_r) || (src_height_r != dst_height_r))) 710a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 711a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 712a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 713a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 714a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 715a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isAlphaScaled(hwc_layer_1_t const* layer) { 716a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(needsScaling(layer) && isAlphaPresent(layer)) { 717ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 718ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 719ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 720ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 721ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 722ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isAlphaPresent(hwc_layer_1_t const* layer) { 723ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 724ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(hnd) { 725ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int format = hnd->format; 726ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(format) { 727ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_RGBA_8888: 728ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_BGRA_8888: 729ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // In any more formats with Alpha go here.. 730ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 731ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default : return false; 732ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 733ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 734ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 735ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 736ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 737a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void trimLayer(hwc_context_t *ctx, const int& dpy, const int& transform, 738a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& crop, hwc_rect_t& dst) { 739a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_w = ctx->dpyAttr[dpy].xres; 740a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int hw_h = ctx->dpyAttr[dpy].yres; 741a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dst.left < 0 || dst.top < 0 || 742a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dst.right > hw_w || dst.bottom > hw_h) { 743a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 744a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissor = getIntersection(ctx->mViewFrame[dpy], scissor); 745a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(crop, dst, scissor, transform); 746a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 747a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 748a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 749a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void trimList(hwc_context_t *ctx, hwc_display_contents_1_t *list, 750a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy) { 751a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers - 1; i++) { 752a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[i]; 753a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 754a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimLayer(ctx, dpy, 755a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson list->hwLayers[i].transform, 756a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (hwc_rect_t&)crop, 757a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (hwc_rect_t&)list->hwLayers[i].displayFrame); 758a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.left = crop.left; 759a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.right = crop.right; 760a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.top = crop.top; 761a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.bottom = crop.bottom; 762ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 763ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 764ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 765a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t calculateDisplayViewFrame(hwc_context_t *ctx, int dpy) { 766a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dstWidth = ctx->dpyAttr[dpy].xres; 767a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dstHeight = ctx->dpyAttr[dpy].yres; 768a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int srcWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 769a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int srcHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 770a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // default we assume viewframe as a full frame for primary display 771a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect outRect = {0, 0, dstWidth, dstHeight}; 772a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy) { 773a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // swap srcWidth and srcHeight, if the device orientation is 90 or 270. 774a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->deviceOrientation & 0x1) { 775a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson swap(srcWidth, srcHeight); 776a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 777a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Get Aspect Ratio for external 778a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getAspectRatioPosition(dstWidth, dstHeight, srcWidth, 779a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson srcHeight, outRect); 780a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 781a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: view frame for dpy %d is [%d %d %d %d]", 782a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson __FUNCTION__, dpy, outRect.left, outRect.top, 783a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson outRect.right, outRect.bottom); 784a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return outRect; 785a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 786a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 787ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid setListStats(hwc_context_t *ctx, 788a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_display_contents_1_t *list, int dpy) { 789ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int prevYuvCount = ctx->listStats[dpy].yuvCount; 790ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&ctx->listStats[dpy], 0, sizeof(ListStats)); 791ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].numAppLayers = list->numHwLayers - 1; 792ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].fbLayerIndex = list->numHwLayers - 1; 793ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].skipCount = 0; 794ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].preMultipliedAlpha = false; 795ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].isSecurePresent = false; 796ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].yuvCount = 0; 797a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char property[PROPERTY_VALUE_MAX]; 798a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].extOnlyLayerIndex = -1; 799a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].isDisplayAnimating = false; 800a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].roi = ovutils::Dim(0, 0, 801a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (int)ctx->dpyAttr[dpy].xres, (int)ctx->dpyAttr[dpy].yres); 802a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].secureUI = false; 803a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].yuv4k2kCount = 0; 804a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mViewFrame[dpy] = (hwc_rect_t){0, 0, 0, 0}; 805a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].mActionSafePresent = isActionSafePresent(ctx, dpy); 806a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 807a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimList(ctx, list, dpy); 808a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson optimizeLayerRects(list); 809a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 810a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Calculate view frame of ext display from primary resolution 811a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // and primary device orientation. 812a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mViewFrame[dpy] = calculateDisplayViewFrame(ctx, dpy); 813ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 814ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (size_t i = 0; i < (size_t)ctx->listStats[dpy].numAppLayers; i++) { 815ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_layer_1_t const* layer = &list->hwLayers[i]; 816ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 817ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 818a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef QCOM_BSP 819a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_SCREENSHOT_ANIMATOR_LAYER) { 820a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].isDisplayAnimating = true; 821a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 822a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isSecureDisplayBuffer(hnd)) { 823a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].secureUI = true; 824a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 825a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 826ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // continue if number of app layers exceeds MAX_NUM_APP_LAYERS 827ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->listStats[dpy].numAppLayers > MAX_NUM_APP_LAYERS) 828ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson continue; 829ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 830ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //reset yuv indices 831ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].yuvIndices[i] = -1; 832a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].yuv4k2kIndices[i] = -1; 833ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 834ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSecureBuffer(hnd)) { 835ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].isSecurePresent = true; 836ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 837ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 838ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSkipLayer(&list->hwLayers[i])) { 839ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].skipCount++; 840a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 841a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 842a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (UNLIKELY(isYuvBuffer(hnd))) { 843ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& yuvCount = ctx->listStats[dpy].yuvCount; 844ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].yuvIndices[yuvCount] = i; 845ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson yuvCount++; 846ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 847a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(UNLIKELY(is4kx2kYuvBuffer(hnd))){ 848a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int& yuv4k2kCount = ctx->listStats[dpy].yuv4k2kCount; 849a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].yuv4k2kIndices[yuv4k2kCount] = i; 850a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson yuv4k2kCount++; 851a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 852a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 853ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((layer->transform & HWC_TRANSFORM_ROT_90) && 854ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson canUseRotator(ctx, dpy)) { 855ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if( (dpy == HWC_DISPLAY_PRIMARY) && 856ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mOverlay->isPipeTypeAttached(OV_MDP_PIPE_DMA)) { 857ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->isPaddingRound = true; 858ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 859ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 860ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 861ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 862ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(layer->blending == HWC_BLENDING_PREMULT) 863ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->listStats[dpy].preMultipliedAlpha = true; 864a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 865a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 866a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(UNLIKELY(isExtOnly(hnd))){ 867a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[dpy].extOnlyLayerIndex = i; 868a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 869a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 870a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->listStats[dpy].yuvCount > 0) { 871a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (property_get("hw.cabl.yuv", property, NULL) > 0) { 872a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (atoi(property) != 1) { 873a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_set("hw.cabl.yuv", "1"); 874a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 875a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 876a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else { 877a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (property_get("hw.cabl.yuv", property, NULL) > 0) { 878a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (atoi(property) != 0) { 879a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_set("hw.cabl.yuv", "0"); 880a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 881a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 882a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 883a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy) { 884a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //uncomment the below code for testing purpose. 885a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* char value[PROPERTY_VALUE_MAX]; 886a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_get("sys.ext_orientation", value, "0"); 887a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Assuming the orientation value is in terms of HAL_TRANSFORM, 888a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // This needs mapping to HAL, if its in different convention 889a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtOrientation = atoi(value); */ 890a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Assuming the orientation value is in terms of HAL_TRANSFORM, 891a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // This needs mapping to HAL, if its in different convention 892a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mExtOrientation || ctx->mBufferMirrorMode) { 893a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: ext orientation = %d" 894a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson "BufferMirrorMode = %d", __FUNCTION__, 895a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mExtOrientation, ctx->mBufferMirrorMode); 896a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mOverlay->isPipeTypeAttached(OV_MDP_PIPE_DMA)) { 897a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->isPaddingRound = true; 898a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 899a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 900a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 901ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 902a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 903ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //The marking of video begin/end is useful on some targets where we need 904ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //to have a padding round to be able to shift pipes across mixers. 905ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(prevYuvCount != ctx->listStats[dpy].yuvCount) { 906ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mVideoTransFlag = true; 907ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 908a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 909ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY) { 910ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mAD->markDoable(ctx, list); 911ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 912ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 913ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 914ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 915ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic void calc_cut(double& leftCutRatio, double& topCutRatio, 916ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson double& rightCutRatio, double& bottomCutRatio, int orient) { 917ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(orient & HAL_TRANSFORM_FLIP_H) { 918ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(leftCutRatio, rightCutRatio); 919ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 920ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(orient & HAL_TRANSFORM_FLIP_V) { 921ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(topCutRatio, bottomCutRatio); 922ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 923ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(orient & HAL_TRANSFORM_ROT_90) { 924ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Anti clock swapping 925ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson double tmpCutRatio = leftCutRatio; 926ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson leftCutRatio = topCutRatio; 927ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson topCutRatio = rightCutRatio; 928ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rightCutRatio = bottomCutRatio; 929ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bottomCutRatio = tmpCutRatio; 930ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 931ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 932ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 933ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer) { 934ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((ctx->mMDP.version < qdutils::MDSS_V5) && 935ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (ctx->mMDP.version > qdutils::MDP_V3_0) && 936ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mSecuring) { 937ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 938ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 939ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSecureModePolicy(ctx->mMDP.version)) { 940ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 941ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mSecureMode) { 942ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (! isSecureBuffer(hnd)) { 943a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG,"%s:Securing Turning ON ...", 944a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson __FUNCTION__); 945ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 946ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 947ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 948ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (isSecureBuffer(hnd)) { 949a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG,"%s:Securing Turning OFF ...", 950a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson __FUNCTION__); 951ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 952ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 953ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 954ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 955ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 956ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 957ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 958ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool isSecureModePolicy(int mdpVersion) { 959ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (mdpVersion < qdutils::MDSS_V5) 960ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 961ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson else 962ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 963ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 964ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 965a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// returns true if Action safe dimensions are set and target supports Actionsafe 966a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isActionSafePresent(hwc_context_t *ctx, int dpy) { 967a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if external supports underscan, do nothing 968a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // it will be taken care in the driver 96909b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan // Disable Action safe for 8974 due to HW limitation for downscaling 97009b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan // layers with overlapped region 97109b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan // Disable Actionsafe for non HDMI displays. 97209b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan if(!(dpy == HWC_DISPLAY_EXTERNAL) || 97309b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan qdutils::MDPVersion::getInstance().is8x74v2() || 97409b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan ctx->mExtDisplay->isCEUnderscanSupported()) { 975a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 97609b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan } 977a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 978a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson char value[PROPERTY_VALUE_MAX]; 979a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Read action safe properties 980a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_get("persist.sys.actionsafe.width", value, "0"); 981a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].mAsWidthRatio = atoi(value); 982a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson property_get("persist.sys.actionsafe.height", value, "0"); 983a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[dpy].mAsHeightRatio = atoi(value); 984a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 985a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!ctx->dpyAttr[dpy].mAsWidthRatio && !ctx->dpyAttr[dpy].mAsHeightRatio) { 986a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //No action safe ratio set, return 987a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 988a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 989a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 990a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 991a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 992ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getBlending(int blending) { 993ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(blending) { 994ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BLENDING_NONE: 995ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return overlay::utils::OVERLAY_BLENDING_OPAQUE; 996ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BLENDING_PREMULT: 997ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return overlay::utils::OVERLAY_BLENDING_PREMULT; 998ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HWC_BLENDING_COVERAGE : 999ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 1000ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return overlay::utils::OVERLAY_BLENDING_COVERAGE; 1001ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1002ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1003ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1004ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//Crops source buffer against destination and FB boundaries 1005ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 1006ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const hwc_rect_t& scissor, int orient) { 1007ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1008ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_l = crop.left; 1009ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_t = crop.top; 1010ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_r = crop.right; 1011ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& crop_b = crop.bottom; 1012ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_w = crop.right - crop.left; 1013ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_h = crop.bottom - crop.top; 1014ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1015ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_l = dst.left; 1016ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_t = dst.top; 1017ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_r = dst.right; 1018ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int& dst_b = dst.bottom; 1019ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_w = abs(dst.right - dst.left); 1020ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_h = abs(dst.bottom - dst.top); 1021ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1022ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_l = scissor.left; 1023ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_t = scissor.top; 1024ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_r = scissor.right; 1025ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& sci_b = scissor.bottom; 1026ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1027ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson double leftCutRatio = 0.0, rightCutRatio = 0.0, topCutRatio = 0.0, 1028ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bottomCutRatio = 0.0; 1029ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1030ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_l < sci_l) { 1031ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson leftCutRatio = (double)(sci_l - dst_l) / (double)dst_w; 1032ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_l = sci_l; 1033ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1034ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1035ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_r > sci_r) { 1036ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rightCutRatio = (double)(dst_r - sci_r) / (double)dst_w; 1037ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_r = sci_r; 1038ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1039ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1040ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_t < sci_t) { 1041ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson topCutRatio = (double)(sci_t - dst_t) / (double)dst_h; 1042ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_t = sci_t; 1043ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1044ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1045ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dst_b > sci_b) { 1046ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bottomCutRatio = (double)(dst_b - sci_b) / (double)dst_h; 1047ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst_b = sci_b; 1048ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1049ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1050ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson calc_cut(leftCutRatio, topCutRatio, rightCutRatio, bottomCutRatio, orient); 10516a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_l += (int)round((double)crop_w * leftCutRatio); 10526a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_t += (int)round((double)crop_h * topCutRatio); 10536a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_r -= (int)round((double)crop_w * rightCutRatio); 10546a9d12360acf2c27c5ca4b4b58ae45c56284b29fDileep Kumar Reddi crop_b -= (int)round((double)crop_h * bottomCutRatio); 1055ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1056ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1057a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool areLayersIntersecting(const hwc_layer_1_t* layer1, 1058a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const hwc_layer_1_t* layer2) { 1059a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t irect = getIntersection(layer1->displayFrame, 1060a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer2->displayFrame); 1061a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return isValidRect(irect); 1062a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1063a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1064a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isValidRect(const hwc_rect& rect) 1065a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 1066a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ((rect.bottom > rect.top) && (rect.right > rect.left)) ; 1067a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1068a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1069a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* computes the intersection of two rects */ 1070a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t getIntersection(const hwc_rect_t& rect1, const hwc_rect_t& rect2) 1071a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 1072a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t res; 1073a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1074a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(rect1) || !isValidRect(rect2)){ 1075a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return (hwc_rect_t){0, 0, 0, 0}; 1076a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1077a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1078a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1079a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.left = max(rect1.left, rect2.left); 1080a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.top = max(rect1.top, rect2.top); 1081a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.right = min(rect1.right, rect2.right); 1082a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.bottom = min(rect1.bottom, rect2.bottom); 1083a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1084a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(res)) 1085a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return (hwc_rect_t){0, 0, 0, 0}; 1086a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1087a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 1088a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1089a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1090a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* computes the union of two rects */ 1091a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t getUnion(const hwc_rect &rect1, const hwc_rect &rect2) 1092a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 1093a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t res; 1094a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1095a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(rect1)){ 1096a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return rect2; 1097a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1098a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1099a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!isValidRect(rect2)){ 1100a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return rect1; 1101a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1102a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1103a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.left = min(rect1.left, rect2.left); 1104a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.top = min(rect1.top, rect2.top); 1105a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.right = max(rect1.right, rect2.right); 1106a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.bottom = max(rect1.bottom, rect2.bottom); 1107a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1108a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 1109a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1110a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* Not a geometrical rect deduction. Deducts rect2 from rect1 only if it results 1112a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * a single rect */ 1113a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonhwc_rect_t deductRect(const hwc_rect_t& rect1, const hwc_rect_t& rect2) { 1114a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1115a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t res = rect1; 1116a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1117a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((rect1.left == rect2.left) && (rect1.right == rect2.right)) { 1118a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((rect1.top == rect2.top) && (rect2.bottom <= rect1.bottom)) 1119a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.top = rect2.bottom; 1120a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if((rect1.bottom == rect2.bottom)&& (rect2.top >= rect1.top)) 1121a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.bottom = rect2.top; 1122a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1123a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if((rect1.top == rect2.top) && (rect1.bottom == rect2.bottom)) { 1124a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((rect1.left == rect2.left) && (rect2.right <= rect1.right)) 1125a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.left = rect2.right; 1126a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if((rect1.right == rect2.right)&& (rect2.left >= rect1.left)) 1127a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res.right = rect2.left; 1128a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1129a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 1130a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1131a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1132a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid optimizeLayerRects(const hwc_display_contents_1_t *list) { 1133a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int i=list->numHwLayers-2; 1134a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson while(i > 0) { 1135a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //see if there is no blending required. 1136a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If it is opaque see if we can substract this region from below 1137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //layers. 1138a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->hwLayers[i].blending == HWC_BLENDING_NONE) { 1139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int j= i-1; 1140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& topframe = 1141a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (hwc_rect_t&)list->hwLayers[i].displayFrame; 1142a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson while(j >= 0) { 1143a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!needsScaling(&list->hwLayers[j])) { 1144a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t* layer = (hwc_layer_1_t*)&list->hwLayers[j]; 1145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& bottomframe = layer->displayFrame; 1146a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t bottomCrop = 1147a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson integerizeSourceCrop(layer->sourceCropf); 1148a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int transform =layer->transform; 1149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1150a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t irect = getIntersection(bottomframe, topframe); 1151a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isValidRect(irect)) { 1152a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t dest_rect; 1153a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //if intersection is valid rect, deduct it 1154a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dest_rect = deductRect(bottomframe, irect); 1155a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(bottomCrop, bottomframe, 1156a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson dest_rect, transform); 1157a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Update layer sourceCropf 1158a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.left = bottomCrop.left; 1159a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.top = bottomCrop.top; 1160a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.right = bottomCrop.right; 1161a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->sourceCropf.bottom = bottomCrop.bottom; 1162a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1163a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson j--; 1165a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1166a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1167a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson i--; 1168a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1170a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getNonWormholeRegion(hwc_display_contents_1_t* list, 1172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t& nwr) 1173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 1174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t last = list->numHwLayers - 1; 1175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t fbDisplayFrame = list->hwLayers[last].displayFrame; 1176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Initiliaze nwr to first frame 1177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.left = list->hwLayers[0].displayFrame.left; 1178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.top = list->hwLayers[0].displayFrame.top; 1179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.right = list->hwLayers[0].displayFrame.right; 1180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson nwr.bottom = list->hwLayers[0].displayFrame.bottom; 1181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (uint32_t i = 1; i < last; i++) { 1183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t displayFrame = list->hwLayers[i].displayFrame; 1184a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson nwr = getUnion(nwr, displayFrame); 1185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Intersect with the framebuffer 1188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson nwr = getIntersection(nwr, fbDisplayFrame); 1189a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isExternalActive(hwc_context_t* ctx) { 1192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isActive; 1193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1195a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid closeAcquireFds(hwc_display_contents_1_t* list) { 1196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(LIKELY(list)) { 1197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers; i++) { 1198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Close the acquireFenceFds 1199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HWC_FRAMEBUFFER are -1 already by SF, rest we close. 1200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].acquireFenceFd >= 0) { 1201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(list->hwLayers[i].acquireFenceFd); 1202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].acquireFenceFd = -1; 1203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Writeback 1206a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->outbufAcquireFenceFd >= 0) { 1207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(list->outbufAcquireFenceFd); 1208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->outbufAcquireFenceFd = -1; 1209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 1214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fd) { 1215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ATRACE_CALL(); 1216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 1217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int acquireFd[MAX_NUM_APP_LAYERS]; 1218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int count = 0; 1219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int releaseFd = -1; 1220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int retireFd = -1; 1221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fbFd = -1; 1222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool swapzero = false; 1223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct mdp_buf_sync data; 1225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&data, 0, sizeof(data)); 1226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.acq_fen_fd = acquireFd; 1227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.rel_fen_fd = &releaseFd; 1228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.retire_fen_fd = &retireFd; 1229a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson data.flags = MDP_BUF_SYNC_FLAG_RETIRE_FENCE; 1230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char property[PROPERTY_VALUE_MAX]; 1232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(property_get("debug.egl.swapinterval", property, "1") > 0) { 1233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(atoi(property) == 0) 1234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swapzero = true; 1235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1237a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson bool isExtAnimating = false; 1238a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy) 1239a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson isExtAnimating = ctx->listStats[dpy].isDisplayAnimating; 1240a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1241a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Send acquireFenceFds to rotator 1242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < ctx->mLayerRotMap[dpy]->getCount(); i++) { 1243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotFd = ctx->mRotMgr->getRotDevFd(); 1244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotReleaseFd = -1; 1245a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson overlay::Rotator* currRot = ctx->mLayerRotMap[dpy]->getRot(i); 1246a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t* currLayer = ctx->mLayerRotMap[dpy]->getLayer(i); 1247a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((currRot == NULL) || (currLayer == NULL)) { 1248a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson continue; 1249a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson struct mdp_buf_sync rotData; 1251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memset(&rotData, 0, sizeof(rotData)); 1252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotData.acq_fen_fd = 1253a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson &currLayer->acquireFenceFd; 1254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotData.rel_fen_fd = &rotReleaseFd; //driver to populate this 1255a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rotData.session_id = currRot->getSessId(); 1256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int ret = 0; 1257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = ioctl(rotFd, MSMFB_BUFFER_SYNC, &rotData); 1258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ret < 0) { 1259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: ioctl MSMFB_BUFFER_SYNC failed for rot sync, err=%s", 1260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, strerror(errno)); 1261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 1262a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson close(currLayer->acquireFenceFd); 1263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For MDP to wait on. 1264a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson currLayer->acquireFenceFd = 1265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dup(rotReleaseFd); 1266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //A buffer is free to be used by producer as soon as its copied to 1267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //rotator 1268a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson currLayer->releaseFenceFd = 1269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotReleaseFd; 1270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1273a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Accumulate acquireFenceFds for MDP Overlays 1274a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->outbufAcquireFenceFd >= 0) { 1275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Writeback output buffer 1276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = list->outbufAcquireFenceFd; 1277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers; i++) { 1280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].compositionType == HWC_OVERLAY && 1281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].acquireFenceFd >= 0) { 1282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(UNLIKELY(swapzero)) 1283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = -1; 1284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson else 1285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = list->hwLayers[i].acquireFenceFd; 1286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) { 1288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(UNLIKELY(swapzero)) 1289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = -1; 1290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson else if(fd >= 0) { 1291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //set the acquireFD from fd - which is coming from c2d 1292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = fd; 1293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Buffer sync IOCTL should be async when using c2d fence is 1294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // used 1295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.flags &= ~MDP_BUF_SYNC_FLAG_WAIT; 1296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else if(list->hwLayers[i].acquireFenceFd >= 0) 1297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson acquireFd[count++] = list->hwLayers[i].acquireFenceFd; 1298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.acq_fen_fd_cnt = count; 1302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson fbFd = ctx->dpyAttr[dpy].fd; 1303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1304ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Waits for acquire fences, returns a release fence 1305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(LIKELY(!swapzero)) { 1306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint64_t start = systemTime(); 1307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = ioctl(fbFd, MSMFB_BUFFER_SYNC, &data); 1308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD_IF(HWC_UTILS_DEBUG, "%s: time taken for MSMFB_BUFFER_SYNC IOCTL = %d", 1309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, (size_t) ns2ms(systemTime() - start)); 1310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ret < 0) { 1313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: ioctl MSMFB_BUFFER_SYNC failed, err=%s", 1314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, strerror(errno)); 1315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: acq_fen_fd_cnt=%d flags=%d fd=%d dpy=%d numHwLayers=%d", 1316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__, data.acq_fen_fd_cnt, data.flags, fbFd, 1317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dpy, list->numHwLayers); 1318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1320a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson LayerProp *layerProp = ctx->layerProp[dpy]; 1321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < list->numHwLayers; i++) { 1322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(list->hwLayers[i].compositionType == HWC_OVERLAY || 1323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) { 1324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Populate releaseFenceFds. 1325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(UNLIKELY(swapzero)) { 1326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->hwLayers[i].releaseFenceFd = -1; 1327a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else if(isExtAnimating) { 1328a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Release all the app layer fds immediately, 1329a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // if animation is in progress. 1330a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson list->hwLayers[i].releaseFenceFd = -1; 1331a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else if(list->hwLayers[i].releaseFenceFd < 0 && 1332a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !(layerProp[i].mFlags & HWC_VPUCOMP)) { 1333a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If rotator has not already populated this field 1334a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // & if it's a not VPU layer 1335897c435dd90f4d2513d2b230caf4a18cc970263fSimon Wilson list->hwLayers[i].releaseFenceFd = dup(releaseFd); 1336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fd >= 0) { 1341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(fd); 1342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson fd = -1; 1343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ctx->mCopyBit[dpy]) 1346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mCopyBit[dpy]->setReleaseFd(releaseFd); 1347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Signals when MDP finishes reading rotator buffers. 1349ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[dpy]->setReleaseFd(releaseFd); 1350ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson close(releaseFd); 1351a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson releaseFd = -1; 1352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1353a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(UNLIKELY(swapzero)) { 1354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->retireFenceFd = -1; 1355a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else { 1356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson list->retireFenceFd = retireFd; 1357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return ret; 1359ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid setMdpFlags(hwc_layer_1_t *layer, 1362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eMdpFlags &mdpFlags, 1363a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int rotDownscale, int transform) { 1364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1365a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MetaData_t *metadata = hnd ? (MetaData_t *)hnd->base_metadata : NULL; 1366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(layer->blending == HWC_BLENDING_PREMULT) { 1368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_BLEND_FG_PREMULT); 1370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1372a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_VPU_PIPE) { 1373a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_VPU_PIPE); 1374a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1375a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isYuvBuffer(hnd)) { 1377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isSecureBuffer(hnd)) { 1378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 1380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1381a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // in mpq, deinterlacing is done in vpu 1382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(metadata && (metadata->operation & PP_PARAM_INTERLACED) && 1383a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson metadata->interlaced && 1384a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (!qdutils::MDPVersion::getInstance().is8092())) { 1385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1386ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_DEINTERLACE); 1387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1388ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Pre-rotation will be used using rotator. 1389ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(transform & HWC_TRANSFORM_ROT_90) { 1390ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1391ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::OV_MDP_SOURCE_ROTATED_90); 1392ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1393ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1394ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isSecureDisplayBuffer(hnd)) { 1396a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Secure display needs both SECURE_OVERLAY and SECURE_DISPLAY_OV 1397a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1398a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 1399a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, 1400a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::OV_MDP_SECURE_DISPLAY_OVERLAY_SESSION); 1401a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //No 90 component and no rot-downscale then flips done by MDP 1403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //If we use rot then it might as well do flips 1404a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!(transform & HWC_TRANSFORM_ROT_90) && !rotDownscale) { 1405a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(transform & HWC_TRANSFORM_FLIP_H) { 1406ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H); 1407ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1408ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(transform & HWC_TRANSFORM_FLIP_V) { 1410ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_V); 1411ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1412ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1413ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1414ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(metadata && 1415ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ((metadata->operation & PP_PARAM_HSIC) 1416ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson || (metadata->operation & PP_PARAM_IGC) 1417ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson || (metadata->operation & PP_PARAM_SHARP2))) { 1418ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_PP_EN); 1419ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1420ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1421ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1422a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configRotator(Rotator *rot, Whf& whf, 1423ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t& crop, const eMdpFlags& mdpFlags, 1424ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const eTransform& orient, const int& downscale) { 1425a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1426a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Fix alignments for TILED format 1427a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(whf.format == MDP_Y_CRCB_H2V2_TILE || 1428a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format == MDP_Y_CBCR_H2V2_TILE) { 1429a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.w = utils::alignup(whf.w, 64); 1430a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.h = utils::alignup(whf.h, 32); 1431a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1432ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setSource(whf); 1433ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1434ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (qdutils::MDPVersion::getInstance().getMDPVersion() >= 1435ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::MDSS_V5) { 1436ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t crop_w = (crop.right - crop.left); 1437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t crop_h = (crop.bottom - crop.top); 1438ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (ovutils::isYuv(whf.format)) { 1439ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::normalizeCrop((uint32_t&)crop.left, crop_w); 1440ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::normalizeCrop((uint32_t&)crop.top, crop_h); 1441ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // For interlaced, crop.h should be 4-aligned 1442ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if ((mdpFlags & ovutils::OV_MDP_DEINTERLACE) && (crop_h % 4)) 1443ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop_h = ovutils::aligndown(crop_h, 4); 1444ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right = crop.left + crop_w; 1445ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom = crop.top + crop_h; 1446ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1447ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Dim rotCrop(crop.left, crop.top, crop_w, crop_h); 1448ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setCrop(rotCrop); 1449ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1450ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1451ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setFlags(mdpFlags); 1452ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setTransform(orient); 1453ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot->setDownscale(downscale); 1454ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!rot->commit()) return -1; 1455ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1456ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1457ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1458ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint configMdp(Overlay *ov, const PipeArgs& parg, 1459ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const eTransform& orient, const hwc_rect_t& crop, 1460ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const hwc_rect_t& pos, const MetaData_t *metadata, 1461ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const eDest& dest) { 1462ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setSource(parg, dest); 1463ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setTransform(orient, dest); 1464ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1465ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_w = crop.right - crop.left; 1466ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int crop_h = crop.bottom - crop.top; 1467ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Dim dcrop(crop.left, crop.top, crop_w, crop_h); 1468ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setCrop(dcrop, dest); 1469ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1470ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int posW = pos.right - pos.left; 1471ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int posH = pos.bottom - pos.top; 1472ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Dim position(pos.left, pos.top, posW, posH); 1473ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setPosition(position, dest); 1474ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1475ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (metadata) 1476ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov->setVisualParams(*metadata, dest); 1477ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1478ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!ov->commit(dest)) { 1479ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1480ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1481ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1482ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1483ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1484a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, 1485a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlags, eZorder& z, 1486a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& dest) { 1487a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1488a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1489a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimLayer(ctx, dpy, 0, dst, dst); 1490a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1491a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int w = ctx->dpyAttr[dpy].xres; 1492a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int h = ctx->dpyAttr[dpy].yres; 1493a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_w = dst.right - dst.left; 1494a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int dst_h = dst.bottom - dst.top; 1495a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t color = layer->transform; 1496a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(w, h, getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888), 0); 1497a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1498a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_SOLID_FILL); 1499a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->blending == HWC_BLENDING_PREMULT) 1500a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_BLEND_FG_PREMULT); 1501a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1502a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson PipeArgs parg(mdpFlags, whf, z, isFg, static_cast<eRotFlags>(0), 1503a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->planeAlpha, 1504a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1505a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1506a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Configure MDP pipe for Color layer 1507a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Dim pos(dst.left, dst.top, dst_w, dst_h); 1508a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setSource(parg, dest); 1509a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setColor(color, dest); 1510a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setTransform(0, dest); 1511a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setCrop(pos, dest); 1512a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->setPosition(pos, dest); 1513a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1514a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (!ctx->mOverlay->commit(dest)) { 1515a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: Configure color layer failed!", __FUNCTION__); 1516a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1517a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1518a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return 0; 1519a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1520a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1521ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid updateSource(eTransform& orient, Whf& whf, 1522ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t& crop) { 1523ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Dim srcCrop(crop.left, crop.top, 1524ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right - crop.left, 1525ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom - crop.top); 1526ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson orient = static_cast<eTransform>(ovutils::getMdpOrient(orient)); 1527ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson preRotateSource(orient, whf, srcCrop); 1528ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (qdutils::MDPVersion::getInstance().getMDPVersion() >= 1529ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::MDSS_V5) { 1530ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Source for overlay will be the cropped (and rotated) 1531ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.left = 0; 1532ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.top = 0; 1533ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right = srcCrop.w; 1534ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom = srcCrop.h; 1535ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Set width & height equal to sourceCrop w & h 1536ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson whf.w = srcCrop.w; 1537ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson whf.h = srcCrop.h; 1538ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 1539ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.left = srcCrop.x; 1540ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.top = srcCrop.y; 1541ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right = srcCrop.x + srcCrop.w; 1542ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom = srcCrop.y + srcCrop.h; 1543ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1544ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1545ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1546a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 1547a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlags, eZorder& z, 1548a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& dest, Rotator **rot) { 1549ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1550ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1551a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1552ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!hnd) { 1553a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_COLOR_FILL) { 1554a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Configure Color layer 1555a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return configColorLayer(ctx, layer, dpy, mdpFlags, z, isFg, dest); 1556a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1557ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: layer handle is NULL", __FUNCTION__); 1558ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1559ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1560ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1561ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 1562ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1563ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 1564ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1565ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int transform = layer->transform; 1566ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson eTransform orient = static_cast<eTransform>(transform); 1567ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int downscale = 0; 1568ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotFlags = ovutils::ROT_FLAGS_NONE; 1569a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd)); 1570a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(getWidth(hnd), getHeight(hnd), format, hnd->size); 1571ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1572a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef VPU_TARGET 1573a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mVPUClient != NULL && 1574a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVPUClient->supportedVPULayer(dpy, layer)) { 1575a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat( 1576a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVPUClient->getLayerFormat(dpy, layer)); 1577a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.w = ctx->mVPUClient->getWidth(dpy, layer); 1578a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.h = ctx->mVPUClient->getHeight(dpy, layer); 1579a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1580a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 1581ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1582a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Handle R/B swap 1583a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_FORMAT_RB_SWAP) { 1584a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888) 1585a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888); 1586a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888) 1587a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888); 1588ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1589ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1590a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson calcExtDisplayPosition(ctx, hnd, dpy, crop, dst, transform, orient); 1591a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1592ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isYuvBuffer(hnd) && ctx->mMDP.version >= qdutils::MDP_V4_2 && 1593ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mMDP.version < qdutils::MDSS_V5) { 1594ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson downscale = getDownscaleFactor( 1595ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.right - crop.left, 1596ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson crop.bottom - crop.top, 1597ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst.right - dst.left, 1598ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dst.bottom - dst.top); 1599ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(downscale) { 1600ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotFlags = ROT_DOWNSCALE_ENABLED; 1601ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1602ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1603ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1604a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson setMdpFlags(layer, mdpFlags, downscale, transform); 1605ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1606ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isYuvBuffer(hnd) && //if 90 component or downscale, use rot 1607ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ((transform & HWC_TRANSFORM_ROT_90) || downscale)) { 1608ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *rot = ctx->mRotMgr->getNext(); 1609ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(*rot == NULL) return -1; 1610a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!dpy) 1611a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson BwcPM::setBwc(crop, dst, transform, mdpFlags); 1612ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Configure rotator for pre-rotation 1613ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) { 1614ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: configRotator failed!", __FUNCTION__); 1615ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1616ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1617ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[dpy]->add(layer, *rot); 1618ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson whf.format = (*rot)->getDstFormat(); 1619ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson updateSource(orient, whf, crop); 1620ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotFlags |= ovutils::ROT_PREROTATED; 1621ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1622ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1623ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 1624ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson orient = OVERLAY_TRANSFORM_0; 1625ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson transform = 0; 1626ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson PipeArgs parg(mdpFlags, whf, z, isFg, 1627ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 1628ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1629ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1630ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configMdp(ctx->mOverlay, parg, orient, crop, dst, metadata, dest) < 0) { 1631ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: commit failed for low res panel", __FUNCTION__); 1632ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1633ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1634ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1635ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1636ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1637a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//Helper to 1) Ensure crops dont have gaps 2) Ensure L and W are even 1638a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR, 1639a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd) { 1640a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(cropL.right - cropL.left) { 1641a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isYuvBuffer(hnd)) { 1642a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Always safe to even down left 1643a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropL.left); 1644a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If right is even, automatically width is even, since left is 1645a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //already even 1646a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropL.right); 1647a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1648a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Make sure there are no gaps between left and right splits if the layer 1649a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //is spread across BOTH halves 1650a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(cropR.right - cropR.left) { 1651a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson cropR.left = cropL.right; 1652a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1653a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1654a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1655a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(cropR.right - cropR.left) { 1656a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isYuvBuffer(hnd)) { 1657a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Always safe to even down left 1658a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropR.left); 1659a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If right is even, automatically width is even, since left is 1660a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //already even 1661a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::even_floor(cropR.right); 1662a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1663a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1664a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1665a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1666a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 1667a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlagsL, eZorder& z, 1668a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& lDest, const eDest& rDest, 1669ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Rotator **rot) { 1670ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1671ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!hnd) { 1672ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: layer handle is NULL", __FUNCTION__); 1673ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1674ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1675ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1676ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 1677ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1678ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int hw_w = ctx->dpyAttr[dpy].xres; 1679ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int hw_h = ctx->dpyAttr[dpy].yres; 1680ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf); 1681ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1682ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int transform = layer->transform; 1683ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson eTransform orient = static_cast<eTransform>(transform); 1684ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int downscale = 0; 1685ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int rotFlags = ROT_FLAGS_NONE; 1686a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd)); 1687a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(getWidth(hnd), getHeight(hnd), format, hnd->size); 1688ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1689a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#ifdef VPU_TARGET 1690a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->mVPUClient != NULL && 1691a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVPUClient->supportedVPULayer(dpy, layer)) { 1692a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat( 1693a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mVPUClient->getLayerFormat(dpy, layer)); 1694a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.w = ctx->mVPUClient->getWidth(dpy, layer); 1695a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.h = ctx->mVPUClient->getHeight(dpy, layer); 1696a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1697a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#endif 1698ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1699a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Handle R/B swap 1700a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (layer->flags & HWC_FORMAT_RB_SWAP) { 1701a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (hnd->format == HAL_PIXEL_FORMAT_RGBA_8888) 1702a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRA_8888); 1703a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson else if (hnd->format == HAL_PIXEL_FORMAT_RGBX_8888) 1704a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888); 1705a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1706a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 170709b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan /* Calculate the external display position based on MDP downscale, 170809b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan ActionSafe, and extorientation features. */ 170909b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan calcExtDisplayPosition(ctx, hnd, dpy, crop, dst, transform, orient); 171009b70dd517a147dfb0e7829a08f2a288682a78fbRamkumar Radhakrishnan 1711a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson setMdpFlags(layer, mdpFlagsL, 0, transform); 1712a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1713a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(lDest != OV_INVALID && rDest != OV_INVALID) { 1714a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Enable overfetch 1715a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson setMdpFlags(mdpFlagsL, OV_MDSS_MDP_DUAL_PIPE); 1716a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1717ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1718ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Will do something only if feature enabled and conditions suitable 1719ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //hollow call otherwise 1720ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mAD->prepare(ctx, crop, whf, hnd)) { 1721ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Writeback *wb = overlay::Writeback::getInstance(); 1722ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson whf.format = wb->getOutputFormat(); 1723ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1724ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1725ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(isYuvBuffer(hnd) && (transform & HWC_TRANSFORM_ROT_90)) { 1726ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (*rot) = ctx->mRotMgr->getNext(); 1727ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((*rot) == NULL) return -1; 1728ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Configure rotator for pre-rotation 1729ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { 1730ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: configRotator failed!", __FUNCTION__); 1731ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1732ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1733ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ctx->mLayerRotMap[dpy]->add(layer, *rot); 1734ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson whf.format = (*rot)->getDstFormat(); 1735ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson updateSource(orient, whf, crop); 1736ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rotFlags |= ROT_PREROTATED; 1737ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1738ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1739ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson eMdpFlags mdpFlagsR = mdpFlagsL; 1740ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson setMdpFlags(mdpFlagsR, OV_MDSS_MDP_RIGHT_MIXER); 1741ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1742a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropL = {0}, tmp_dstL = {0}; 1743a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropR = {0}, tmp_dstR = {0}; 1744ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1745ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int lSplit = getLeftSplit(ctx, dpy); 1746ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1747ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(lDest != OV_INVALID) { 1748ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL = crop; 1749ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstL = dst; 1750ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t scissor = {0, 0, lSplit, hw_h }; 1751a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissor = getIntersection(ctx->mViewFrame[dpy], scissor); 1752ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qhwc::calculate_crop_rects(tmp_cropL, tmp_dstL, scissor, 0); 1753ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1754ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(rDest != OV_INVALID) { 1755ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR = crop; 1756ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstR = dst; 1757ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t scissor = {lSplit, 0, hw_w, hw_h }; 1758a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson scissor = getIntersection(ctx->mViewFrame[dpy], scissor); 1759ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qhwc::calculate_crop_rects(tmp_cropR, tmp_dstR, scissor, 0); 1760ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1761ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1762a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sanitizeSourceCrop(tmp_cropL, tmp_cropR, hnd); 1763a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1764ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //When buffer is H-flipped, contents of mixer config also needs to swapped 1765ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Not needed if the layer is confined to one half of the screen. 1766ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //If rotator has been used then it has also done the flips, so ignore them. 1767ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((orient & OVERLAY_TRANSFORM_FLIP_H) && lDest != OV_INVALID 1768ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson && rDest != OV_INVALID && (*rot) == NULL) { 1769ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t new_cropR; 1770ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropR.left = tmp_cropL.left; 1771ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropR.right = new_cropR.left + (tmp_cropR.right - tmp_cropR.left); 1772ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1773ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_rect_t new_cropL; 1774ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropL.left = new_cropR.right; 1775ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson new_cropL.right = tmp_cropR.right; 1776ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1777ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL.left = new_cropL.left; 1778ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL.right = new_cropL.right; 1779ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1780ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR.left = new_cropR.left; 1781ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR.right = new_cropR.right; 1782ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1783ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1784ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1785ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 1786ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson orient = OVERLAY_TRANSFORM_0; 1787ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson transform = 0; 1788ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1789ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //configure left mixer 1790ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(lDest != OV_INVALID) { 1791ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson PipeArgs pargL(mdpFlagsL, whf, z, isFg, 1792ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 1793ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1794ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1795ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configMdp(ctx->mOverlay, pargL, orient, 1796ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropL, tmp_dstL, metadata, lDest) < 0) { 1797ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: commit failed for left mixer config", __FUNCTION__); 1798ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1799ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1800ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1801ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1802ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //configure right mixer 1803ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(rDest != OV_INVALID) { 1804ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson PipeArgs pargR(mdpFlagsR, whf, z, isFg, 1805a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<eRotFlags>(rotFlags), 1806a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->planeAlpha, 1807a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1808ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstR.right = tmp_dstR.right - lSplit; 1809ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_dstR.left = tmp_dstR.left - lSplit; 1810ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(configMdp(ctx->mOverlay, pargR, orient, 1811ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson tmp_cropR, tmp_dstR, metadata, rDest) < 0) { 1812ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: commit failed for right mixer config", __FUNCTION__); 1813ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 1814ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1815ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1816ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1817ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 1818ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1819ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1820a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint configureSourceSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 1821a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int& dpy, eMdpFlags& mdpFlagsL, eZorder& z, 1822a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eIsFg& isFg, const eDest& lDest, const eDest& rDest, 1823a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Rotator **rot) { 1824a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t *hnd = (private_handle_t *)layer->handle; 1825a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!hnd) { 1826a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: layer handle is NULL", __FUNCTION__); 1827a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1828a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1829a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1830a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 1831a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1832a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);; 1833a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t dst = layer->displayFrame; 1834a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int transform = layer->transform; 1835a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eTransform orient = static_cast<eTransform>(transform); 1836a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const int downscale = 0; 1837a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int rotFlags = ROT_FLAGS_NONE; 1838a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Splitting only YUV layer on primary panel needs different zorders 1839a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //for both layers as both the layers are configured to single mixer 1840a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eZorder lz = z; 1841a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eZorder rz = (eZorder)(z + 1); 1842a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1843a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Whf whf(getWidth(hnd), getHeight(hnd), 1844a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getMdpFormat(hnd->format), hnd->size); 1845a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1846a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* Calculate the external display position based on MDP downscale, 1847a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ActionSafe, and extorientation features. */ 1848a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson calcExtDisplayPosition(ctx, hnd, dpy, crop, dst, transform, orient); 1849a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1850a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson setMdpFlags(layer, mdpFlagsL, 0, transform); 1851a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson trimLayer(ctx, dpy, transform, crop, dst); 1852a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1853a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(isYuvBuffer(hnd) && (transform & HWC_TRANSFORM_ROT_90)) { 1854a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (*rot) = ctx->mRotMgr->getNext(); 1855a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((*rot) == NULL) return -1; 1856a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!dpy) 1857a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson BwcPM::setBwc(crop, dst, transform, mdpFlagsL); 1858a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Configure rotator for pre-rotation 1859a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { 1860a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: configRotator failed!", __FUNCTION__); 1861a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1862a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1863a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mLayerRotMap[dpy]->add(layer, *rot); 1864a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson whf.format = (*rot)->getDstFormat(); 1865a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson updateSource(orient, whf, crop); 1866a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rotFlags |= ROT_PREROTATED; 1867a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1868a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1869a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson eMdpFlags mdpFlagsR = mdpFlagsL; 1870a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int lSplit = dst.left + (dst.right - dst.left)/2; 1871a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1872a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropL = {0}, tmp_dstL = {0}; 1873a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t tmp_cropR = {0}, tmp_dstR = {0}; 1874a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1875a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(lDest != OV_INVALID) { 1876a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL = crop; 1877a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_dstL = dst; 1878a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissor = {dst.left, dst.top, lSplit, dst.bottom }; 1879a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(tmp_cropL, tmp_dstL, scissor, 0); 1880a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1881a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(rDest != OV_INVALID) { 1882a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR = crop; 1883a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_dstR = dst; 1884a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t scissor = {lSplit, dst.top, dst.right, dst.bottom }; 1885a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qhwc::calculate_crop_rects(tmp_cropR, tmp_dstR, scissor, 0); 1886a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1887a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1888a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sanitizeSourceCrop(tmp_cropL, tmp_cropR, hnd); 1889a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1890a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //When buffer is H-flipped, contents of mixer config also needs to swapped 1891a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Not needed if the layer is confined to one half of the screen. 1892a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //If rotator has been used then it has also done the flips, so ignore them. 1893a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((orient & OVERLAY_TRANSFORM_FLIP_H) && lDest != OV_INVALID 1894a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson && rDest != OV_INVALID && (*rot) == NULL) { 1895a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t new_cropR; 1896a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropR.left = tmp_cropL.left; 1897a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropR.right = new_cropR.left + (tmp_cropR.right - tmp_cropR.left); 1898a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1899a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t new_cropL; 1900a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropL.left = new_cropR.right; 1901a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson new_cropL.right = tmp_cropR.right; 1902a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1903a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL.left = new_cropL.left; 1904a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL.right = new_cropL.right; 1905a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1906a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR.left = new_cropR.left; 1907a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR.right = new_cropR.right; 1908a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1909a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1910a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1911a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 1912a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson orient = OVERLAY_TRANSFORM_0; 1913a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson transform = 0; 1914a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1915a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //configure left half 1916a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(lDest != OV_INVALID) { 1917a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson PipeArgs pargL(mdpFlagsL, whf, lz, isFg, 1918a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<eRotFlags>(rotFlags), layer->planeAlpha, 1919a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1920a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1921a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configMdp(ctx->mOverlay, pargL, orient, 1922a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropL, tmp_dstL, metadata, lDest) < 0) { 1923a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: commit failed for left half config", __FUNCTION__); 1924a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1925a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1926a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1927a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1928a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //configure right half 1929a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(rDest != OV_INVALID) { 1930a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson PipeArgs pargR(mdpFlagsR, whf, rz, isFg, 1931a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<eRotFlags>(rotFlags), 1932a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->planeAlpha, 1933a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) getBlending(layer->blending)); 1934a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configMdp(ctx->mOverlay, pargR, orient, 1935a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson tmp_cropR, tmp_dstR, metadata, rDest) < 0) { 1936a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: commit failed for right half config", __FUNCTION__); 1937a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return -1; 1938a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1939a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 1940a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1941a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return 0; 1942a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1943a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1944ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonbool canUseRotator(hwc_context_t *ctx, int dpy) { 1945ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(qdutils::MDPVersion::getInstance().is8x26() && 1946a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson isSecondaryConnected(ctx) && 1947a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause) { 1948a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* 8x26 mdss driver supports multiplexing of DMA pipe 1949a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * in LINE and BLOCK modes for writeback panels. 1950a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 1951a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY) 1952a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 1953ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1954ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(ctx->mMDP.version == qdutils::MDP_V3_0_4) 1955ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 1956ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 1957ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1958ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1959ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getLeftSplit(hwc_context_t *ctx, const int& dpy) { 1960ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Default even split for all displays with high res 1961ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int lSplit = ctx->dpyAttr[dpy].xres / 2; 1962ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY && 1963ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson qdutils::MDPVersion::getInstance().getLeftSplit()) { 1964ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Override if split published by driver for primary 1965ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson lSplit = qdutils::MDPVersion::getInstance().getLeftSplit(); 1966ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1967ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return lSplit; 1968ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1969ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1970a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isDisplaySplit(hwc_context_t* ctx, int dpy) { 1971a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->dpyAttr[dpy].xres > qdutils::MAX_DISPLAY_DIM) { 1972a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 1973ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1974a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //For testing we could split primary via device tree values 1975a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(dpy == HWC_DISPLAY_PRIMARY && 1976a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson qdutils::MDPVersion::getInstance().getRightSplit()) { 1977a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 1978ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1979a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 1980a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 1981a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 1982a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//clear prev layer prop flags and realloc for current frame 1983a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers) { 1984a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->layerProp[dpy]) { 1985a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson delete[] ctx->layerProp[dpy]; 1986a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->layerProp[dpy] = NULL; 1987ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 1988a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->layerProp[dpy] = new LayerProp[numAppLayers]; 1989ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 1990ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 1991a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson/* Since we fake non-Hybrid WFD solution as external display, this 1992a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * function helps us in determining the priority between external 1993a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * (hdmi/non-Hybrid WFD display) and virtual display devices(SSD/ 1994a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * screenrecord). This can be removed once wfd-client migrates to 1995a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * using virtual-display api's. 1996a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 1997a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool canUseMDPforVirtualDisplay(hwc_context_t* ctx, 1998a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const hwc_display_contents_1_t *list) { 1999a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2000a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson /* We rely on the fact that for pure virtual display solution 2001a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * list->outbuf will be a non-NULL handle. 2002a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * 2003a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * If there are three active displays (which means there is one 2004a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * primary, one external and one virtual active display) 2005a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * we give mdss/mdp hw resources(pipes,smp,etc) for external 2006a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * display(hdmi/non-Hybrid WFD display) rather than for virtual 2007a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * display(SSD/screenrecord) 2008a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson */ 2009a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2010a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(list->outbuf and (ctx->numActiveDisplays == HWC_NUM_DISPLAY_TYPES)) { 2011a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 2012ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2013a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2014ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 2015ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2016ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2017a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid BwcPM::setBwc(const hwc_rect_t& crop, 2018ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const hwc_rect_t& dst, const int& transform, 2019ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eMdpFlags& mdpFlags) { 2020ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Target doesnt support Bwc 2021ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!qdutils::MDPVersion::getInstance().supportsBWC()) { 2022ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 2023ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2024ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //src width > MAX mixer supported dim 2025ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((crop.right - crop.left) > qdutils::MAX_DISPLAY_DIM) { 2026ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 2027ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2028ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Decimation necessary, cannot use BWC. H/W requirement. 2029ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(qdutils::MDPVersion::getInstance().supportsDecimation()) { 2030ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int src_w = crop.right - crop.left; 2031ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int src_h = crop.bottom - crop.top; 2032ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_w = dst.right - dst.left; 2033ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dst_h = dst.bottom - dst.top; 2034ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(transform & HAL_TRANSFORM_ROT_90) { 2035ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(src_w, src_h); 2036ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2037ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float horDscale = 0.0f; 2038ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float verDscale = 0.0f; 2039ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int horzDeci = 0; 2040ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int vertDeci = 0; 2041ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::getDecimationFactor(src_w, src_h, dst_w, dst_h, horDscale, 2042ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson verDscale); 2043ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //TODO Use log2f once math.h has it 2044ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((int)horDscale) 2045ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson horzDeci = (int)(log(horDscale) / log(2)); 2046ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if((int)verDscale) 2047ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson vertDeci = (int)(log(verDscale) / log(2)); 2048ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(horzDeci || vertDeci) return; 2049ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2050ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Property 2051ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char value[PROPERTY_VALUE_MAX]; 2052ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson property_get("debug.disable.bwc", value, "0"); 2053ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(atoi(value)) return; 2054ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2055ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDSS_MDP_BWC_EN); 2056ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2057ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2058ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid LayerRotMap::add(hwc_layer_1_t* layer, Rotator *rot) { 2059ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(mCount >= MAX_SESS) return; 2060ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mLayer[mCount] = layer; 2061ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRot[mCount] = rot; 2062ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mCount++; 2063ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2064ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2065ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid LayerRotMap::reset() { 2066ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for (int i = 0; i < MAX_SESS; i++) { 2067ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mLayer[i] = 0; 2068ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRot[i] = 0; 2069ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2070ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mCount = 0; 2071ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2072ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2073a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid LayerRotMap::clear() { 2074a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson RotMgr::getInstance()->markUnusedTop(mCount); 2075a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson reset(); 2076a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 2077a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 2078ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid LayerRotMap::setReleaseFd(const int& fence) { 2079ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson for(uint32_t i = 0; i < mCount; i++) { 2080ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mRot[i]->setReleaseFd(dup(fence)); 2081ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 2082ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 2083ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 2084ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};//namespace qhwc 2085