psb_overlay.c revision 0a86723905982451dd72a9cad792b8cb8e8528ae
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 1162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang * 12f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 1562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang * 16f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Shengquan Yuan <shengquan.yuan@intel.com> 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Binglin Chen <binglin.chen@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Jason Hu <jason.hu@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Zeng Li <zeng.li@intel.com> 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/* 32f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Most of rendering codes are ported from xf86-video-i810/src/i810_overlay.c 33bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 34bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <math.h> 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <va/va_backend.h> 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <psb_drm.h> 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drv_video.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_output.h" 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_overlay.h" 452befccec034c13d34746a9e87149889d59ac767bFei Jiang 462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#ifdef ANDROID 4754752e65b02b1a84c491e3f9c964046faeea306eKun Wang#define psb_xrandr_single_mode() 0 48bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#else 49bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangint psb_xrandr_single_mode(); 502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData 532befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 542befccec034c13d34746a9e87149889d59ac767bFei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 550da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_rotate(psb_surface) ((int) (psb_surface)->extra_info[5]) 562befccec034c13d34746a9e87149889d59ac767bFei Jiang 572befccec034c13d34746a9e87149889d59ac767bFei Jiang#ifndef VA_FOURCC_I420 582befccec034c13d34746a9e87149889d59ac767bFei Jiang#define VA_FOURCC_I420 0x30323449 592befccec034c13d34746a9e87149889d59ac767bFei Jiang#endif 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/********************************************************************************************** 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * I830ResetVideo 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Description: Use this function to reset the overlay register back buffer to its default 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * values. Note that this function does not actually apply these values. To do so, please 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * write to OVADD. 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang **********************************************************************************************/ 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoI830ResetVideo(VADriverContextP ctx, PsbPortPrivPtr pPriv) 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo long offsetA = wsbmBOOffsetHint(pPriv->wsbo[0]) & 0x0FFFFFFF; 754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo long offsetC = wsbmBOOffsetHint(pPriv->wsbo[1]) & 0x0FFFFFFF; 762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(overlayA, 0, sizeof(*overlayA)); 782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(overlayC, 0, sizeof(*overlayC)); 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCLRC1 = pPriv->saturation.Value; 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCLRC1 = pPriv->saturation.Value; 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DCLRK 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* case bit depth 16 */ 884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayA->DCLRKV = pPriv->colorKey; 892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM |= DEST_KEY_ENABLE; 902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM &= ~CONST_ALPHA_ENABLE; 91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayC->DCLRKV = pPriv->colorKey; 932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM |= DEST_KEY_ENABLE; 942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM &= ~CONST_ALPHA_ENABLE; 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM &= ~DEST_KEY_ENABLE; 972f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM &= ~DEST_KEY_ENABLE; 987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DWINSZ = 0x00000000; 1002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCONFIG = CC_OUT_8BIT; 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DWINSZ = 0x00000000; 1032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCONFIG = CC_OUT_8BIT; 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic uint32_t I830BoundGammaElt(uint32_t elt, uint32_t eltPrev) 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt &= 0xff; 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang eltPrev &= 0xff; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (elt < eltPrev) 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt = eltPrev; 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if ((elt - eltPrev) > 0x7e) 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt = eltPrev + 0x7e; 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return elt; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic uint32_t I830BoundGamma(uint32_t gamma, uint32_t gammaPrev) 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return (I830BoundGammaElt(gamma >> 24, gammaPrev >> 24) << 24 | 120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun I830BoundGammaElt(gamma >> 16, gammaPrev >> 16) << 16 | 121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun I830BoundGammaElt(gamma >> 8, gammaPrev >> 8) << 8 | 122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun I830BoundGammaElt(gamma , gammaPrev)); 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangI830UpdateGamma(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma0 = pPriv->gamma0; 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma1 = pPriv->gamma1; 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma2 = pPriv->gamma2; 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma3 = pPriv->gamma3; 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma4 = pPriv->gamma4; 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma5 = pPriv->gamma5; 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gamma1 = I830BoundGamma(gamma1, gamma0); 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gamma2 = I830BoundGamma(gamma2, gamma1); 139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gamma3 = I830BoundGamma(gamma3, gamma2); 140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gamma4 = I830BoundGamma(gamma4, gamma3); 141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gamma5 = I830BoundGamma(gamma5, gamma4); 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 1442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->is_mfld) 1452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask |= OV_REGRWBITS_OGAM_ALL | OVC_REGRWBITS_OGAM_ALL; 1462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang else 1472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask |= OV_REGRWBITS_OGAM_ALL; 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC0 = gamma0; 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC1 = gamma1; 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC2 = gamma2; 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC3 = gamma3; 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC4 = gamma4; 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC5 = gamma5; 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 157437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void I830StopVideo(VADriverContextP ctx) 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1602befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830OverlayRegPtr overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 1624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830OverlayRegPtr overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGION_EMPTY(pScrn->pScreen, &pPriv->clip); 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->subpicture_enabled) { 1702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.subpicture_disable_mask = pPriv->subpicture_enable_mask; 171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->subpicture_enabled = 0; 172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(®s, 0, sizeof(regs)); 1762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->is_mfld && psb_xrandr_single_mode() == 0) { 1782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayC_enabled) { 1794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = OVC_REGRWBITS_OVADD; 180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18254752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayC->DWINSZ = 0x00000000; 1834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayC->OCMD &= ~OVERLAY_ENABLE; 1844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = 0; 1852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OVC_REGRWBITS_OVADD; 18662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.b_wait_vblank = 1; 187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(®s, 0, sizeof(regs)); 1904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayC_enabled = 0; 1912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayA_enabled) { 193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun regs.overlay_read_mask = OV_REGRWBITS_OVADD; 194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 19654752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayA->DWINSZ = 0x00000000; 1974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayA->OCMD &= ~OVERLAY_ENABLE; 1984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = 0; 1994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_write_mask = OV_REGRWBITS_OVADD; 20062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.b_wait_vblank = 1; 201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 2024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayA_enabled = 0; 2032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 2042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } else { 20554752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.overlay_read_mask = OV_REGRWBITS_OVADD; 20654752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 20754752e65b02b1a84c491e3f9c964046faeea306eKun Wang 20854752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayA->DWINSZ = 0x00000000; 20954752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayA->OCMD &= ~OVERLAY_ENABLE; 21054752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.overlay_read_mask = 0; 2112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 21262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.b_wait_vblank = 1; 2132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 21454752e65b02b1a84c491e3f9c964046faeea306eKun Wang pPriv->overlayA_enabled = 0; 2152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void I830SwitchPipe(VADriverContextP ctx , int overlayId, int pipeId) 2194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 2204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 2214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 2224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830OverlayRegPtr overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]); 2234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo struct drm_psb_register_rw_arg regs; 2244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t overlay_mask; 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((overlayId == OVERLAY_A) && pPriv->overlayA_enabled) 2274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay_mask = OV_REGRWBITS_OVADD; 2284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if ((overlayId == OVERLAY_C) && pPriv->overlayC_enabled) 2294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay_mask = OVC_REGRWBITS_OVADD; 2304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 2314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return; /*No overlay enabled, do nothing.*/ 2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 233f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb__information_message("Overlay %d switch to pipe %d\n", overlayId, pipeId); 2344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(®s, 0, sizeof(regs)); 2354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(overlay, 0, sizeof(*overlay)); 2364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCLRC1 = pPriv->saturation.Value; 2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* case bit depth 16 */ 2404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DCLRKV = pPriv->colorKey; 2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DCLRKM |= DEST_KEY_ENABLE; 242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->DCLRKM &= ~CONST_ALPHA_ENABLE; 2434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DWINSZ = 0x00000000; 2444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCONFIG = CC_OUT_8BIT; 2454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = overlay_mask; 2474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 2484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (pipeId) { 2504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case PIPEA: 251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_A; 2524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case PIPEB: 254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_B; 2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case PIPEC: 2574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCONFIG |= OVERLAY_C_PIPE_C; 2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 2604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = 0; 2614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_write_mask = overlay_mask; 2624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay.b_wait_vblank = 1; 2634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 2644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 2654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuni830_swidth(unsigned int offset, unsigned int width, unsigned int mask, int shift) 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int swidth = ((offset + width + mask) >> shift) - (offset >> shift); 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 1; 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth -= 1; 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return swidth << 2; 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic Bool 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangSetCoeffRegs(double *coeff, int mantSize, coeffPtr pCoeff, int pos) 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int maxVal, icoeff, res; 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int sign; 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double c; 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sign = 0; 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang maxVal = 1 << mantSize; 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang c = *coeff; 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (c < 0.0) { 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sign = 1; 2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang c = -c; 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang res = 12 - mantSize; 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 3; 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(4 * maxVal); 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 2; 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(2 * maxVal); 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 1; 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(maxVal); 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 0; 3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(maxVal / 2); 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Coeff out of range */ 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return FALSE; 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].sign = sign; 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sign) 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = -(*coeff); 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return TRUE; 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangUpdateCoeff(int taps, double fCutoff, Bool isHoriz, Bool isY, coeffPtr pCoeff) 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i, j, j1, num, pos, mantSize; 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double pi = 3.1415926535, val, sinc, window, sum; 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double diff; 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int tapAdjust[MAX_TAPS], tap2Fix; 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool isVertAndUV; 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (isHoriz) 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mantSize = 7; 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mantSize = 6; 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang isVertAndUV = !isHoriz && !isY; 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang num = taps * 16; 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < num * 2; i++) { 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val == 0.0) 3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sinc = 1.0; 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sinc = sin(val) / val; 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Hamming window */ 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang window = (0.5 - 0.5 * cos(i * pi / num)); 3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rawCoeff[i] = sinc * window; 3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Normalise the coefficients. */ 3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i + j * 32; 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += rawCoeff[pos]; 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i + j * 32; 3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffs[i][j] = rawCoeff[pos] / sum; 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Set the register values. */ 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = j + i * taps; 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((j == (taps - 1) / 2) && !isVertAndUV) 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[0] = (taps - 1) / 2; 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[j1] = tapAdjust[0] - j; 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[++j1] = tapAdjust[0] + j; 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Adjust the coefficients. */ 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += coeffs[i][j]; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sum != 1.0) { 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j1 = 0; j1 < taps; j1++) { 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tap2Fix = tapAdjust[j1]; 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang diff = 1.0 - sum; 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffs[i][tap2Fix] += diff; 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = tap2Fix + i * taps; 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += coeffs[i][j]; 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sum == 1.0) 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 400437b3eda28a4bf098efa80598cab67f190275266Fei Jiangi830_display_video( 401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, PsbPortPrivPtr pPriv, VASurfaceID surface, 402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int id, short width, short height, 403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int dstPitch, int srcPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox, 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun short src_w, short src_h, short drw_w, short drw_h, 4052f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int flags, int overlayId, int pipeId) 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int swidth, swidthy, swidthuv; 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int mask, shift, offsety, offsetu; 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int tmp; 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t OCMD; 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool scaleChanged = FALSE; 4132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int offset = wsbmBOOffsetHint(pPriv->wsbo[overlayId]) & 0x0FFFFFFF; 4142f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]); 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 416f91c8768670386683a281cc39141e21bdda9c97fKun Wang int i32EnableIEP = 0; 417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i32EnableIEPBLE = 0; 4185b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 4195b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang /*before enabling overlay, make sure overlay is disabled first.*/ 4205b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang if ((overlayId == OVERLAY_A) && !pPriv->overlayA_enabled) { 4215b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang memset(®s, 0, sizeof(regs)); 4225b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang regs.overlay_read_mask = OV_REGRWBITS_OVADD; 4235b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 4245b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 4255b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang overlay->OCMD &= ~OVERLAY_ENABLE; 4265b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang regs.overlay_read_mask = 0; 4275b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 4285b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 4295b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang } 4305b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* FIXME: don't know who and why add this 432437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * comment it for full screen scale issue 433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * any concern contact qiang.miao@intel.com 434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (drw_w >= 800) { 437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x2 = x2 / 4; 438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun y2 = y2 / 4; 439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = dstBox->x2 / 4; 440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = dstBox->y2 / 4; 441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = drw_w / 4; 442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = drw_h / 4; 443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->DCLRKM &= ~CONST_ALPHA_ENABLE; 4462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->subpicture_enabled) 4472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->DCLRKM &= ~DEST_KEY_ENABLE; 4482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang else 449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->DCLRKM |= DEST_KEY_ENABLE; 4502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DCLRKV = pPriv->colorKey; 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_ROTATION_FUNC 453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((pipeId == PIPEA) && (driver_data->mipi0_rotation != VA_ROTATION_NONE)) || 45454752e65b02b1a84c491e3f9c964046faeea306eKun Wang ((pipeId == PIPEB) && (driver_data->hdmi_rotation != VA_ROTATION_NONE))) { 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (pPriv->rotation) { 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_NONE: 457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_270: 459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = dstBox->y1; 461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = pPriv->height_save - tmp; 462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x2; 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = dstBox->y2; 464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = pPriv->height_save - tmp; 465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->y1; 466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = dstBox->y2; 467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = tmp; 468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = drw_w; 469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = drw_h; 470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = tmp; 471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_180: 473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = pPriv->width_save - dstBox->x2; 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = pPriv->width_save - tmp; 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->y1; 477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = pPriv->height_save - dstBox->y2; 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = pPriv->height_save - tmp; 479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_90: 481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = pPriv->width_save - dstBox->y1; 483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = tmp; 484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x2; 485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = pPriv->width_save - dstBox->y2; 486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = tmp; 487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = dstBox->x2; 489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = tmp; 490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = drw_w; 491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = drw_h; 492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = tmp; 493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->oneLineMode) { 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* change the coordinates with panel fitting active */ 5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = (((dstBox->y1 - 1) * pPriv->scaleRatio) >> 16) + 1; 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = ((dstBox->y2 * pPriv->scaleRatio) >> 16) + 1; 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now, alter the height, so we scale to the correct size */ 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h = ((drw_h * pPriv->scaleRatio) >> 16) + 1; 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang shift = 6; 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mask = 0x3f; 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->curBuf == 0) { 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsety = pPriv->YBuf0offset; 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsetu = pPriv->UBuf0offset; 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsety = pPriv->YBuf1offset; 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsetu = pPriv->UBuf1offset; 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (id) { 519affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->SWIDTH = width | ((width / 2 & 0x7ff) << 16); 521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthy = i830_swidth(offsety, width, mask, shift); 522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthuv = i830_swidth(offsetu, width / 2, mask, shift); 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = (swidthy) | (swidthuv << 16); 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height | ((height / 2) << 16); 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 526affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 527affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->SWIDTH = width | ((width / 2 & 0x7ff) << 16); 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthy = i830_swidth(offsety, width, mask, shift); 530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthuv = i830_swidth(offsetu, width / 2, mask, shift); 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = (swidthy) | (swidthuv << 16); 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height | ((height / 2) << 16); 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 534affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 535affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTH = width; 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth = ((offsety + (width << 1) + mask) >> shift) - 539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (offsety >> shift); 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 1; 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth -= 1; 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 2; 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = swidth; 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height; 5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->DWINPOS = (dstBox->y1 << 16) | dstBox->x1; 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->DWINSZ = (((dstBox->y2 - dstBox->y1) << 16) | 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (dstBox->x2 - dstBox->x1)); 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* buffer locations */ 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0Y = pPriv->YBuf0offset; 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0U = pPriv->UBuf0offset; 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0V = pPriv->VBuf0offset; 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1Y = pPriv->YBuf1offset; 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1U = pPriv->UBuf1offset; 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1V = pPriv->VBuf1offset; 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Calculate horizontal and vertical scaling factors and polyphase 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * coefficients. 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 568437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (1) { 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int xscaleIntUV, xscaleFractUV; 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int yscaleIntUV, yscaleFractUV; 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* UV is half the size of Y -- YUV420 */ 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int uvratio = 2; 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t newval; 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i, j, pos; 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int deinterlace_factor; 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Y down-scale factor as a multiple of 4096. 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((id == VA_FOURCC_NV12) && (0 != (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD)))) 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deinterlace_factor = 2; 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deinterlace_factor = 1; 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* deinterlace requires twice of VSCALE setting*/ 589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (src_w == drw_w && src_h == drw_h) { 590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun xscaleFract = 1 << 12; 591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun yscaleFract = (1 << 12) / deinterlace_factor; 592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = ((src_w - 1) << 12) / drw_w; 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = ((src_h - 1) << 12) / (deinterlace_factor * drw_h); 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Calculate the UV scaling factor. */ 5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFractUV = xscaleFract / uvratio; 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFractUV = yscaleFract / uvratio; 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * To keep the relative Y and UV ratios exact, round the Y scales 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * to a multiple of the Y/UV ratio. 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = xscaleFractUV * uvratio; 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = yscaleFractUV * uvratio; 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Integer (un-multiplied) values. */ 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleInt = xscaleFract >> 12; 6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleInt = yscaleFract >> 12; 6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleIntUV = xscaleFractUV >> 12; 6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleIntUV = yscaleFractUV >> 12; 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* shouldn't get here */ 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (xscaleInt > 7) { 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* shouldn't get here */ 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (xscaleIntUV > 7) { 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) 626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleInt << 15) | 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 628437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 629437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleInt << 16) | 630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 631437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->YRGBSCALE) { 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->YRGBSCALE = newval; 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) 638437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((yscaleFractUV & 0xFFF) << 20); 640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleIntUV << 16) | ((xscaleFractUV & 0xFFF) << 3) | 642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((yscaleFractUV & 0xFFF) << 20); 643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->UVSCALE) { 6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UVSCALE = newval; 6477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang newval = yscaleInt << 16 | yscaleIntUV; 6507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->UVSCALEV) { 6517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 6527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UVSCALEV = newval; 6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Recalculate coefficients if the scaling changed. */ 6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only Horizontal coefficients so far. 6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (scaleChanged) { 6617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double fCutoffY; 6627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double fCutoffUV; 6637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = xscaleFract / 4096.0; 6657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = xscaleFractUV / 4096.0; 6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Limit to between 1.0 and 3.0. */ 6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffY < MIN_CUTOFF_FREQ) 6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = MIN_CUTOFF_FREQ; 6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffY > MAX_CUTOFF_FREQ) 6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = MAX_CUTOFF_FREQ; 6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffUV < MIN_CUTOFF_FREQ) 6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = MIN_CUTOFF_FREQ; 6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffUV > MAX_CUTOFF_FREQ) 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = MAX_CUTOFF_FREQ; 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UpdateCoeff(N_HORIZ_Y_TAPS, fCutoffY, TRUE, TRUE, xcoeffY); 6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UpdateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, TRUE, FALSE, xcoeffUV); 6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i * N_HORIZ_Y_TAPS + j; 6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->Y_HCOEFS[pos] = (xcoeffY[pos].sign << 15 | 6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffY[pos].exponent << 12 | 6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffY[pos].mantissa); 6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 6907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i * N_HORIZ_UV_TAPS + j; 6917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UV_HCOEFS[pos] = (xcoeffUV[pos].sign << 15 | 6927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffUV[pos].exponent << 12 | 6937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffUV[pos].mantissa); 6947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD = OVERLAY_ENABLE; 7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (id) { 702affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = dstPitch | (dstPitch << 16); 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= NV12;//in the spec, there are two NV12, which to use? 7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 708affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 709affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* set UV vertical phase to -0.25 */ 711437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* overlay->UV_VPH = 0x30003000; */ 7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = (dstPitch * 2) | (dstPitch << 16); 7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= YUV_420; 7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 717affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 718affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = dstPitch; 7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= YUV_422; 7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 723affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang if (id == VA_FOURCC_UYVY) 7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= Y_SWAP; 7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD)) { 729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD |= BUF_TYPE_FIELD; 730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD &= ~FIELD_SELECT; 731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (flags & VA_BOTTOM_FIELD) { 733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD |= FIELD1; 734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_0Y = pPriv->YBuf0offset - srcPitch; 735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_0U = pPriv->UBuf0offset - srcPitch; 736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_0V = pPriv->VBuf0offset - srcPitch; 737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_1Y = pPriv->YBuf1offset - srcPitch; 738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_1U = pPriv->UBuf1offset - srcPitch; 739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_1V = pPriv->VBuf1offset - srcPitch; 740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD |= FIELD0; 742437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else { 743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD &= ~(FIELD_SELECT); 744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD &= ~BUF_TYPE_FIELD; 7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~(BUFFER_SELECT); 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->curBuf == 0) 7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= BUFFER0; 7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= BUFFER1; 7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OCMD = OCMD; 7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (overlayId) { 7582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case OVERLAY_A: 7592f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 1; 7602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 7612f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case OVERLAY_C: 7632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 1; 7642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OVC_REGRWBITS_OVADD; 7652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 7672befccec034c13d34746a9e87149889d59ac767bFei Jiang 768dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) { 76962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang i32EnableIEP = 0; 770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 77162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang i32EnableIEPBLE = 0; 7722befccec034c13d34746a9e87149889d59ac767bFei Jiang 7732befccec034c13d34746a9e87149889d59ac767bFei Jiang if (i32EnableIEP == 0) { 7742befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG = CC_OUT_8BIT; 7752befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG &= OVERLAY_C_PIPE_A | (~OVERLAY_C_PIPE_MASK); 7762befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; 7772befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.OVADD = offset | 1; 7782befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.IEP_ENABLED = 0; 77962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.buffer_handle = wsbmKBufHandle(wsbmKBuf(pPriv->wsbo[overlayId])); 78062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 782643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang overlay->OCONFIG = CC_OUT_8BIT; 783643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; 784643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang regs.overlay.OVADD = offset | 1; 785643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 7862befccec034c13d34746a9e87149889d59ac767bFei Jiang 787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) { 788dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (pipeId) { 7892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case PIPEA: 790dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_A; 791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= ZORDER_TOP; 7922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 793dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case PIPEB: 794dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_B; 7952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 7962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD |= 0x80; 7972f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case PIPEC: 7992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= OVERLAY_C_PIPE_C; 800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= ZORDER_TOP; 8012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD |= 0x40; 8022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 8032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 8042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 8062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= pipeId << 18; /* mrst */ 8072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 8092befccec034c13d34746a9e87149889d59ac767bFei Jiang 810dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) { 811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (regs.overlay.IEP_ENABLED) { 812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0 813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun printf("regs.overlay BLE minmax 0x%x, BSSCC control 0x%x\n", 814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun regs.overlay.IEP_BLE_MINMAX, regs.overlay.IEP_BSSCC_CONTROL); 815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *(unsigned int *)((unsigned int)&(overlay->IEP_SPACE[0]) + 0x804) = regs.overlay.IEP_BLE_MINMAX; 8172befccec034c13d34746a9e87149889d59ac767bFei Jiang } 8182befccec034c13d34746a9e87149889d59ac767bFei Jiang } 8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8210da1930627209986e8db220799a690f816494401Austin Yuan 8220da1930627209986e8db220799a690f816494401Austin Yuanstatic void I830PutImageFlipRotateSurface( 8230da1930627209986e8db220799a690f816494401Austin Yuan VADriverContextP ctx, 8245b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang object_surface_p obj_surface, 8250da1930627209986e8db220799a690f816494401Austin Yuan int *src_w_new, int *src_h_new, 8260da1930627209986e8db220799a690f816494401Austin Yuan int *width_new, int *height_new, 8270da1930627209986e8db220799a690f816494401Austin Yuan psb_surface_p *psb_surface_new, 8280da1930627209986e8db220799a690f816494401Austin Yuan int pipeId) 8290da1930627209986e8db220799a690f816494401Austin Yuan{ 8300da1930627209986e8db220799a690f816494401Austin Yuan int src_w = *src_w_new, src_h = *src_h_new; 8310da1930627209986e8db220799a690f816494401Austin Yuan int width = *width_new, height = *height_new; 8320da1930627209986e8db220799a690f816494401Austin Yuan int tmp = 0; 8335b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 8340da1930627209986e8db220799a690f816494401Austin Yuan psb_surface_p psb_surface = NULL; 8350da1930627209986e8db220799a690f816494401Austin Yuan INIT_DRIVER_DATA; 8360da1930627209986e8db220799a690f816494401Austin Yuan PsbPortPrivPtr pPriv; 8370da1930627209986e8db220799a690f816494401Austin Yuan 8384338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /* local/extend display doesn't have render rotation */ 83962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (((pipeId == PIPEA) && (driver_data->local_rotation == VA_ROTATION_NONE)) || 8405b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang ((pipeId == PIPEB) && (driver_data->extend_rotation == VA_ROTATION_NONE))) 8410da1930627209986e8db220799a690f816494401Austin Yuan return; 8420da1930627209986e8db220799a690f816494401Austin Yuan 8430da1930627209986e8db220799a690f816494401Austin Yuan pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 8445b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 8450da1930627209986e8db220799a690f816494401Austin Yuan if (pipeId == PIPEA) { 8460da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->local_rotation != VA_ROTATION_NONE) { 8470da1930627209986e8db220799a690f816494401Austin Yuan psb_surface = obj_surface->psb_surface_rotate; 8480da1930627209986e8db220799a690f816494401Austin Yuan width = obj_surface->width_r; 8490da1930627209986e8db220799a690f816494401Austin Yuan height = obj_surface->height_r; 8500da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->local_rotation != VA_ROTATION_180) { 8510da1930627209986e8db220799a690f816494401Austin Yuan tmp = src_w; 8520da1930627209986e8db220799a690f816494401Austin Yuan src_w = src_h; 8530da1930627209986e8db220799a690f816494401Austin Yuan src_h = tmp; 8540da1930627209986e8db220799a690f816494401Austin Yuan } 8550da1930627209986e8db220799a690f816494401Austin Yuan } 856f91c8768670386683a281cc39141e21bdda9c97fKun Wang if ((driver_data->local_rotation == VA_ROTATION_NONE) || 857f91c8768670386683a281cc39141e21bdda9c97fKun Wang (driver_data->local_rotation == VA_ROTATION_180)) { 8580da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->display_width; 8590da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->display_height; 8600da1930627209986e8db220799a690f816494401Austin Yuan } else { 8610da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->display_height; 8620da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->display_width; 8630da1930627209986e8db220799a690f816494401Austin Yuan } 864f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->is_android == 0) 865f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = driver_data->local_rotation; 866f91c8768670386683a281cc39141e21bdda9c97fKun Wang else 867f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = 0; 8680da1930627209986e8db220799a690f816494401Austin Yuan } else if (pipeId == PIPEB) { 8690da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->extend_rotation != VA_ROTATION_NONE) { 8700da1930627209986e8db220799a690f816494401Austin Yuan psb_surface = obj_surface->psb_surface_rotate; 8710da1930627209986e8db220799a690f816494401Austin Yuan width = obj_surface->width_r; 8720da1930627209986e8db220799a690f816494401Austin Yuan height = obj_surface->height_r; 8730da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->extend_rotation != VA_ROTATION_180) { 8740da1930627209986e8db220799a690f816494401Austin Yuan tmp = src_w; 8750da1930627209986e8db220799a690f816494401Austin Yuan src_w = src_h; 8760da1930627209986e8db220799a690f816494401Austin Yuan src_h = tmp; 8770da1930627209986e8db220799a690f816494401Austin Yuan } 8780da1930627209986e8db220799a690f816494401Austin Yuan } 879f91c8768670386683a281cc39141e21bdda9c97fKun Wang if ((driver_data->extend_rotation == VA_ROTATION_NONE) || 880f91c8768670386683a281cc39141e21bdda9c97fKun Wang (driver_data->extend_rotation == VA_ROTATION_180)) { 8810da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->extend_display_width; 8820da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->extend_display_height; 8830da1930627209986e8db220799a690f816494401Austin Yuan } else { 8840da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->extend_display_height; 8850da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->extend_display_width; 8860da1930627209986e8db220799a690f816494401Austin Yuan } 887f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->is_android == 0) 888f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = driver_data->extend_rotation; 889f91c8768670386683a281cc39141e21bdda9c97fKun Wang else 890f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = 0; 8910da1930627209986e8db220799a690f816494401Austin Yuan } 8920da1930627209986e8db220799a690f816494401Austin Yuan 8930da1930627209986e8db220799a690f816494401Austin Yuan *src_w_new = src_w; 8940da1930627209986e8db220799a690f816494401Austin Yuan *src_h_new = src_h; 8950da1930627209986e8db220799a690f816494401Austin Yuan *width_new = width; 8960da1930627209986e8db220799a690f816494401Austin Yuan *height_new = height; 8970da1930627209986e8db220799a690f816494401Austin Yuan *psb_surface_new = psb_surface; 8980da1930627209986e8db220799a690f816494401Austin Yuan} 8990da1930627209986e8db220799a690f816494401Austin Yuan 9000da1930627209986e8db220799a690f816494401Austin Yuan 9010da1930627209986e8db220799a690f816494401Austin Yuanstatic void I830PutImageFlipRotateDebug( 9020da1930627209986e8db220799a690f816494401Austin Yuan VADriverContextP ctx, 9030da1930627209986e8db220799a690f816494401Austin Yuan VASurfaceID surface, 9040da1930627209986e8db220799a690f816494401Austin Yuan short src_x, short src_y, 9050da1930627209986e8db220799a690f816494401Austin Yuan short src_w, short src_h, 9060da1930627209986e8db220799a690f816494401Austin Yuan short drw_x, short drw_y, 9070da1930627209986e8db220799a690f816494401Austin Yuan short drw_w, short drw_h, 9080da1930627209986e8db220799a690f816494401Austin Yuan int fourcc, int flags, 9090da1930627209986e8db220799a690f816494401Austin Yuan int overlayId, 9100da1930627209986e8db220799a690f816494401Austin Yuan int pipeId) 9110da1930627209986e8db220799a690f816494401Austin Yuan{ 9120da1930627209986e8db220799a690f816494401Austin Yuan INIT_DRIVER_DATA; 9130da1930627209986e8db220799a690f816494401Austin Yuan object_surface_p obj_surface = SURFACE(surface); 9140da1930627209986e8db220799a690f816494401Austin Yuan psb_surface_p psb_surface = NULL; 9150da1930627209986e8db220799a690f816494401Austin Yuan 9160da1930627209986e8db220799a690f816494401Austin Yuan if (pipeId != 0) 9170da1930627209986e8db220799a690f816494401Austin Yuan return; 9185b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 9190da1930627209986e8db220799a690f816494401Austin Yuan psb_surface = obj_surface->psb_surface_rotate; 9200da1930627209986e8db220799a690f816494401Austin Yuan psb_buffer_p buf = &psb_surface->buf; 9210da1930627209986e8db220799a690f816494401Austin Yuan unsigned char *data, *chroma, *buffer, *header; 9220da1930627209986e8db220799a690f816494401Austin Yuan static FILE *pf = NULL; 9230da1930627209986e8db220799a690f816494401Austin Yuan int ret, i; 9240da1930627209986e8db220799a690f816494401Austin Yuan if (!psb_surface) 9250da1930627209986e8db220799a690f816494401Austin Yuan goto dump_out; 9260da1930627209986e8db220799a690f816494401Austin Yuan if (pf == NULL) 9270da1930627209986e8db220799a690f816494401Austin Yuan if ((pf = fopen("/home/dump.yuv", "w+")) == NULL) 9280da1930627209986e8db220799a690f816494401Austin Yuan printf("Open yuv file fails\n"); 9290da1930627209986e8db220799a690f816494401Austin Yuan 9300da1930627209986e8db220799a690f816494401Austin Yuan ret = psb_buffer_map(buf, &data); 9310da1930627209986e8db220799a690f816494401Austin Yuan 9320da1930627209986e8db220799a690f816494401Austin Yuan if (ret) 9330da1930627209986e8db220799a690f816494401Austin Yuan printf("Map buffer fail\n"); 9340da1930627209986e8db220799a690f816494401Austin Yuan 9350da1930627209986e8db220799a690f816494401Austin Yuan for (i = 0; i < obj_surface->height_r; i++) { 9360da1930627209986e8db220799a690f816494401Austin Yuan fwrite(data, 1, obj_surface->width_r, pf); 9370da1930627209986e8db220799a690f816494401Austin Yuan data += psb_surface->stride; 9380da1930627209986e8db220799a690f816494401Austin Yuan } 9390da1930627209986e8db220799a690f816494401Austin Yuan 9400da1930627209986e8db220799a690f816494401Austin Yuan buffer = malloc(obj_surface->height_r * obj_surface->width_r); 9410da1930627209986e8db220799a690f816494401Austin Yuan if (!buffer) 9420da1930627209986e8db220799a690f816494401Austin Yuan printf("Alloc chroma buffer fail\n"); 9430da1930627209986e8db220799a690f816494401Austin Yuan 9440da1930627209986e8db220799a690f816494401Austin Yuan header = buffer; 9450da1930627209986e8db220799a690f816494401Austin Yuan chroma = data; 9460da1930627209986e8db220799a690f816494401Austin Yuan for (i = 0; i < obj_surface->height_r / 2; i++) { 9470da1930627209986e8db220799a690f816494401Austin Yuan int j; 9480da1930627209986e8db220799a690f816494401Austin Yuan for (j = 0; j < obj_surface->width_r / 2; j++) { 9490da1930627209986e8db220799a690f816494401Austin Yuan *buffer++ = data[j*2]; 9500da1930627209986e8db220799a690f816494401Austin Yuan } 9510da1930627209986e8db220799a690f816494401Austin Yuan data += psb_surface->stride; 9520da1930627209986e8db220799a690f816494401Austin Yuan } 9530da1930627209986e8db220799a690f816494401Austin Yuan 9540da1930627209986e8db220799a690f816494401Austin Yuan data = chroma; 9550da1930627209986e8db220799a690f816494401Austin Yuan for (i = 0; i < obj_surface->height_r / 2; i++) { 9560da1930627209986e8db220799a690f816494401Austin Yuan int j; 9570da1930627209986e8db220799a690f816494401Austin Yuan for (j = 0; j < obj_surface->width_r / 2; j++) { 9580da1930627209986e8db220799a690f816494401Austin Yuan *buffer++ = data[j*2 + 1]; 9590da1930627209986e8db220799a690f816494401Austin Yuan } 9600da1930627209986e8db220799a690f816494401Austin Yuan data += psb_surface->stride; 9610da1930627209986e8db220799a690f816494401Austin Yuan } 9620da1930627209986e8db220799a690f816494401Austin Yuan 9630da1930627209986e8db220799a690f816494401Austin Yuan fwrite(header, obj_surface->height_r / 2, obj_surface->width_r, pf); 9640da1930627209986e8db220799a690f816494401Austin Yuan free(header); 9650da1930627209986e8db220799a690f816494401Austin Yuan psb_buffer_unmap(buf); 9665b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wangdump_out: 9670da1930627209986e8db220799a690f816494401Austin Yuan ; 9680da1930627209986e8db220799a690f816494401Austin Yuan} 9690da1930627209986e8db220799a690f816494401Austin Yuan 9700da1930627209986e8db220799a690f816494401Austin Yuan 9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h). 9737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h). 9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * id is a fourcc code for the format of the video. 9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buf is the pointer to the source data in system memory. 9767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * width and height are the w/h of the source data. 9777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * If "sync" is TRUE, then we must be finished with *buf at the point of return 9787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * (which we always are). 9797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * clipBoxes is the clipping region in screen space. 9807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * data is a pointer to our port private. 9817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * pDraw is a Drawable, which might not be the screen in the case of 9827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * compositing. It's a new argument to the function in the 1.1 server. 9837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 984437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int I830PutImage( 985437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 9870da1930627209986e8db220799a690f816494401Austin Yuan int src_x, int src_y, 9880da1930627209986e8db220799a690f816494401Austin Yuan int src_w, int src_h, 9890da1930627209986e8db220799a690f816494401Austin Yuan int drw_x, int drw_y, 9900da1930627209986e8db220799a690f816494401Austin Yuan int drw_w, int drw_h, 991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int fourcc, int flags, 992dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int overlayId, 9932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int pipeId) 9947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 9967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int x1, x2, y1, y2; 9977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int width, height; 998437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int top, left, npixels; 999437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int pitch = 0, pitch2 = 0; 1000437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int pre_add; 1001437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int gtt_ofs; 1002437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct _WsbmBufferObject *drm_buf; 10037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BoxRec dstBox; 10047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbPortPrivPtr pPriv; 1005437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 10062befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface_p psb_surface = NULL; 1007437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10082befccec034c13d34746a9e87149889d59ac767bFei Jiang /* silent kw */ 10092befccec034c13d34746a9e87149889d59ac767bFei Jiang if (NULL == obj_surface) 1010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 1; 10112befccec034c13d34746a9e87149889d59ac767bFei Jiang 10122befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1014437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (fourcc) { 1015437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VA_FOURCC_NV12: 1016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun width = obj_surface->width; 1017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun height = obj_surface->height; 1018437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 1019437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun width = obj_surface->width; 1021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun height = obj_surface->height; 1022437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* rotate support here: more check? 1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * and for oold also? 1027dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 1028dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_surface = obj_surface->psb_surface; 10290da1930627209986e8db220799a690f816494401Austin Yuan I830PutImageFlipRotateSurface(ctx, obj_surface, 10300da1930627209986e8db220799a690f816494401Austin Yuan &src_w, &src_h, &width, &height, 10310da1930627209986e8db220799a690f816494401Austin Yuan &psb_surface, pipeId); 1032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10330a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang if ((pipeId == PIPEB) && (driver_data->extend_rotation != VA_ROTATION_NONE) && 10340a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang (NULL == psb_surface)) { 10350a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang /*BZ:9432. rotate surface may not be ready, so we have to discard this frame.*/ 10360a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang psb__information_message("Android HDMI video mode: discard this frame if rotate surface hasn't be ready.\n"); 10375b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 10380a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang return 1; 10390a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang } 10402befccec034c13d34746a9e87149889d59ac767bFei Jiang width = (width <= 1920) ? width : 1920; 10412befccec034c13d34746a9e87149889d59ac767bFei Jiang 10427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* If dst width and height are less than 1/8th the src size, the 10437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * src/dst scale factor becomes larger than 8 and doesn't fit in 10447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the scale register. 10457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1046dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (src_w >= (drw_w * 8)) 1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = src_w / 7; 10487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (src_h >= (drw_h * 8)) 1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = src_h / 7; 10517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Clip */ 10537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang x1 = src_x; 10547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang x2 = src_x + src_w; 10557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang y1 = src_y; 10567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang y2 = src_y + src_h; 10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x1 = drw_x; 10597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x2 = drw_x + drw_w; 10607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y1 = drw_y; 10617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y2 = drw_y + drw_h; 10627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_CLIP_FUNC 10647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!i830_get_crtc(pScrn, &crtc, &dstBox)) 10657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return Success; 10667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 10687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *Update drw_* and 'clipBoxes' according to current downscale/upscale state 10697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Make sure the area determined by drw_* is in 'clipBoxes' 10707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 10717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 10727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang h_ratio = (float)pScrn->pScreen->height / pPriv->width_save; 10737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang v_ratio = (float)pScrn->pScreen->width / pPriv->height_save; 10747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang h_ratio = (float)pScrn->pScreen->width / pPriv->width_save; 10767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang v_ratio = (float)pScrn->pScreen->height / pPriv->height_save; 10777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Horizontal downscale/upscale */ 10807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((int)h_ratio) 10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.x1 /= h_ratio; 10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (!(int)h_ratio) 10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.x2 /= h_ratio; 10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Vertical downscale/upscale */ 10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((int)v_ratio) 10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.y1 /= v_ratio; 10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (!(int)v_ratio) 10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.y2 /= v_ratio; 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_x /= h_ratio; 10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_y /= v_ratio; 10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_w /= h_ratio; 10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h /= v_ratio; 10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x1 = drw_x; 10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x2 = drw_x + drw_w; 10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y1 = drw_y; 10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y2 = drw_y + drw_h; 11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Count in client supplied clipboxes */ 11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipRegion = clipBoxes; 11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_perform_clip(pScrn, vaPtr->clipbox, vaPtr->num_clipbox, clipBoxes, clipRegion, pDraw); 11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!i830_clip_video_helper(pScrn, 1106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &crtc, 1107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &dstBox, &x1, &x2, &y1, &y2, clipRegion, 1108437b3eda28a4bf098efa80598cab67f190275266Fei Jiang width, height)) { 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Fail to clip video to any crtc!\n", __FUNCTION__); 1110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (fourcc) { 1115affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 1116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = (width + 0x3) & ~0x3; 1117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pitch2 = psb_surface->stride; 11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 1119affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 1120affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 1121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = (width + 0x3) & ~0x3; 11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 11237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE 1124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case FOURCC_RGBA: 1125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = width << 2; 11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1128affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 1129affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 1131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = width << 1; 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang top = (y1) & ~1; 11362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang left = (x1) & ~1; 1137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left; 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fourcc == VA_FOURCC_NV12) { 1140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pre_add = psb_surface->buf.buffer_ofs; 1141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drm_buf = psb_surface->buf.drm_buf; 1142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gtt_ofs = wsbmBOOffsetHint(drm_buf) & 0x0FFFFFFF; 1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11440a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang /*skip pad bytes.*/ 1145605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang if (driver_data->local_rotation == VA_ROTATION_90) { 1146605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang left += ((src_w + 0xf) & ~0xf) - src_w; 1147605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang } else if (driver_data->local_rotation == VA_ROTATION_270) { 1148605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang top += ((src_h + 0xf) & ~0xf) - src_h; 1149605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang } else if (driver_data->local_rotation == VA_ROTATION_180) { 1150605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang left += ((src_w + 0xf) & ~0xf) - src_w; 1151605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang top += ((src_h + 0xf) & ~0xf) - src_h; 1152605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang } 1153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->YBuf0offset = pre_add + gtt_ofs + top * pitch2 + left; 1154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->YBuf1offset = pPriv->YBuf0offset; 1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->UBuf0offset = pre_add + gtt_ofs + (pitch2 * height) + top * (pitch2 / 2) + left; 1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->VBuf0offset = pPriv->UBuf0offset; 1157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->UBuf1offset = pPriv->UBuf0offset; 1158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->VBuf1offset = pPriv->UBuf0offset; 1159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else { 1160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //TBD 1161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //pPriv->YBuf0offset = pPriv->videoBuf0_gtt_offset << PAGE_SHIFT; 1162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //pPriv->YBuf1offset = pPriv->videoBuf1_gtt_offset << PAGE_SHIFT; 11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 1164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * width); 1165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * width / 2); 1166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * width); 1167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * width / 2); 11687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 1169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * height); 1170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * height / 2); 1171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * height); 1172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * height / 2); 11737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE 1177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fourcc == FOURCC_RGBA \ 117854752e65b02b1a84c491e3f9c964046faeea306eKun Wang || (fourcc == FOURCC_XVVA \ 117954752e65b02b1a84c491e3f9c964046faeea306eKun Wang && (pPriv->rotation != RR_Rotate_0) \ 118054752e65b02b1a84c491e3f9c964046faeea306eKun Wang && (vaPtr->dst_srf.fourcc == VA_FOURCC_RGBA))) 1181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang i830_display_video_sprite(pScrn, crtc, width, height, dstPitch, 1182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &dstBox, sprite_offset); 1183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang i830_display_video(ctx, pPriv, surface, fourcc, src_w, src_h, pitch2, pitch, 1186437b3eda28a4bf098efa80598cab67f190275266Fei Jiang x1, y1, x2, y2, &dstBox, src_w, src_h, 11872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drw_w, drw_h, flags, overlayId, pipeId); 1188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1189437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // FIXME : do I use two buffers here really? 1190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // pPriv->curBuf = (pPriv->curBuf + 1) & 1; 1191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return Success; 1193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11972befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic void psbPortPrivCreate(PsbPortPrivPtr pPriv) 1198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 1200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang REGION_NULL(pScreen, &pPriv->clip); 12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* coeffs defaut value */ 1204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Value = OV_BRIGHTNESS_DEFAULT_VALUE; 1205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Fraction = 0; 12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Value = OV_CONTRAST_DEFAULT_VALUE; 1208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Fraction = 0; 12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->hue.Value = OV_HUE_DEFAULT_VALUE; 1211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->hue.Fraction = 0; 12127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Value = OV_SATURATION_DEFAULT_VALUE; 1214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Fraction = 0; 12152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enabled = 0; 12162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enable_mask = 0; 12172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 0; 12182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 0; 12194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayA_pipeId = PIPEA; 12204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayC_pipeId = PIPEB; 1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* FIXME: is this right? set up to current screen size */ 1223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 1 1224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->width_save = 1024; 1225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->height_save = 600; 12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1229437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void 1230437b3eda28a4bf098efa80598cab67f190275266Fei JiangpsbPortPrivDestroy(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 12322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayA_enabled) 12332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830StopVideo(ctx); 1234437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnmap(pPriv->wsbo[0]); 12362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[0]); 12372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnmap(pPriv->wsbo[1]); 12382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[1]); 12392befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->is_mfld) { 1240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->p_iep_lite_context) 12412befccec034c13d34746a9e87149889d59ac767bFei Jiang free(pPriv->p_iep_lite_context); 12422befccec034c13d34746a9e87149889d59ac767bFei Jiang } 12432befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv->p_iep_lite_context = NULL; 1244437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1246437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic PsbPortPrivPtr 12472befccec034c13d34746a9e87149889d59ac767bFei JiangpsbSetupImageVideoOverlay(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 12502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayA = NULL; 12512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayC = NULL; 1252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 12532befccec034c13d34746a9e87149889d59ac767bFei Jiang psbPortPrivCreate(pPriv); 1254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* use green as color key by default for android media player */ 12574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->colorKey = driver_data->color_key/*0x0440*/; 1258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Value = -19; /* (255/219) * -16 */ 1259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Value = 75; /* 255/219 * 64 */ 1260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Value = 146; /* 128/112 * 128 */ 1261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma5 = 0xc0c0c0; 1262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma4 = 0x808080; 1263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma3 = 0x404040; 1264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma2 = 0x202020; 1265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma1 = 0x101010; 1266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma0 = 0x080808; 1267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->rotation = VA_ROTATION_NONE; 1269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->subpic_clear_flag = 1; 12707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* gotta uninit this someplace */ 1272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang REGION_NULL(pScreen, &pPriv->clip); 12737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* With LFP's we need to detect whether we're in One Line Mode, which 1276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * essentially means a resolution greater than 1024x768, and fix up 12772befccec034c13d34746a9e87149889d59ac767bFei Jiang * the scaler accordingly. 12782befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 1279437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->scaleRatio = 0x10000; 1280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->oneLineMode = FALSE; 1281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 2, 1283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &pPriv->wsbo[0], 64 * 1024, /* 64k alignment */ 128441051cf68a4a61406a5adcb9412cd83035eb8b0dFei Jiang WSBM_PL_FLAG_TT); 1285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 12862befccec034c13d34746a9e87149889d59ac767bFei Jiang goto out_err; 1287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmBOData(pPriv->wsbo[0], 12892befccec034c13d34746a9e87149889d59ac767bFei Jiang 5 * 4096, 1290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang NULL, NULL, 1291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang WSBM_PL_FLAG_TT); 1292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 12932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo0; 1294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->regmap[0] = wsbmBOMap(pPriv->wsbo[0], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE); 12962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!pPriv->regmap[0]) { 12972f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo0; 12982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmBOData(pPriv->wsbo[1], 13012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5 * 4096, 13022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang NULL, NULL, 13032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang WSBM_PL_FLAG_TT); 13042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (ret) 13052f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 13067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->regmap[1] = wsbmBOMap(pPriv->wsbo[1], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE); 13082f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!pPriv->regmap[1]) { 13092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 13102f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 13112befccec034c13d34746a9e87149889d59ac767bFei Jiang 13122f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 1313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 1314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13152befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->is_mfld) { 13162befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_black_mode.value = 1; 13172befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_white_mode.value = 3; 13182befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->blueStretch_gain.value = 200; 13192befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->skinColorCorrection_gain.value = 100; 1320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->hue.value = (5.25f * (1 << 25)); 1321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->saturation.value = (1.07f * (1 << 25)); 1322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->brightness.value = (-10.1f * (1 << 10)); 1323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->contrast.value = (0.99f * (1 << 25)); 13242befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13262befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err_bo1: 13292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[1]); 1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err_bo0: 13312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[0]); 13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err: 13342befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13372befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_init(VADriverContextP ctx) 13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 13402befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = &driver_data->coverlay_priv; 13413f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan struct drm_psb_register_rw_arg regs; 13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(pPriv, 0, sizeof(PsbPortPrivRec)); 13442befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv->is_mfld = IS_MFLD(driver_data); 13453f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan 13463f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan if (pPriv->is_mfld && driver_data->is_android) { 134754752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__information_message("Android ExtVideo: set PIPEB(HDMI)display plane on the bottom.\n"); 13485b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 13493f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan memset(®s, 0, sizeof(regs)); 135054752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_read_mask = REGRWBITS_DSPBCNTR; 135154752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 135254752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display.dspcntr_b |= DISPPLANE_BOTTOM; 135354752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_write_mask = REGRWBITS_DSPBCNTR; 13543f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 13553f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan } 13565b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 13572befccec034c13d34746a9e87149889d59ac767bFei Jiang psbSetupImageVideoOverlay(ctx, pPriv); 1358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830ResetVideo(ctx, pPriv); 13602befccec034c13d34746a9e87149889d59ac767bFei Jiang I830UpdateGamma(ctx, pPriv); 13612befccec034c13d34746a9e87149889d59ac767bFei Jiang 13622befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13652befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_stop(VADriverContextP ctx) 13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 13672befccec034c13d34746a9e87149889d59ac767bFei Jiang I830StopVideo(ctx); 13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13712befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_deinit(VADriverContextP ctx) 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1373437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 13742befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = &driver_data->coverlay_priv; 137554752e65b02b1a84c491e3f9c964046faeea306eKun Wang struct drm_psb_register_rw_arg regs; 137654752e65b02b1a84c491e3f9c964046faeea306eKun Wang 137754752e65b02b1a84c491e3f9c964046faeea306eKun Wang if (pPriv->is_mfld && driver_data->is_android) { 137854752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__information_message("Android ExtVideo: set PIPEB(HDMI)display plane normal.\n"); 137954752e65b02b1a84c491e3f9c964046faeea306eKun Wang 138054752e65b02b1a84c491e3f9c964046faeea306eKun Wang memset(®s, 0, sizeof(regs)); 138154752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_read_mask = REGRWBITS_DSPBCNTR; 138254752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 138354752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display.dspcntr_b &= ~DISPPLANE_BOTTOM; 138454752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_write_mask = REGRWBITS_DSPBCNTR; 138554752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 138654752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 1387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13882befccec034c13d34746a9e87149889d59ac767bFei Jiang psbPortPrivDestroy(ctx, pPriv); 13897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1393437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus psb_putsurface_overlay( 1394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 1395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 1396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 1397437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 1398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short srcw, 1399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short srch, 14002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang short destx, 1401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 1402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short destw, 1403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short desth, 14042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int flags, /* de-interlacing flags */ 1405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int overlayId, 14062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int pipeId 14072befccec034c13d34746a9e87149889d59ac767bFei Jiang) 14082befccec034c13d34746a9e87149889d59ac767bFei Jiang{ 1409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 1410437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 14114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((overlayId == OVERLAY_A) && (pPriv->overlayA_pipeId != pipeId)) { 14144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayA_pipeId = pipeId; 14154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830SwitchPipe(ctx, OVERLAY_A, pipeId); 14164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("OverlayA switch pipe to %d, stop overlayA first.\n", pipeId); 1417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if ((overlayId == OVERLAY_C) && (pPriv->overlayC_pipeId != pipeId)) { 14184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayC_pipeId = pipeId; 14194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830SwitchPipe(ctx, OVERLAY_C, pipeId); 14204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("OverlayC switch pipe to %d, stop overlayC first.\n", pipeId); 14214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 14222befccec034c13d34746a9e87149889d59ac767bFei Jiang I830PutImage(ctx, surface, srcx, srcy, srcw, srch, 14232befccec034c13d34746a9e87149889d59ac767bFei Jiang destx, desty, destw, desth, 14242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VA_FOURCC_NV12, flags, overlayId, pipeId); 1425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 14262befccec034c13d34746a9e87149889d59ac767bFei Jiang /* current surface is being displayed */ 1427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->cur_displaying_surface != VA_INVALID_SURFACE) 14282befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->last_displaying_surface = driver_data->cur_displaying_surface; 1429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_surface == NULL) { 1431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Invalid surface ID: 0x%08x\n", surface); 1432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_INVALID_SURFACE; 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14352befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface->display_timestamp = GetTickCount(); 1436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang driver_data->cur_displaying_surface = surface; 1437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14382befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 14397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1440