107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* 207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* 407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* Redistribution and use in source and binary forms, with or without 507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* modification, are permitted provided that the following conditions are 607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* met: 707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* * Redistributions of source code must retain the above copyright 807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* notice, this list of conditions and the following disclaimer. 907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* * Redistributions in binary form must reproduce the above 1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* copyright notice, this list of conditions and the following 1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* disclaimer in the documentation and/or other materials provided 1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* with the distribution. 1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* * Neither the name of The Linux Foundation nor the names of its 1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* contributors may be used to endorse or promote products derived 1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* from this software without specific prior written permission. 1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* 1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani*/ 2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <stdlib.h> 3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <math.h> 3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <utils/Log.h> 3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <linux/msm_mdp.h> 3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/properties.h> 3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "gralloc_priv.h" 3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "overlayUtils.h" 3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "mdpWrapper.h" 3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "mdp_version.h" 3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <hardware/hwcomposer_defs.h> 4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// just a helper static thingy 4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace { 4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistruct IOFile { 4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani IOFile(const char* s, const char* mode) : fp(0) { 4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fp = ::fopen(s, mode); 4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!fp) { 4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("Failed open %s", s); 4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani template <class T> 5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani size_t read(T& r, size_t elem) { 5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(fp) { 5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return ::fread(&r, sizeof(T), elem, fp); 5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return 0; 5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani size_t write(const char* s, uint32_t val) { 5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(fp) { 5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return ::fprintf(fp, s, val); 6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return 0; 6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool valid() const { return fp != 0; } 6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ~IOFile() { 6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(fp) ::fclose(fp); 6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fp=0; 6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani FILE* fp; 6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace overlay { 7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//----------From class Res ------------------------------ 7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniconst char* const Res::fbPath = "/dev/graphics/fb%u"; 7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniconst char* const Res::rotPath = "/dev/msm_rotator"; 7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//-------------------------------------------------------- 7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace utils { 8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//-------------------------------------------------------- 8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Refer to graphics.h, gralloc_priv.h, msm_mdp.h 8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint getMdpFormat(int format) { 8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani switch (format) { 8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //From graphics.h 8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGBA_8888 : 8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGBA_8888; 9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGBX_8888: 9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGBX_8888; 9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGB_888: 9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGB_888; 9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGB_565: 9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGB_565; 9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_BGRA_8888: 9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_BGRA_8888; 9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_BGRX_8888: 9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_BGRX_8888; 10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YV12: 10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CR_CB_GH2V2; 10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCbCr_422_SP: 10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CBCR_H2V1; 10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCrCb_420_SP: 10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CRCB_H2V2; 10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //From gralloc_priv.h 10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CBCR_H2V2_TILE; 11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCbCr_420_SP: 11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CBCR_H2V2; 11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCrCb_422_SP: 11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CRCB_H2V1; 11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCbCr_422_I: 11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_YCBYCR_H2V1; 11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCrCb_422_I: 11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_YCRYCB_H2V1; 11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCbCr_444_SP: 11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CBCR_H1V1; 12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCrCb_444_SP: 12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CRCB_H1V1; 12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //NV12 encodeable format maps to the venus format on 12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //B-Family targets 12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_Y_CBCR_H2V2_VENUS; 12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani default: 12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Unsupported by MDP 12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //---graphics.h-------- 13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //HAL_PIXEL_FORMAT_RGBA_5551 13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //HAL_PIXEL_FORMAT_RGBA_4444 13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //---gralloc_priv.h----- 13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO = 0x7FA30C01 13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //HAL_PIXEL_FORMAT_R_8 = 0x10D 13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //HAL_PIXEL_FORMAT_RG_88 = 0x10E 13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("%s: Unsupported HAL format = 0x%x", __func__, format); 13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return -1; 13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // not reached 14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return -1; 14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// This function returns corresponding tile format 14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// MDSS support following RGB tile formats 14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// 32 bit formats 14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// 16 bit formats 14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint getMdpFormat(int format, bool tileEnabled) 14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{ 14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!tileEnabled) { 15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return getMdpFormat(format); 15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani switch (format) { 15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGBA_8888 : 15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGBA_8888_TILE; 15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGBX_8888: 15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGBX_8888_TILE; 15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_RGB_565: 15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_RGB_565_TILE; 15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_BGRA_8888: 16007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_BGRA_8888_TILE; 16107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case HAL_PIXEL_FORMAT_BGRX_8888: 16207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return MDP_BGRX_8888_TILE; 16307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani default: 16407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return getMdpFormat(format); 16507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 16607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 16707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 16807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 16907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 17007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Takes mdp format as input and translates to equivalent HAL format 17107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Refer to graphics.h, gralloc_priv.h, msm_mdp.h for formats. 17207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint getHALFormat(int mdpFormat) { 17307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani switch (mdpFormat) { 17407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //From graphics.h 17507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_RGBA_8888: 17607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_RGBA_8888; 17707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_RGBX_8888: 17807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_RGBX_8888; 17907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_RGB_888: 18007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_RGB_888; 18107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_RGB_565: 18207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_RGB_565; 18307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_BGRA_8888: 18407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_BGRA_8888; 18507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CR_CB_GH2V2: 18607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YV12; 18707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CBCR_H2V1: 18807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCbCr_422_SP; 18907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CRCB_H2V2: 19007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCrCb_420_SP; 19107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 19207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //From gralloc_priv.h 19307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CBCR_H2V2_TILE: 19407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED; 19507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CBCR_H2V2: 19607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCbCr_420_SP; 19707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CRCB_H2V1: 19807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCrCb_422_SP; 19907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_YCBYCR_H2V1: 20007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCbCr_422_I; 20107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_YCRYCB_H2V1: 20207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCrCb_422_I; 20307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CBCR_H1V1: 20407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCbCr_444_SP; 20507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CRCB_H1V1: 20607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCrCb_444_SP; 20707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani case MDP_Y_CBCR_H2V2_VENUS: 20807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS; 20907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani default: 21007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("%s: Unsupported MDP format = 0x%x", __func__, mdpFormat); 21107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return -1; 21207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 21307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // not reached 21407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return -1; 21507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 21607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 21707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint getMdpOrient(eTransform rotation) { 21807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int retTrans = 0; 21907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool trans90 = false; 22007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion(); 22107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool aFamily = (mdpVersion < qdutils::MDSS_V5); 22207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 22307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGD_IF(DEBUG_OVERLAY, "%s: In rotation = %d", __FUNCTION__, rotation); 22407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(rotation & OVERLAY_TRANSFORM_ROT_90) { 22507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani retTrans |= MDP_ROT_90; 22607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani trans90 = true; 22707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 22807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 22907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(rotation & OVERLAY_TRANSFORM_FLIP_H) { 23007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(trans90 && aFamily) { 23107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Swap for a-family, since its driver does 90 first 23207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani retTrans |= MDP_FLIP_UD; 23307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 23407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani retTrans |= MDP_FLIP_LR; 23507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 23607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 23707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 23807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(rotation & OVERLAY_TRANSFORM_FLIP_V) { 23907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(trans90 && aFamily) { 24007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Swap for a-family, since its driver does 90 first 24107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani retTrans |= MDP_FLIP_LR; 24207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 24307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani retTrans |= MDP_FLIP_UD; 24407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 24507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 24607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 24707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGD_IF(DEBUG_OVERLAY, "%s: Out rotation = %d", __FUNCTION__, retTrans); 24807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return retTrans; 24907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 25007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 25107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDecimationFactor(const int& src_w, const int& src_h, 25207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const int& dst_w, const int& dst_h, uint8_t& horzDeci, 25307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani uint8_t& vertDeci) { 25407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani horzDeci = 0; 25507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani vertDeci = 0; 25607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani float horDscale = ceilf((float)src_w / (float)dst_w); 25707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani float verDscale = ceilf((float)src_h / (float)dst_h); 25807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani qdutils::MDPVersion& mdpHw = qdutils::MDPVersion::getInstance(); 25907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 26007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Next power of 2, if not already 26107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani horDscale = powf(2.0f, ceilf(log2f(horDscale))); 26207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani verDscale = powf(2.0f, ceilf(log2f(verDscale))); 26307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 26407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Since MDP can do downscale and has better quality, split the task 26507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //between decimator and MDP downscale 26607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani horDscale /= (float)mdpHw.getMaxMDPDownscale(); 26707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani verDscale /= (float)mdpHw.getMaxMDPDownscale(); 26807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 26907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if((int)horDscale) 27007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani horzDeci = (uint8_t)log2f(horDscale); 27107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 27207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if((int)verDscale) 27307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani vertDeci = (uint8_t)log2f(verDscale); 27407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 27507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(src_w > (int) mdpHw.getMaxMixerWidth()) { 27607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //If the client sends us something > what a layer mixer supports 27707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //then it means it doesn't want to use split-pipe but wants us to 27807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //decimate. A minimum decimation of 2 will ensure that the width is 27907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //always within layer mixer limits. 28007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(horzDeci < 2) 28107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani horzDeci = 2; 28207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 28307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 28407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 28507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistatic inline int compute(const uint32_t& x, const uint32_t& y, 28607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const uint32_t& z) { 28707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return x - ( y + z ); 28807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 28907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 29007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid preRotateSource(const eTransform& tr, Whf& whf, Dim& srcCrop) { 29107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(tr & OVERLAY_TRANSFORM_FLIP_H) { 29207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani srcCrop.x = compute(whf.w, srcCrop.x, srcCrop.w); 29307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 29407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(tr & OVERLAY_TRANSFORM_FLIP_V) { 29507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani srcCrop.y = compute(whf.h, srcCrop.y, srcCrop.h); 29607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 29707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(tr & OVERLAY_TRANSFORM_ROT_90) { 29807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int tmp = srcCrop.x; 29907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani srcCrop.x = compute(whf.h, 30007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani srcCrop.y, 30107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani srcCrop.h); 30207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani srcCrop.y = tmp; 30307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani swap(whf.w, whf.h); 30407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani swap(srcCrop.w, srcCrop.h); 30507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 30607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 30707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 30807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 30907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const mdp_overlay& ov) { 31007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str[256] = {'\0'}; 31107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str, 256, 31207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "%s id=%d z=%d alpha=%d mask=%d flags=0x%x H.Deci=%d," 31307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "V.Deci=%d\n", 31407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, ov.id, ov.z_order, ov.alpha, 31507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ov.transp_mask, ov.flags, ov.horz_deci, ov.vert_deci); 31607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str, len); 31707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tsrc", ov.src); 31807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tsrc_rect", ov.src_rect); 31907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tdst_rect", ov.dst_rect); 32007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 32107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 32207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 32307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const msmfb_img& ov) { 32407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str_src[256] = {'\0'}; 32507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str_src, 256, 32607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "%s w=%d h=%d format=%d %s\n", 32707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, ov.width, ov.height, ov.format, 32807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani overlay::utils::getFormatString(ov.format)); 32907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str_src, len); 33007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 33107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 33207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 33307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const mdp_rect& ov) { 33407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str_rect[256] = {'\0'}; 33507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str_rect, 256, 33607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "%s x=%d y=%d w=%d h=%d\n", 33707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, ov.x, ov.y, ov.w, ov.h); 33807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str_rect, len); 33907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 34007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 34107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 34207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const msmfb_overlay_data& ov) { 34307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str[256] = {'\0'}; 34407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str, 256, 34507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "%s id=%d\n", 34607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, ov.id); 34707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str, len); 34807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tdata", ov.data); 34907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 35007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 35107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 35207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const msmfb_data& ov) { 35307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str_data[256] = {'\0'}; 35407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str_data, 256, 35507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "%s offset=%d memid=%d id=%d flags=0x%x\n", 35607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, ov.offset, ov.memory_id, ov.id, ov.flags); 35707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str_data, len); 35807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 35907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 36007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 36107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const msm_rotator_img_info& rot) { 36207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str[256] = {'\0'}; 36307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str, 256, "%s sessid=%u rot=%d, enable=%d downscale=%d\n", 36407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, rot.session_id, rot.rotations, rot.enable, 36507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani rot.downscale_ratio); 36607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str, len); 36707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tsrc", rot.src); 36807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tdst", rot.dst); 36907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tsrc_rect", rot.src_rect); 37007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 37107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 37207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getDump(char *buf, size_t len, const char *prefix, 37307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const msm_rotator_data_info& rot) { 37407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char str[256] = {'\0'}; 37507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(str, 256, 37607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "%s sessid=%u\n", 37707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani prefix, rot.session_id); 37807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlcat(buf, str, len); 37907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tsrc", rot.src); 38007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani getDump(buf, len, "\tdst", rot.dst); 38107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 38207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 38307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Helper to even out x,w and y,h pairs 38407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//x,y are always evened to ceil and w,h are evened to floor 38507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid normalizeCrop(uint32_t& xy, uint32_t& wh) { 38607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(xy & 1) { 38707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani even_ceil(xy); 38807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(wh & 1) 38907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani even_floor(wh); 39007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else 39107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani wh -= 2; 39207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 39307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani even_floor(wh); 39407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 39507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 39607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 39707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} // utils 39807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 39907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} // overlay 400